File: qwt__rect_8cpp-source.html

package info (click to toggle)
libqwt 4.2.0-4.1
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 9,832 kB
  • ctags: 5,512
  • sloc: cpp: 22,973; ansic: 244; makefile: 66
file content (206 lines) | stat: -rw-r--r-- 10,432 bytes parent folder | download | duplicates (5)
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&apos;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&nbsp;Page</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical&nbsp;List</a> | <a class="qindex" href="annotated.html">Class&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Class&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;Members</a> | <a class="qindex" href="pages.html">Related&nbsp;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 &lt;qpointarray.h&gt;</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 &amp;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>&amp; 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 &amp;pa, uint pos, <span class="keyword">const</span> QPoint &amp;point)
00079 {
00080     <span class="keywordflow">if</span> ( pa.size() &lt;= 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 &amp;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 &lt; 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 &amp;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() &gt; left();
00110         <span class="keywordflow">case</span> Top:
00111             <span class="keywordflow">return</span> p.y() &gt; top();
00112         <span class="keywordflow">case</span> Right:
00113             <span class="keywordflow">return</span> p.x() &lt; right();
00114         <span class="keywordflow">case</span> Bottom:
00115             <span class="keywordflow">return</span> p.y() &lt; 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 &amp;p1, 
00124     <span class="keyword">const</span> QPoint &amp;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 &amp;pa, QPointArray &amp;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 &lt; 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>