Absolute File Name: | /home/qt/qt5_coco/qt5/qtbase/src/corelib/tools/qline.cpp |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /**************************************************************************** | - | ||||||||||||
2 | ** | - | ||||||||||||
3 | ** Copyright (C) 2016 The Qt Company Ltd. | - | ||||||||||||
4 | ** Contact: https://www.qt.io/licensing/ | - | ||||||||||||
5 | ** | - | ||||||||||||
6 | ** This file is part of the QtCore module of the Qt Toolkit. | - | ||||||||||||
7 | ** | - | ||||||||||||
8 | ** $QT_BEGIN_LICENSE:LGPL$ | - | ||||||||||||
9 | ** Commercial License Usage | - | ||||||||||||
10 | ** Licensees holding valid commercial Qt licenses may use this file in | - | ||||||||||||
11 | ** accordance with the commercial license agreement provided with the | - | ||||||||||||
12 | ** Software or, alternatively, in accordance with the terms contained in | - | ||||||||||||
13 | ** a written agreement between you and The Qt Company. For licensing terms | - | ||||||||||||
14 | ** and conditions see https://www.qt.io/terms-conditions. For further | - | ||||||||||||
15 | ** information use the contact form at https://www.qt.io/contact-us. | - | ||||||||||||
16 | ** | - | ||||||||||||
17 | ** GNU Lesser General Public License Usage | - | ||||||||||||
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | - | ||||||||||||
19 | ** General Public License version 3 as published by the Free Software | - | ||||||||||||
20 | ** Foundation and appearing in the file LICENSE.LGPL3 included in the | - | ||||||||||||
21 | ** packaging of this file. Please review the following information to | - | ||||||||||||
22 | ** ensure the GNU Lesser General Public License version 3 requirements | - | ||||||||||||
23 | ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. | - | ||||||||||||
24 | ** | - | ||||||||||||
25 | ** GNU General Public License Usage | - | ||||||||||||
26 | ** Alternatively, this file may be used under the terms of the GNU | - | ||||||||||||
27 | ** General Public License version 2.0 or (at your option) the GNU General | - | ||||||||||||
28 | ** Public license version 3 or any later version approved by the KDE Free | - | ||||||||||||
29 | ** Qt Foundation. The licenses are as published by the Free Software | - | ||||||||||||
30 | ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 | - | ||||||||||||
31 | ** included in the packaging of this file. Please review the following | - | ||||||||||||
32 | ** information to ensure the GNU General Public License requirements will | - | ||||||||||||
33 | ** be met: https://www.gnu.org/licenses/gpl-2.0.html and | - | ||||||||||||
34 | ** https://www.gnu.org/licenses/gpl-3.0.html. | - | ||||||||||||
35 | ** | - | ||||||||||||
36 | ** $QT_END_LICENSE$ | - | ||||||||||||
37 | ** | - | ||||||||||||
38 | ****************************************************************************/ | - | ||||||||||||
39 | - | |||||||||||||
40 | #include "qline.h" | - | ||||||||||||
41 | #include "qdebug.h" | - | ||||||||||||
42 | #include "qdatastream.h" | - | ||||||||||||
43 | #include "qmath.h" | - | ||||||||||||
44 | #include <private/qnumeric_p.h> | - | ||||||||||||
45 | - | |||||||||||||
46 | QT_BEGIN_NAMESPACE | - | ||||||||||||
47 | - | |||||||||||||
48 | /*! | - | ||||||||||||
49 | \class QLine | - | ||||||||||||
50 | \inmodule QtCore | - | ||||||||||||
51 | \ingroup painting | - | ||||||||||||
52 | - | |||||||||||||
53 | \brief The QLine class provides a two-dimensional vector using | - | ||||||||||||
54 | integer precision. | - | ||||||||||||
55 | - | |||||||||||||
56 | A QLine describes a finite length line (or a line segment) on a | - | ||||||||||||
57 | two-dimensional surface. The start and end points of the line are | - | ||||||||||||
58 | specified using integer point accuracy for coordinates. Use the | - | ||||||||||||
59 | QLineF constructor to retrieve a floating point copy. | - | ||||||||||||
60 | - | |||||||||||||
61 | \table | - | ||||||||||||
62 | \row | - | ||||||||||||
63 | \li \inlineimage qline-point.png | - | ||||||||||||
64 | \li \inlineimage qline-coordinates.png | - | ||||||||||||
65 | \endtable | - | ||||||||||||
66 | - | |||||||||||||
67 | The positions of the line's start and end points can be retrieved | - | ||||||||||||
68 | using the p1(), x1(), y1(), p2(), x2(), and y2() functions. The | - | ||||||||||||
69 | dx() and dy() functions return the horizontal and vertical | - | ||||||||||||
70 | components of the line. Use isNull() to determine whether the | - | ||||||||||||
71 | QLine represents a valid line or a null line. | - | ||||||||||||
72 | - | |||||||||||||
73 | Finally, the line can be translated a given offset using the | - | ||||||||||||
74 | translate() function. | - | ||||||||||||
75 | - | |||||||||||||
76 | \sa QLineF, QPolygon, QRect | - | ||||||||||||
77 | */ | - | ||||||||||||
78 | - | |||||||||||||
79 | /*! | - | ||||||||||||
80 | \fn QLine::QLine() | - | ||||||||||||
81 | - | |||||||||||||
82 | Constructs a null line. | - | ||||||||||||
83 | */ | - | ||||||||||||
84 | - | |||||||||||||
85 | /*! | - | ||||||||||||
86 | \fn QLine::QLine(const QPoint &p1, const QPoint &p2) | - | ||||||||||||
87 | - | |||||||||||||
88 | Constructs a line object that represents the line between \a p1 and | - | ||||||||||||
89 | \a p2. | - | ||||||||||||
90 | */ | - | ||||||||||||
91 | - | |||||||||||||
92 | /*! | - | ||||||||||||
93 | \fn QLine::QLine(int x1, int y1, int x2, int y2) | - | ||||||||||||
94 | - | |||||||||||||
95 | Constructs a line object that represents the line between (\a x1, \a y1) and | - | ||||||||||||
96 | (\a x2, \a y2). | - | ||||||||||||
97 | */ | - | ||||||||||||
98 | - | |||||||||||||
99 | /*! | - | ||||||||||||
100 | \fn bool QLine::isNull() const | - | ||||||||||||
101 | - | |||||||||||||
102 | Returns \c true if the line is not set up with valid start and end point; | - | ||||||||||||
103 | otherwise returns \c false. | - | ||||||||||||
104 | */ | - | ||||||||||||
105 | - | |||||||||||||
106 | /*! | - | ||||||||||||
107 | \fn QPoint QLine::p1() const | - | ||||||||||||
108 | - | |||||||||||||
109 | Returns the line's start point. | - | ||||||||||||
110 | - | |||||||||||||
111 | \sa x1(), y1(), p2() | - | ||||||||||||
112 | */ | - | ||||||||||||
113 | - | |||||||||||||
114 | /*! | - | ||||||||||||
115 | \fn QPoint QLine::p2() const | - | ||||||||||||
116 | - | |||||||||||||
117 | Returns the line's end point. | - | ||||||||||||
118 | - | |||||||||||||
119 | \sa x2(), y2(), p1() | - | ||||||||||||
120 | */ | - | ||||||||||||
121 | - | |||||||||||||
122 | /*! | - | ||||||||||||
123 | \fn int QLine::x1() const | - | ||||||||||||
124 | - | |||||||||||||
125 | Returns the x-coordinate of the line's start point. | - | ||||||||||||
126 | - | |||||||||||||
127 | \sa p1() | - | ||||||||||||
128 | */ | - | ||||||||||||
129 | - | |||||||||||||
130 | /*! | - | ||||||||||||
131 | \fn int QLine::y1() const | - | ||||||||||||
132 | - | |||||||||||||
133 | Returns the y-coordinate of the line's start point. | - | ||||||||||||
134 | - | |||||||||||||
135 | \sa p1() | - | ||||||||||||
136 | */ | - | ||||||||||||
137 | - | |||||||||||||
138 | /*! | - | ||||||||||||
139 | \fn int QLine::x2() const | - | ||||||||||||
140 | - | |||||||||||||
141 | Returns the x-coordinate of the line's end point. | - | ||||||||||||
142 | - | |||||||||||||
143 | \sa p2() | - | ||||||||||||
144 | */ | - | ||||||||||||
145 | - | |||||||||||||
146 | /*! | - | ||||||||||||
147 | \fn int QLine::y2() const | - | ||||||||||||
148 | - | |||||||||||||
149 | Returns the y-coordinate of the line's end point. | - | ||||||||||||
150 | - | |||||||||||||
151 | \sa p2() | - | ||||||||||||
152 | */ | - | ||||||||||||
153 | - | |||||||||||||
154 | /*! | - | ||||||||||||
155 | \fn int QLine::dx() const | - | ||||||||||||
156 | - | |||||||||||||
157 | Returns the horizontal component of the line's vector. | - | ||||||||||||
158 | - | |||||||||||||
159 | \sa dy() | - | ||||||||||||
160 | */ | - | ||||||||||||
161 | - | |||||||||||||
162 | /*! | - | ||||||||||||
163 | \fn int QLine::dy() const | - | ||||||||||||
164 | - | |||||||||||||
165 | Returns the vertical component of the line's vector. | - | ||||||||||||
166 | - | |||||||||||||
167 | \sa dx() | - | ||||||||||||
168 | */ | - | ||||||||||||
169 | - | |||||||||||||
170 | /*! | - | ||||||||||||
171 | \fn bool QLine::operator!=(const QLine &line) const | - | ||||||||||||
172 | - | |||||||||||||
173 | Returns \c true if the given \a line is not the same as \e this line. | - | ||||||||||||
174 | - | |||||||||||||
175 | A line is different from another line if any of their start or | - | ||||||||||||
176 | end points differ, or the internal order of the points is different. | - | ||||||||||||
177 | */ | - | ||||||||||||
178 | - | |||||||||||||
179 | /*! | - | ||||||||||||
180 | \fn bool QLine::operator==(const QLine &line) const | - | ||||||||||||
181 | - | |||||||||||||
182 | Returns \c true if the given \a line is the same as \e this line. | - | ||||||||||||
183 | - | |||||||||||||
184 | A line is identical to another line if the start and end points | - | ||||||||||||
185 | are identical, and the internal order of the points is the same. | - | ||||||||||||
186 | */ | - | ||||||||||||
187 | - | |||||||||||||
188 | /*! | - | ||||||||||||
189 | \fn void QLine::translate(const QPoint &offset) | - | ||||||||||||
190 | - | |||||||||||||
191 | Translates this line by the given \a offset. | - | ||||||||||||
192 | */ | - | ||||||||||||
193 | - | |||||||||||||
194 | /*! | - | ||||||||||||
195 | \fn void QLine::translate(int dx, int dy) | - | ||||||||||||
196 | \overload | - | ||||||||||||
197 | - | |||||||||||||
198 | Translates this line the distance specified by \a dx and \a dy. | - | ||||||||||||
199 | */ | - | ||||||||||||
200 | - | |||||||||||||
201 | /*! | - | ||||||||||||
202 | \fn QLine QLine::translated(const QPoint &offset) const | - | ||||||||||||
203 | - | |||||||||||||
204 | \since 4.4 | - | ||||||||||||
205 | - | |||||||||||||
206 | Returns this line translated by the given \a offset. | - | ||||||||||||
207 | */ | - | ||||||||||||
208 | - | |||||||||||||
209 | /*! | - | ||||||||||||
210 | \fn QLine QLine::translated(int dx, int dy) const | - | ||||||||||||
211 | \overload | - | ||||||||||||
212 | \since 4.4 | - | ||||||||||||
213 | - | |||||||||||||
214 | Returns this line translated the distance specified by \a dx and \a dy. | - | ||||||||||||
215 | */ | - | ||||||||||||
216 | - | |||||||||||||
217 | - | |||||||||||||
218 | /*! | - | ||||||||||||
219 | \fn void QLine::setP1(const QPoint &p1) | - | ||||||||||||
220 | \since 4.4 | - | ||||||||||||
221 | - | |||||||||||||
222 | Sets the starting point of this line to \a p1. | - | ||||||||||||
223 | - | |||||||||||||
224 | \sa setP2(), p1() | - | ||||||||||||
225 | */ | - | ||||||||||||
226 | - | |||||||||||||
227 | - | |||||||||||||
228 | /*! | - | ||||||||||||
229 | \fn void QLine::setP2(const QPoint &p2) | - | ||||||||||||
230 | \since 4.4 | - | ||||||||||||
231 | - | |||||||||||||
232 | Sets the end point of this line to \a p2. | - | ||||||||||||
233 | - | |||||||||||||
234 | \sa setP1(), p2() | - | ||||||||||||
235 | */ | - | ||||||||||||
236 | - | |||||||||||||
237 | - | |||||||||||||
238 | /*! | - | ||||||||||||
239 | \fn void QLine::setPoints(const QPoint &p1, const QPoint &p2) | - | ||||||||||||
240 | \since 4.4 | - | ||||||||||||
241 | - | |||||||||||||
242 | Sets the start point of this line to \a p1 and the end point of this line to \a p2. | - | ||||||||||||
243 | - | |||||||||||||
244 | \sa setP1(), setP2(), p1(), p2() | - | ||||||||||||
245 | */ | - | ||||||||||||
246 | - | |||||||||||||
247 | - | |||||||||||||
248 | /*! | - | ||||||||||||
249 | \fn void QLine::setLine(int x1, int y1, int x2, int y2) | - | ||||||||||||
250 | \since 4.4 | - | ||||||||||||
251 | - | |||||||||||||
252 | Sets this line to the start in \a x1, \a y1 and end in \a x2, \a y2. | - | ||||||||||||
253 | - | |||||||||||||
254 | \sa setP1(), setP2(), p1(), p2() | - | ||||||||||||
255 | */ | - | ||||||||||||
256 | - | |||||||||||||
257 | - | |||||||||||||
258 | - | |||||||||||||
259 | #ifndef QT_NO_DEBUG_STREAM | - | ||||||||||||
260 | QDebug operator<<(QDebug dbg, const QLine &p) | - | ||||||||||||
261 | { | - | ||||||||||||
262 | QDebugStateSaver saver(dbg); | - | ||||||||||||
263 | dbg.nospace() << "QLine(" << p.p1() << ',' << p.p2() << ')'; | - | ||||||||||||
264 | return dbg; executed 2 times by 2 tests: return dbg; Executed by:
| 2 | ||||||||||||
265 | } | - | ||||||||||||
266 | #endif | - | ||||||||||||
267 | - | |||||||||||||
268 | #ifndef QT_NO_DATASTREAM | - | ||||||||||||
269 | /*! | - | ||||||||||||
270 | \relates QLine | - | ||||||||||||
271 | - | |||||||||||||
272 | Writes the given \a line to the given \a stream and returns a | - | ||||||||||||
273 | reference to the stream. | - | ||||||||||||
274 | - | |||||||||||||
275 | \sa {Serializing Qt Data Types} | - | ||||||||||||
276 | */ | - | ||||||||||||
277 | - | |||||||||||||
278 | QDataStream &operator<<(QDataStream &stream, const QLine &line) | - | ||||||||||||
279 | { | - | ||||||||||||
280 | stream << line.p1() << line.p2(); | - | ||||||||||||
281 | return stream; executed 3 times by 2 tests: return stream; Executed by:
| 3 | ||||||||||||
282 | } | - | ||||||||||||
283 | - | |||||||||||||
284 | /*! | - | ||||||||||||
285 | \relates QLine | - | ||||||||||||
286 | - | |||||||||||||
287 | Reads a line from the given \a stream into the given \a line and | - | ||||||||||||
288 | returns a reference to the stream. | - | ||||||||||||
289 | - | |||||||||||||
290 | \sa {Serializing Qt Data Types} | - | ||||||||||||
291 | */ | - | ||||||||||||
292 | - | |||||||||||||
293 | QDataStream &operator>>(QDataStream &stream, QLine &line) | - | ||||||||||||
294 | { | - | ||||||||||||
295 | QPoint p1, p2; | - | ||||||||||||
296 | stream >> p1; | - | ||||||||||||
297 | stream >> p2; | - | ||||||||||||
298 | line = QLine(p1, p2); | - | ||||||||||||
299 | - | |||||||||||||
300 | return stream; executed 7 times by 2 tests: return stream; Executed by:
| 7 | ||||||||||||
301 | } | - | ||||||||||||
302 | - | |||||||||||||
303 | #endif // QT_NO_DATASTREAM | - | ||||||||||||
304 | - | |||||||||||||
305 | - | |||||||||||||
306 | #ifndef M_2PI | - | ||||||||||||
307 | #define M_2PI 6.28318530717958647692528676655900576 | - | ||||||||||||
308 | #endif | - | ||||||||||||
309 | - | |||||||||||||
310 | /*! | - | ||||||||||||
311 | \class QLineF | - | ||||||||||||
312 | \inmodule QtCore | - | ||||||||||||
313 | \ingroup painting | - | ||||||||||||
314 | - | |||||||||||||
315 | \brief The QLineF class provides a two-dimensional vector using | - | ||||||||||||
316 | floating point precision. | - | ||||||||||||
317 | - | |||||||||||||
318 | A QLineF describes a finite length line (or line segment) on a | - | ||||||||||||
319 | two-dimensional surface. QLineF defines the start and end points | - | ||||||||||||
320 | of the line using floating point accuracy for coordinates. Use | - | ||||||||||||
321 | the toLine() function to retrieve an integer based copy of this | - | ||||||||||||
322 | line. | - | ||||||||||||
323 | - | |||||||||||||
324 | \table | - | ||||||||||||
325 | \row | - | ||||||||||||
326 | \li \inlineimage qline-point.png | - | ||||||||||||
327 | \li \inlineimage qline-coordinates.png | - | ||||||||||||
328 | \endtable | - | ||||||||||||
329 | - | |||||||||||||
330 | The positions of the line's start and end points can be retrieved | - | ||||||||||||
331 | using the p1(), x1(), y1(), p2(), x2(), and y2() functions. The | - | ||||||||||||
332 | dx() and dy() functions return the horizontal and vertical | - | ||||||||||||
333 | components of the line, respectively. | - | ||||||||||||
334 | - | |||||||||||||
335 | The line's length can be retrieved using the length() function, | - | ||||||||||||
336 | and altered using the setLength() function. Similarly, angle() | - | ||||||||||||
337 | and setAngle() are respectively used for retrieving and altering | - | ||||||||||||
338 | the angle of the line. Use the isNull() | - | ||||||||||||
339 | function to determine whether the QLineF represents a valid line | - | ||||||||||||
340 | or a null line. | - | ||||||||||||
341 | - | |||||||||||||
342 | The intersect() function determines the IntersectType for this | - | ||||||||||||
343 | line and a given line, while the angleTo() function returns the | - | ||||||||||||
344 | angle between the lines. In addition, the unitVector() function | - | ||||||||||||
345 | returns a line that has the same starting point as this line, but | - | ||||||||||||
346 | with a length of only 1, while the normalVector() function returns | - | ||||||||||||
347 | a line that is perpendicular to this line with the same starting | - | ||||||||||||
348 | point and length. | - | ||||||||||||
349 | - | |||||||||||||
350 | Finally, the line can be translated a given offset using the | - | ||||||||||||
351 | translate() function, and can be traversed using the pointAt() | - | ||||||||||||
352 | function. | - | ||||||||||||
353 | - | |||||||||||||
354 | \sa QLine, QPolygonF, QRectF | - | ||||||||||||
355 | */ | - | ||||||||||||
356 | - | |||||||||||||
357 | /*! | - | ||||||||||||
358 | \enum QLineF::IntersectType | - | ||||||||||||
359 | - | |||||||||||||
360 | Describes the intersection between two lines. | - | ||||||||||||
361 | - | |||||||||||||
362 | \table | - | ||||||||||||
363 | \row | - | ||||||||||||
364 | \li \inlineimage qlinef-unbounded.png | - | ||||||||||||
365 | \li \inlineimage qlinef-bounded.png | - | ||||||||||||
366 | \row | - | ||||||||||||
367 | \li QLineF::UnboundedIntersection | - | ||||||||||||
368 | \li QLineF::BoundedIntersection | - | ||||||||||||
369 | \endtable | - | ||||||||||||
370 | - | |||||||||||||
371 | \value NoIntersection Indicates that the lines do not intersect; | - | ||||||||||||
372 | i.e. they are parallel. | - | ||||||||||||
373 | - | |||||||||||||
374 | \value UnboundedIntersection The two lines intersect, but not | - | ||||||||||||
375 | within the range defined by their lengths. This will be the case | - | ||||||||||||
376 | if the lines are not parallel. | - | ||||||||||||
377 | - | |||||||||||||
378 | intersect() will also return this value if the intersect point is | - | ||||||||||||
379 | within the start and end point of only one of the lines. | - | ||||||||||||
380 | - | |||||||||||||
381 | \value BoundedIntersection The two lines intersect with each other | - | ||||||||||||
382 | within the start and end points of each line. | - | ||||||||||||
383 | - | |||||||||||||
384 | \sa intersect() | - | ||||||||||||
385 | */ | - | ||||||||||||
386 | - | |||||||||||||
387 | /*! | - | ||||||||||||
388 | \fn QLineF::QLineF() | - | ||||||||||||
389 | - | |||||||||||||
390 | Constructs a null line. | - | ||||||||||||
391 | */ | - | ||||||||||||
392 | - | |||||||||||||
393 | /*! | - | ||||||||||||
394 | \fn QLineF::QLineF(const QPointF &p1, const QPointF &p2) | - | ||||||||||||
395 | - | |||||||||||||
396 | Constructs a line object that represents the line between \a p1 and | - | ||||||||||||
397 | \a p2. | - | ||||||||||||
398 | */ | - | ||||||||||||
399 | - | |||||||||||||
400 | /*! | - | ||||||||||||
401 | \fn QLineF::QLineF(qreal x1, qreal y1, qreal x2, qreal y2) | - | ||||||||||||
402 | - | |||||||||||||
403 | Constructs a line object that represents the line between (\a x1, \a y1) and | - | ||||||||||||
404 | (\a x2, \a y2). | - | ||||||||||||
405 | */ | - | ||||||||||||
406 | - | |||||||||||||
407 | /*! | - | ||||||||||||
408 | \fn QLineF::QLineF(const QLine &line) | - | ||||||||||||
409 | - | |||||||||||||
410 | Construct a QLineF object from the given integer-based \a line. | - | ||||||||||||
411 | - | |||||||||||||
412 | \sa toLine() | - | ||||||||||||
413 | */ | - | ||||||||||||
414 | - | |||||||||||||
415 | /*! | - | ||||||||||||
416 | \fn bool QLineF::isNull() const | - | ||||||||||||
417 | - | |||||||||||||
418 | Returns \c true if the line is not set up with valid start and end point; | - | ||||||||||||
419 | otherwise returns \c false. | - | ||||||||||||
420 | */ | - | ||||||||||||
421 | - | |||||||||||||
422 | /*! | - | ||||||||||||
423 | \fn QPointF QLineF::p1() const | - | ||||||||||||
424 | - | |||||||||||||
425 | Returns the line's start point. | - | ||||||||||||
426 | - | |||||||||||||
427 | \sa x1(), y1(), p2() | - | ||||||||||||
428 | */ | - | ||||||||||||
429 | - | |||||||||||||
430 | /*! | - | ||||||||||||
431 | \fn QPointF QLineF::p2() const | - | ||||||||||||
432 | - | |||||||||||||
433 | Returns the line's end point. | - | ||||||||||||
434 | - | |||||||||||||
435 | \sa x2(), y2(), p1() | - | ||||||||||||
436 | */ | - | ||||||||||||
437 | - | |||||||||||||
438 | /*! | - | ||||||||||||
439 | \fn QLine QLineF::toLine() const | - | ||||||||||||
440 | - | |||||||||||||
441 | Returns an integer based copy of this line. | - | ||||||||||||
442 | - | |||||||||||||
443 | Note that the returned line's start and end points are rounded to | - | ||||||||||||
444 | the nearest integer. | - | ||||||||||||
445 | - | |||||||||||||
446 | \sa QLineF() | - | ||||||||||||
447 | */ | - | ||||||||||||
448 | /*! | - | ||||||||||||
449 | \fn qreal QLineF::x1() const | - | ||||||||||||
450 | - | |||||||||||||
451 | Returns the x-coordinate of the line's start point. | - | ||||||||||||
452 | - | |||||||||||||
453 | \sa p1() | - | ||||||||||||
454 | */ | - | ||||||||||||
455 | - | |||||||||||||
456 | /*! | - | ||||||||||||
457 | \fn qreal QLineF::y1() const | - | ||||||||||||
458 | - | |||||||||||||
459 | Returns the y-coordinate of the line's start point. | - | ||||||||||||
460 | - | |||||||||||||
461 | \sa p1() | - | ||||||||||||
462 | */ | - | ||||||||||||
463 | - | |||||||||||||
464 | /*! | - | ||||||||||||
465 | \fn qreal QLineF::x2() const | - | ||||||||||||
466 | - | |||||||||||||
467 | Returns the x-coordinate of the line's end point. | - | ||||||||||||
468 | - | |||||||||||||
469 | \sa p2() | - | ||||||||||||
470 | */ | - | ||||||||||||
471 | - | |||||||||||||
472 | /*! | - | ||||||||||||
473 | \fn qreal QLineF::y2() const | - | ||||||||||||
474 | - | |||||||||||||
475 | Returns the y-coordinate of the line's end point. | - | ||||||||||||
476 | - | |||||||||||||
477 | \sa p2() | - | ||||||||||||
478 | */ | - | ||||||||||||
479 | - | |||||||||||||
480 | /*! | - | ||||||||||||
481 | \fn qreal QLineF::dx() const | - | ||||||||||||
482 | - | |||||||||||||
483 | Returns the horizontal component of the line's vector. | - | ||||||||||||
484 | - | |||||||||||||
485 | \sa dy(), pointAt() | - | ||||||||||||
486 | */ | - | ||||||||||||
487 | - | |||||||||||||
488 | /*! | - | ||||||||||||
489 | \fn qreal QLineF::dy() const | - | ||||||||||||
490 | - | |||||||||||||
491 | Returns the vertical component of the line's vector. | - | ||||||||||||
492 | - | |||||||||||||
493 | \sa dx(), pointAt() | - | ||||||||||||
494 | */ | - | ||||||||||||
495 | - | |||||||||||||
496 | /*! | - | ||||||||||||
497 | \fn QLineF::setLength(qreal length) | - | ||||||||||||
498 | - | |||||||||||||
499 | Sets the length of the line to the given \a length. QLineF will | - | ||||||||||||
500 | move the end point - p2() - of the line to give the line its new length. | - | ||||||||||||
501 | - | |||||||||||||
502 | If the line is a null line, the length will remain zero regardless | - | ||||||||||||
503 | of the length specified. | - | ||||||||||||
504 | - | |||||||||||||
505 | \sa length(), isNull() | - | ||||||||||||
506 | */ | - | ||||||||||||
507 | - | |||||||||||||
508 | /*! | - | ||||||||||||
509 | \fn QLineF QLineF::normalVector() const | - | ||||||||||||
510 | - | |||||||||||||
511 | Returns a line that is perpendicular to this line with the same starting | - | ||||||||||||
512 | point and length. | - | ||||||||||||
513 | - | |||||||||||||
514 | \image qlinef-normalvector.png | - | ||||||||||||
515 | - | |||||||||||||
516 | \sa unitVector() | - | ||||||||||||
517 | */ | - | ||||||||||||
518 | - | |||||||||||||
519 | /*! | - | ||||||||||||
520 | \fn bool QLineF::operator!=(const QLineF &line) const | - | ||||||||||||
521 | - | |||||||||||||
522 | Returns \c true if the given \a line is not the same as \e this line. | - | ||||||||||||
523 | - | |||||||||||||
524 | A line is different from another line if their start or end points | - | ||||||||||||
525 | differ, or the internal order of the points is different. | - | ||||||||||||
526 | */ | - | ||||||||||||
527 | - | |||||||||||||
528 | /*! | - | ||||||||||||
529 | \fn bool QLineF::operator==(const QLineF &line) const | - | ||||||||||||
530 | - | |||||||||||||
531 | Returns \c true if the given \a line is the same as this line. | - | ||||||||||||
532 | - | |||||||||||||
533 | A line is identical to another line if the start and end points | - | ||||||||||||
534 | are identical, and the internal order of the points is the same. | - | ||||||||||||
535 | */ | - | ||||||||||||
536 | - | |||||||||||||
537 | /*! | - | ||||||||||||
538 | \fn qreal QLineF::pointAt(qreal t) const | - | ||||||||||||
539 | - | |||||||||||||
540 | Returns the point at the parameterized position specified by \a | - | ||||||||||||
541 | t. The function returns the line's start point if t = 0, and its end | - | ||||||||||||
542 | point if t = 1. | - | ||||||||||||
543 | - | |||||||||||||
544 | \sa dx(), dy() | - | ||||||||||||
545 | */ | - | ||||||||||||
546 | - | |||||||||||||
547 | /*! | - | ||||||||||||
548 | Returns the length of the line. | - | ||||||||||||
549 | - | |||||||||||||
550 | \sa setLength() | - | ||||||||||||
551 | */ | - | ||||||||||||
552 | qreal QLineF::length() const | - | ||||||||||||
553 | { | - | ||||||||||||
554 | qreal x = pt2.x() - pt1.x(); | - | ||||||||||||
555 | qreal y = pt2.y() - pt1.y(); | - | ||||||||||||
556 | return qSqrt(x*x + y*y); executed 133358 times by 22 tests: return qSqrt(x*x + y*y); Executed by:
| 133358 | ||||||||||||
557 | } | - | ||||||||||||
558 | - | |||||||||||||
559 | /*! | - | ||||||||||||
560 | \since 4.4 | - | ||||||||||||
561 | - | |||||||||||||
562 | Returns the angle of the line in degrees. | - | ||||||||||||
563 | - | |||||||||||||
564 | The return value will be in the range of values from 0.0 up to but not | - | ||||||||||||
565 | including 360.0. The angles are measured counter-clockwise from a point | - | ||||||||||||
566 | on the x-axis to the right of the origin (x > 0). | - | ||||||||||||
567 | - | |||||||||||||
568 | \sa setAngle() | - | ||||||||||||
569 | */ | - | ||||||||||||
570 | qreal QLineF::angle() const | - | ||||||||||||
571 | { | - | ||||||||||||
572 | const qreal dx = pt2.x() - pt1.x(); | - | ||||||||||||
573 | const qreal dy = pt2.y() - pt1.y(); | - | ||||||||||||
574 | - | |||||||||||||
575 | const qreal theta = qAtan2(-dy, dx) * 360.0 / M_2PI; | - | ||||||||||||
576 | - | |||||||||||||
577 | const qreal theta_normalized = theta < 0 ? theta + 360 : theta;
| 53865-54312 | ||||||||||||
578 | - | |||||||||||||
579 | if (qFuzzyCompare(theta_normalized, qreal(360)))
| 2-108175 | ||||||||||||
580 | return qreal(0); executed 2 times by 1 test: return qreal(0); Executed by:
| 2 | ||||||||||||
581 | else | - | ||||||||||||
582 | return theta_normalized; executed 108175 times by 16 tests: return theta_normalized; Executed by:
| 108175 | ||||||||||||
583 | } | - | ||||||||||||
584 | - | |||||||||||||
585 | /*! | - | ||||||||||||
586 | \since 4.4 | - | ||||||||||||
587 | - | |||||||||||||
588 | Sets the angle of the line to the given \a angle (in degrees). | - | ||||||||||||
589 | This will change the position of the second point of the line such that | - | ||||||||||||
590 | the line has the given angle. | - | ||||||||||||
591 | - | |||||||||||||
592 | Positive values for the angles mean counter-clockwise while negative values | - | ||||||||||||
593 | mean the clockwise direction. Zero degrees is at the 3 o'clock position. | - | ||||||||||||
594 | - | |||||||||||||
595 | \sa angle() | - | ||||||||||||
596 | */ | - | ||||||||||||
597 | void QLineF::setAngle(qreal angle) | - | ||||||||||||
598 | { | - | ||||||||||||
599 | const qreal angleR = angle * M_2PI / 360.0; | - | ||||||||||||
600 | const qreal l = length(); | - | ||||||||||||
601 | - | |||||||||||||
602 | const qreal dx = qCos(angleR) * l; | - | ||||||||||||
603 | const qreal dy = -qSin(angleR) * l; | - | ||||||||||||
604 | - | |||||||||||||
605 | pt2.rx() = pt1.x() + dx; | - | ||||||||||||
606 | pt2.ry() = pt1.y() + dy; | - | ||||||||||||
607 | } executed 1804 times by 1 test: end of block Executed by:
| 1804 | ||||||||||||
608 | - | |||||||||||||
609 | /*! | - | ||||||||||||
610 | \since 4.4 | - | ||||||||||||
611 | - | |||||||||||||
612 | Returns a QLineF with the given \a length and \a angle. | - | ||||||||||||
613 | - | |||||||||||||
614 | The first point of the line will be on the origin. | - | ||||||||||||
615 | - | |||||||||||||
616 | Positive values for the angles mean counter-clockwise while negative values | - | ||||||||||||
617 | mean the clockwise direction. Zero degrees is at the 3 o'clock position. | - | ||||||||||||
618 | */ | - | ||||||||||||
619 | QLineF QLineF::fromPolar(qreal length, qreal angle) | - | ||||||||||||
620 | { | - | ||||||||||||
621 | const qreal angleR = angle * M_2PI / 360.0; | - | ||||||||||||
622 | return QLineF(0, 0, qCos(angleR) * length, -qSin(angleR) * length); executed 4169 times by 2 tests: return QLineF(0, 0, qCos(angleR) * length, -qSin(angleR) * length); Executed by:
| 4169 | ||||||||||||
623 | } | - | ||||||||||||
624 | - | |||||||||||||
625 | /*! | - | ||||||||||||
626 | Returns the unit vector for this line, i.e a line starting at the | - | ||||||||||||
627 | same point as \e this line with a length of 1.0. | - | ||||||||||||
628 | - | |||||||||||||
629 | \sa normalVector() | - | ||||||||||||
630 | */ | - | ||||||||||||
631 | QLineF QLineF::unitVector() const | - | ||||||||||||
632 | { | - | ||||||||||||
633 | qreal x = pt2.x() - pt1.x(); | - | ||||||||||||
634 | qreal y = pt2.y() - pt1.y(); | - | ||||||||||||
635 | - | |||||||||||||
636 | qreal len = qSqrt(x*x + y*y); | - | ||||||||||||
637 | QLineF f(p1(), QPointF(pt1.x() + x/len, pt1.y() + y/len)); | - | ||||||||||||
638 | - | |||||||||||||
639 | #ifndef QT_NO_DEBUG | - | ||||||||||||
640 | if (qAbs(f.length() - 1) >= 0.001)
| 0-102875 | ||||||||||||
641 | qWarning("QLine::unitVector: New line does not have unit length"); never executed: QMessageLogger(__FILE__, 641, __PRETTY_FUNCTION__).warning("QLine::unitVector: New line does not have unit length"); | 0 | ||||||||||||
642 | #endif | - | ||||||||||||
643 | - | |||||||||||||
644 | return f; executed 102875 times by 16 tests: return f; Executed by:
| 102875 | ||||||||||||
645 | } | - | ||||||||||||
646 | - | |||||||||||||
647 | /*! | - | ||||||||||||
648 | \fn QLineF::IntersectType QLineF::intersect(const QLineF &line, QPointF *intersectionPoint) const | - | ||||||||||||
649 | - | |||||||||||||
650 | Returns a value indicating whether or not \e this line intersects | - | ||||||||||||
651 | with the given \a line. | - | ||||||||||||
652 | - | |||||||||||||
653 | The actual intersection point is extracted to \a intersectionPoint | - | ||||||||||||
654 | (if the pointer is valid). If the lines are parallel, the | - | ||||||||||||
655 | intersection point is undefined. | - | ||||||||||||
656 | */ | - | ||||||||||||
657 | - | |||||||||||||
658 | QLineF::IntersectType QLineF::intersect(const QLineF &l, QPointF *intersectionPoint) const | - | ||||||||||||
659 | { | - | ||||||||||||
660 | // ipmlementation is based on Graphics Gems III's "Faster Line Segment Intersection" | - | ||||||||||||
661 | const QPointF a = pt2 - pt1; | - | ||||||||||||
662 | const QPointF b = l.pt1 - l.pt2; | - | ||||||||||||
663 | const QPointF c = pt1 - l.pt1; | - | ||||||||||||
664 | - | |||||||||||||
665 | const qreal denominator = a.y() * b.x() - a.x() * b.y(); | - | ||||||||||||
666 | if (denominator == 0 || !qt_is_finite(denominator))
| 0-53468 | ||||||||||||
667 | return NoIntersection; executed 3700 times by 9 tests: return NoIntersection; Executed by:
| 3700 | ||||||||||||
668 | - | |||||||||||||
669 | const qreal reciprocal = 1 / denominator; | - | ||||||||||||
670 | const qreal na = (b.y() * c.x() - b.x() * c.y()) * reciprocal; | - | ||||||||||||
671 | if (intersectionPoint)
| 0-53468 | ||||||||||||
672 | *intersectionPoint = pt1 + a * na; executed 53468 times by 15 tests: *intersectionPoint = pt1 + a * na; Executed by:
| 53468 | ||||||||||||
673 | - | |||||||||||||
674 | if (na < 0 || na > 1)
| 36-53432 | ||||||||||||
675 | return UnboundedIntersection; executed 26266 times by 14 tests: return UnboundedIntersection; Executed by:
| 26266 | ||||||||||||
676 | - | |||||||||||||
677 | const qreal nb = (a.x() * c.y() - a.y() * c.x()) * reciprocal; | - | ||||||||||||
678 | if (nb < 0 || nb > 1)
| 0-27202 | ||||||||||||
679 | return UnboundedIntersection; executed 1 time by 1 test: return UnboundedIntersection; Executed by:
| 1 | ||||||||||||
680 | - | |||||||||||||
681 | return BoundedIntersection; executed 27201 times by 15 tests: return BoundedIntersection; Executed by:
| 27201 | ||||||||||||
682 | } | - | ||||||||||||
683 | - | |||||||||||||
684 | /*! | - | ||||||||||||
685 | \fn void QLineF::translate(const QPointF &offset) | - | ||||||||||||
686 | - | |||||||||||||
687 | Translates this line by the given \a offset. | - | ||||||||||||
688 | */ | - | ||||||||||||
689 | - | |||||||||||||
690 | /*! | - | ||||||||||||
691 | \fn void QLineF::translate(qreal dx, qreal dy) | - | ||||||||||||
692 | \overload | - | ||||||||||||
693 | - | |||||||||||||
694 | Translates this line the distance specified by \a dx and \a dy. | - | ||||||||||||
695 | */ | - | ||||||||||||
696 | - | |||||||||||||
697 | /*! | - | ||||||||||||
698 | \fn QLineF QLineF::translated(const QPointF &offset) const | - | ||||||||||||
699 | - | |||||||||||||
700 | \since 4.4 | - | ||||||||||||
701 | - | |||||||||||||
702 | Returns this line translated by the given \a offset. | - | ||||||||||||
703 | */ | - | ||||||||||||
704 | - | |||||||||||||
705 | /*! | - | ||||||||||||
706 | \fn QLineF QLineF::translated(qreal dx, qreal dy) const | - | ||||||||||||
707 | \overload | - | ||||||||||||
708 | \since 4.4 | - | ||||||||||||
709 | - | |||||||||||||
710 | Returns this line translated the distance specified by \a dx and \a dy. | - | ||||||||||||
711 | */ | - | ||||||||||||
712 | - | |||||||||||||
713 | /*! | - | ||||||||||||
714 | \fn void QLineF::setP1(const QPointF &p1) | - | ||||||||||||
715 | \since 4.4 | - | ||||||||||||
716 | - | |||||||||||||
717 | Sets the starting point of this line to \a p1. | - | ||||||||||||
718 | - | |||||||||||||
719 | \sa setP2(), p1() | - | ||||||||||||
720 | */ | - | ||||||||||||
721 | - | |||||||||||||
722 | - | |||||||||||||
723 | /*! | - | ||||||||||||
724 | \fn void QLineF::setP2(const QPointF &p2) | - | ||||||||||||
725 | \since 4.4 | - | ||||||||||||
726 | - | |||||||||||||
727 | Sets the end point of this line to \a p2. | - | ||||||||||||
728 | - | |||||||||||||
729 | \sa setP1(), p2() | - | ||||||||||||
730 | */ | - | ||||||||||||
731 | - | |||||||||||||
732 | - | |||||||||||||
733 | /*! | - | ||||||||||||
734 | \fn void QLineF::setPoints(const QPointF &p1, const QPointF &p2) | - | ||||||||||||
735 | \since 4.4 | - | ||||||||||||
736 | - | |||||||||||||
737 | Sets the start point of this line to \a p1 and the end point of this line to \a p2. | - | ||||||||||||
738 | - | |||||||||||||
739 | \sa setP1(), setP2(), p1(), p2() | - | ||||||||||||
740 | */ | - | ||||||||||||
741 | - | |||||||||||||
742 | - | |||||||||||||
743 | /*! | - | ||||||||||||
744 | \fn void QLineF::setLine(qreal x1, qreal y1, qreal x2, qreal y2) | - | ||||||||||||
745 | \since 4.4 | - | ||||||||||||
746 | - | |||||||||||||
747 | Sets this line to the start in \a x1, \a y1 and end in \a x2, \a y2. | - | ||||||||||||
748 | - | |||||||||||||
749 | \sa setP1(), setP2(), p1(), p2() | - | ||||||||||||
750 | */ | - | ||||||||||||
751 | - | |||||||||||||
752 | /*! | - | ||||||||||||
753 | \fn qreal QLineF::angleTo(const QLineF &line) const | - | ||||||||||||
754 | - | |||||||||||||
755 | \since 4.4 | - | ||||||||||||
756 | - | |||||||||||||
757 | Returns the angle (in degrees) from this line to the given \a | - | ||||||||||||
758 | line, taking the direction of the lines into account. If the lines | - | ||||||||||||
759 | do not intersect within their range, it is the intersection point of | - | ||||||||||||
760 | the extended lines that serves as origin (see | - | ||||||||||||
761 | QLineF::UnboundedIntersection). | - | ||||||||||||
762 | - | |||||||||||||
763 | The returned value represents the number of degrees you need to add | - | ||||||||||||
764 | to this line to make it have the same angle as the given \a line, | - | ||||||||||||
765 | going counter-clockwise. | - | ||||||||||||
766 | - | |||||||||||||
767 | \sa intersect() | - | ||||||||||||
768 | */ | - | ||||||||||||
769 | qreal QLineF::angleTo(const QLineF &l) const | - | ||||||||||||
770 | { | - | ||||||||||||
771 | if (isNull() || l.isNull())
| 0-52787 | ||||||||||||
772 | return 0; never executed: return 0; | 0 | ||||||||||||
773 | - | |||||||||||||
774 | const qreal a1 = angle(); | - | ||||||||||||
775 | const qreal a2 = l.angle(); | - | ||||||||||||
776 | - | |||||||||||||
777 | const qreal delta = a2 - a1; | - | ||||||||||||
778 | const qreal delta_normalized = delta < 0 ? delta + 360 : delta;
| 19559-33228 | ||||||||||||
779 | - | |||||||||||||
780 | if (qFuzzyCompare(delta, qreal(360)))
| 0-52787 | ||||||||||||
781 | return 0; never executed: return 0; | 0 | ||||||||||||
782 | else | - | ||||||||||||
783 | return delta_normalized; executed 52787 times by 15 tests: return delta_normalized; Executed by:
| 52787 | ||||||||||||
784 | } | - | ||||||||||||
785 | - | |||||||||||||
786 | /*! | - | ||||||||||||
787 | \fn qreal QLineF::angle(const QLineF &line) const | - | ||||||||||||
788 | - | |||||||||||||
789 | \obsolete | - | ||||||||||||
790 | - | |||||||||||||
791 | Returns the angle (in degrees) between this line and the given \a | - | ||||||||||||
792 | line, taking the direction of the lines into account. If the lines | - | ||||||||||||
793 | do not intersect within their range, it is the intersection point of | - | ||||||||||||
794 | the extended lines that serves as origin (see | - | ||||||||||||
795 | QLineF::UnboundedIntersection). | - | ||||||||||||
796 | - | |||||||||||||
797 | \table | - | ||||||||||||
798 | \row | - | ||||||||||||
799 | \li \inlineimage qlinef-angle-identicaldirection.png | - | ||||||||||||
800 | \li \inlineimage qlinef-angle-oppositedirection.png | - | ||||||||||||
801 | \endtable | - | ||||||||||||
802 | - | |||||||||||||
803 | When the lines are parallel, this function returns 0 if they have | - | ||||||||||||
804 | the same direction; otherwise it returns 180. | - | ||||||||||||
805 | - | |||||||||||||
806 | \sa intersect() | - | ||||||||||||
807 | */ | - | ||||||||||||
808 | qreal QLineF::angle(const QLineF &l) const | - | ||||||||||||
809 | { | - | ||||||||||||
810 | if (isNull() || l.isNull())
| 0-183 | ||||||||||||
811 | return 0; never executed: return 0; | 0 | ||||||||||||
812 | qreal cos_line = (dx()*l.dx() + dy()*l.dy()) / (length()*l.length()); | - | ||||||||||||
813 | qreal rad = 0; | - | ||||||||||||
814 | // only accept cos_line in the range [-1,1], if it is outside, use 0 (we return 0 rather than PI for those cases) | - | ||||||||||||
815 | if (cos_line >= -1.0 && cos_line <= 1.0) rad = qAcos( cos_line ); executed 182 times by 1 test: rad = qAcos( cos_line ); Executed by:
| 0-183 | ||||||||||||
816 | return rad * 360 / M_2PI; executed 183 times by 1 test: return rad * 360 / 6.28318530717958647692528676655900576; Executed by:
| 183 | ||||||||||||
817 | } | - | ||||||||||||
818 | - | |||||||||||||
819 | - | |||||||||||||
820 | #ifndef QT_NO_DEBUG_STREAM | - | ||||||||||||
821 | QDebug operator<<(QDebug dbg, const QLineF &p) | - | ||||||||||||
822 | { | - | ||||||||||||
823 | QDebugStateSaver saver(dbg); | - | ||||||||||||
824 | dbg.nospace() << "QLineF(" << p.p1() << ',' << p.p2() << ')'; | - | ||||||||||||
825 | return dbg; executed 2 times by 2 tests: return dbg; Executed by:
| 2 | ||||||||||||
826 | } | - | ||||||||||||
827 | #endif | - | ||||||||||||
828 | - | |||||||||||||
829 | #ifndef QT_NO_DATASTREAM | - | ||||||||||||
830 | /*! | - | ||||||||||||
831 | \relates QLineF | - | ||||||||||||
832 | - | |||||||||||||
833 | Writes the given \a line to the given \a stream and returns a | - | ||||||||||||
834 | reference to the stream. | - | ||||||||||||
835 | - | |||||||||||||
836 | \sa {Serializing Qt Data Types} | - | ||||||||||||
837 | */ | - | ||||||||||||
838 | - | |||||||||||||
839 | QDataStream &operator<<(QDataStream &stream, const QLineF &line) | - | ||||||||||||
840 | { | - | ||||||||||||
841 | stream << line.p1() << line.p2(); | - | ||||||||||||
842 | return stream; executed 3 times by 2 tests: return stream; Executed by:
| 3 | ||||||||||||
843 | } | - | ||||||||||||
844 | - | |||||||||||||
845 | /*! | - | ||||||||||||
846 | \relates QLineF | - | ||||||||||||
847 | - | |||||||||||||
848 | Reads a line from the given \a stream into the given \a line and | - | ||||||||||||
849 | returns a reference to the stream. | - | ||||||||||||
850 | - | |||||||||||||
851 | \sa {Serializing Qt Data Types} | - | ||||||||||||
852 | */ | - | ||||||||||||
853 | - | |||||||||||||
854 | QDataStream &operator>>(QDataStream &stream, QLineF &line) | - | ||||||||||||
855 | { | - | ||||||||||||
856 | QPointF start, end; | - | ||||||||||||
857 | stream >> start; | - | ||||||||||||
858 | stream >> end; | - | ||||||||||||
859 | line = QLineF(start, end); | - | ||||||||||||
860 | - | |||||||||||||
861 | return stream; executed 7 times by 2 tests: return stream; Executed by:
| 7 | ||||||||||||
862 | } | - | ||||||||||||
863 | - | |||||||||||||
864 | #endif // QT_NO_DATASTREAM | - | ||||||||||||
865 | - | |||||||||||||
866 | QT_END_NAMESPACE | - | ||||||||||||
Source code | Switch to Preprocessed file |