1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>Qwt User's Guide: qwt_rect.cpp Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.3.8 -->
<div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Class Members</a> | <a class="qindex" href="globals.html">File Members</a> | <a class="qindex" href="pages.html">Related Pages</a></div>
<h1>qwt_rect.cpp</h1><pre class="fragment"><div>00001 <span class="comment">/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************</span>
00002 <span class="comment"> * Qwt Widget Library</span>
00003 <span class="comment"> * Copyright (C) 1997 Josef Wilgen</span>
00004 <span class="comment"> * Copyright (C) 2002 Uwe Rathmann</span>
00005 <span class="comment"> * </span>
00006 <span class="comment"> * This library is free software; you can redistribute it and/or</span>
00007 <span class="comment"> * modify it under the terms of the Qwt License, Version 1.0</span>
00008 <span class="comment"> *****************************************************************************/</span>
00009
00010 <span class="preprocessor">#include <qpointarray.h></span>
00011 <span class="preprocessor">#include "qwt_rect.h"</span>
00012
00014
<a name="l00015"></a><a class="code" href="class_qwt_rect.html#a0">00015</a> <a class="code" href="class_qwt_rect.html#a0">QwtRect::QwtRect</a>():
00016 QRect()
00017 {
00018 }
00019
<a name="l00021"></a><a class="code" href="class_qwt_rect.html#a1">00021</a> <a class="code" href="class_qwt_rect.html#a0">QwtRect::QwtRect</a>(<span class="keyword">const</span> QRect &r):
00022 QRect(r)
00023 {
00024 }
00025
00026 QRect QwtRect::cutTop(<span class="keywordtype">int</span> h, <span class="keywordtype">int</span> distTop, <span class="keywordtype">int</span> distBottom)
00027 {
00028 QRect rv;
00029 rv.setTop(top() + distTop);
00030 rv.setHeight(h);
00031 setTop(rv.bottom() + distBottom + 1);
00032 rv.setLeft(left());
00033 rv.setRight(right());
00034 <span class="keywordflow">return</span> rv;
00035 }
00036
00037 QRect QwtRect::cutBottom(<span class="keywordtype">int</span> h, <span class="keywordtype">int</span> distTop, <span class="keywordtype">int</span> distBottom)
00038 {
00039 QRect rv;
00040 setBottom(bottom() - h - distBottom - distTop);
00041 rv.setTop(bottom() + 1 + distTop);
00042 rv.setHeight(h);
00043 rv.setLeft(left());
00044 rv.setRight(right());
00045 <span class="keywordflow">return</span> rv;
00046 }
00047
00048 QRect QwtRect::cutLeft(<span class="keywordtype">int</span> w, <span class="keywordtype">int</span> distLeft, <span class="keywordtype">int</span> distRight)
00049 {
00050 QRect rv;
00051 rv.setLeft(left() + distLeft);
00052 rv.setWidth(w);
00053 setLeft(rv.right() + distRight + 1);
00054 rv.setTop(top());
00055 rv.setBottom(bottom());
00056 <span class="keywordflow">return</span> rv;
00057 }
00058
00059 QRect QwtRect::cutRight(<span class="keywordtype">int</span> w, <span class="keywordtype">int</span> distLeft, <span class="keywordtype">int</span> distRight)
00060 {
00061 QRect rv;
00062 setRight(right() - w - distRight - distLeft);
00063 rv.setLeft(right() + 1 + distLeft);
00064 rv.setWidth(w);
00065 rv.setTop(top());
00066 rv.setBottom(bottom());
00067 <span class="keywordflow">return</span> rv;
00068 }
00069
00070 <span class="keyword">const</span> <a class="code" href="class_qwt_rect.html">QwtRect</a>& QwtRect::cutMargin(<span class="keywordtype">int</span> mLeft, <span class="keywordtype">int</span> mRight, <span class="keywordtype">int</span> mTop, <span class="keywordtype">int</span> mBottom)
00071 {
00072 setHeight(height() - mTop - mBottom);
00073 setWidth(width() - mLeft - mRight);
00074 moveBy(mLeft, mTop);
00075 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
00076 }
00077
00078 <span class="keyword">inline</span> <span class="keywordtype">void</span> addPoint(QPointArray &pa, uint pos, <span class="keyword">const</span> QPoint &point)
00079 {
00080 <span class="keywordflow">if</span> ( pa.size() <= pos )
00081 pa.resize(pos + 5);
00082
00083 pa.setPoint(pos, point);
00084 }
00085
00087
<a name="l00088"></a><a class="code" href="class_qwt_rect.html#a7">00088</a> QPointArray <a class="code" href="class_qwt_rect.html#a7">QwtRect::clip</a>(<span class="keyword">const</span> QPointArray &pa)<span class="keyword"> const</span>
00089 <span class="keyword"></span>{
00090 <span class="keywordflow">if</span> ( contains( pa.boundingRect() ) )
00091 <span class="keywordflow">return</span> pa;
00092
00093 QPointArray cpa(pa.size());
00094
00095 <span class="keywordflow">for</span> ( uint edge = 0; edge < NEdges; edge++ )
00096 {
00097 <span class="keyword">const</span> QPointArray rpa = (edge == 0) ? pa : cpa.copy();
00098 clipEdge((Edge)edge, rpa, cpa);
00099 }
00100
00101 <span class="keywordflow">return</span> cpa;
00102 }
00103
00104 <span class="keywordtype">bool</span> QwtRect::insideEdge(<span class="keyword">const</span> QPoint &p, Edge edge)<span class="keyword"> const</span>
00105 <span class="keyword"></span>{
00106 <span class="keywordflow">switch</span>(edge)
00107 {
00108 <span class="keywordflow">case</span> Left:
00109 <span class="keywordflow">return</span> p.x() > left();
00110 <span class="keywordflow">case</span> Top:
00111 <span class="keywordflow">return</span> p.y() > top();
00112 <span class="keywordflow">case</span> Right:
00113 <span class="keywordflow">return</span> p.x() < right();
00114 <span class="keywordflow">case</span> Bottom:
00115 <span class="keywordflow">return</span> p.y() < bottom();
00116 <span class="keywordflow">default</span>:
00117 <span class="keywordflow">break</span>;
00118 }
00119
00120 <span class="keywordflow">return</span> FALSE;
00121 }
00122
00123 QPoint QwtRect::intersectEdge(<span class="keyword">const</span> QPoint &p1,
00124 <span class="keyword">const</span> QPoint &p2, Edge edge )<span class="keyword"> const</span>
00125 <span class="keyword"></span>{
00126 <span class="keywordtype">int</span> x=0, y=0;
00127 <span class="keywordtype">double</span> m = 0;
00128
00129 <span class="keyword">const</span> <span class="keywordtype">double</span> dy = p2.y() - p1.y();
00130 <span class="keyword">const</span> <span class="keywordtype">double</span> dx = p2.x() - p1.x();
00131
00132 <span class="keywordflow">switch</span> ( edge )
00133 {
00134 <span class="keywordflow">case</span> Left:
00135 x = left();
00136 m = double(QABS(p1.x() - x)) / QABS(dx);
00137 y = p1.y() + int(dy * m);
00138 <span class="keywordflow">break</span>;
00139 <span class="keywordflow">case</span> Top:
00140 y = top();
00141 m = double(QABS(p1.y() - y)) / QABS(dy);
00142 x = p1.x() + int(dx * m);
00143 <span class="keywordflow">break</span>;
00144 <span class="keywordflow">case</span> Right:
00145 x = right();
00146 m = double(QABS(p1.x() - x)) / QABS(dx);
00147 y = p1.y() + int(dy * m);
00148 <span class="keywordflow">break</span>;
00149 <span class="keywordflow">case</span> Bottom:
00150 y = bottom();
00151 m = double(QABS(p1.y() - y)) / QABS(dy);
00152 x = p1.x() + int(dx * m);
00153 <span class="keywordflow">break</span>;
00154 <span class="keywordflow">default</span>:
00155 <span class="keywordflow">break</span>;
00156 }
00157
00158 <span class="keywordflow">return</span> QPoint(x,y);
00159 }
00160
00161 <span class="keywordtype">void</span> QwtRect::clipEdge(Edge edge, <span class="keyword">const</span> QPointArray &pa, QPointArray &cpa)<span class="keyword"> const</span>
00162 <span class="keyword"></span>{
00163 <span class="keywordflow">if</span> ( pa.count() == 0 )
00164 {
00165 cpa.resize(0);
00166 <span class="keywordflow">return</span>;
00167 }
00168
00169 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count = 0;
00170
00171 QPoint p1 = pa.point(0);
00172 <span class="keywordflow">if</span> ( insideEdge(p1, edge) )
00173 addPoint(cpa, count++, p1);
00174
00175 <span class="keyword">const</span> uint nPoints = pa.size();
00176 <span class="keywordflow">for</span> ( uint i = 1; i < nPoints; i++ )
00177 {
00178 <span class="keyword">const</span> QPoint p2 = pa.point(i);
00179 <span class="keywordflow">if</span> ( insideEdge(p2, edge) )
00180 {
00181 <span class="keywordflow">if</span> ( insideEdge(p1, edge) )
00182 addPoint(cpa, count++, p2);
00183 <span class="keywordflow">else</span>
00184 {
00185 addPoint(cpa, count++, intersectEdge(p1, p2, edge));
00186 addPoint(cpa, count++, p2);
00187 }
00188 }
00189 <span class="keywordflow">else</span>
00190 {
00191 <span class="keywordflow">if</span> ( insideEdge(p1, edge) )
00192 addPoint(cpa, count++, intersectEdge(p1, p2, edge));
00193 }
00194 p1 = p2;
00195 }
00196 cpa.resize(count);
00197 }
</div></pre><hr size="1"><address style="align: right;"><small>Generated on Tue Nov 16 21:12:21 2004 for Qwt User's Guide by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border=0 ></a> 1.3.8 </small></address>
</body>
</html>
|