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 #ifndef QLINE_H
41 #define QLINE_H
42 
43 #include <QtCore/qpoint.h>
44 
45 QT_BEGIN_NAMESPACE
46 
47 
48 /*******************************************************************************
49  * class QLine
50  *******************************************************************************/
51 
52 class Q_CORE_EXPORT QLine
53 {
54 public:
55     Q_DECL_CONSTEXPR inline QLine();
56     Q_DECL_CONSTEXPR inline QLine(const QPoint &pt1, const QPoint &pt2);
57     Q_DECL_CONSTEXPR inline QLine(int x1, int y1, int x2, int y2);
58 
59     Q_DECL_CONSTEXPR inline bool isNull() const;
60 
61     Q_DECL_CONSTEXPR inline QPoint p1() const;
62     Q_DECL_CONSTEXPR inline QPoint p2() const;
63 
64     Q_DECL_CONSTEXPR inline int x1() const;
65     Q_DECL_CONSTEXPR inline int y1() const;
66 
67     Q_DECL_CONSTEXPR inline int x2() const;
68     Q_DECL_CONSTEXPR inline int y2() const;
69 
70     Q_DECL_CONSTEXPR inline int dx() const;
71     Q_DECL_CONSTEXPR inline int dy() const;
72 
73     inline void translate(const QPoint &p);
74     inline void translate(int dx, int dy);
75 
76     Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QLine translated(const QPoint &p) const;
77     Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QLine translated(int dx, int dy) const;
78 
79     Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QPoint center() const;
80 
81     inline void setP1(const QPoint &p1);
82     inline void setP2(const QPoint &p2);
83     inline void setPoints(const QPoint &p1, const QPoint &p2);
84     inline void setLine(int x1, int y1, int x2, int y2);
85 
86     Q_DECL_CONSTEXPR inline bool operator==(const QLine &d) const;
87     Q_DECL_CONSTEXPR inline bool operator!=(const QLine &d) const { return !(*this == d); }
88 
89 private:
90     QPoint pt1, pt2;
91 };
92 Q_DECLARE_TYPEINFO(QLine, Q_MOVABLE_TYPE);
93 
94 /*******************************************************************************
95  * class QLine inline members
96  *******************************************************************************/
97 
QLine()98 Q_DECL_CONSTEXPR inline QLine::QLine() { }
99 
QLine(const QPoint & pt1_,const QPoint & pt2_)100 Q_DECL_CONSTEXPR inline QLine::QLine(const QPoint &pt1_, const QPoint &pt2_) : pt1(pt1_), pt2(pt2_) { }
101 
QLine(int x1pos,int y1pos,int x2pos,int y2pos)102 Q_DECL_CONSTEXPR inline QLine::QLine(int x1pos, int y1pos, int x2pos, int y2pos) : pt1(QPoint(x1pos, y1pos)), pt2(QPoint(x2pos, y2pos)) { }
103 
isNull()104 Q_DECL_CONSTEXPR inline bool QLine::isNull() const
105 {
106     return pt1 == pt2;
107 }
108 
x1()109 Q_DECL_CONSTEXPR inline int QLine::x1() const
110 {
111     return pt1.x();
112 }
113 
y1()114 Q_DECL_CONSTEXPR inline int QLine::y1() const
115 {
116     return pt1.y();
117 }
118 
x2()119 Q_DECL_CONSTEXPR inline int QLine::x2() const
120 {
121     return pt2.x();
122 }
123 
y2()124 Q_DECL_CONSTEXPR inline int QLine::y2() const
125 {
126     return pt2.y();
127 }
128 
p1()129 Q_DECL_CONSTEXPR inline QPoint QLine::p1() const
130 {
131     return pt1;
132 }
133 
p2()134 Q_DECL_CONSTEXPR inline QPoint QLine::p2() const
135 {
136     return pt2;
137 }
138 
dx()139 Q_DECL_CONSTEXPR inline int QLine::dx() const
140 {
141     return pt2.x() - pt1.x();
142 }
143 
dy()144 Q_DECL_CONSTEXPR inline int QLine::dy() const
145 {
146     return pt2.y() - pt1.y();
147 }
148 
translate(const QPoint & point)149 inline void QLine::translate(const QPoint &point)
150 {
151     pt1 += point;
152     pt2 += point;
153 }
154 
translate(int adx,int ady)155 inline void QLine::translate(int adx, int ady)
156 {
157     this->translate(QPoint(adx, ady));
158 }
159 
translated(const QPoint & p)160 Q_DECL_CONSTEXPR inline QLine QLine::translated(const QPoint &p) const
161 {
162     return QLine(pt1 + p, pt2 + p);
163 }
164 
translated(int adx,int ady)165 Q_DECL_CONSTEXPR inline QLine QLine::translated(int adx, int ady) const
166 {
167     return translated(QPoint(adx, ady));
168 }
169 
center()170 Q_DECL_CONSTEXPR inline QPoint QLine::center() const
171 {
172     return QPoint(int((qint64(pt1.x()) + pt2.x()) / 2), int((qint64(pt1.y()) + pt2.y()) / 2));
173 }
174 
setP1(const QPoint & aP1)175 inline void QLine::setP1(const QPoint &aP1)
176 {
177     pt1 = aP1;
178 }
179 
setP2(const QPoint & aP2)180 inline void QLine::setP2(const QPoint &aP2)
181 {
182     pt2 = aP2;
183 }
184 
setPoints(const QPoint & aP1,const QPoint & aP2)185 inline void QLine::setPoints(const QPoint &aP1, const QPoint &aP2)
186 {
187     pt1 = aP1;
188     pt2 = aP2;
189 }
190 
setLine(int aX1,int aY1,int aX2,int aY2)191 inline void QLine::setLine(int aX1, int aY1, int aX2, int aY2)
192 {
193     pt1 = QPoint(aX1, aY1);
194     pt2 = QPoint(aX2, aY2);
195 }
196 
197 Q_DECL_CONSTEXPR inline bool QLine::operator==(const QLine &d) const
198 {
199     return pt1 == d.pt1 && pt2 == d.pt2;
200 }
201 
202 #ifndef QT_NO_DEBUG_STREAM
203 Q_CORE_EXPORT QDebug operator<<(QDebug d, const QLine &p);
204 #endif
205 
206 #ifndef QT_NO_DATASTREAM
207 Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QLine &);
208 Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QLine &);
209 #endif
210 
211 /*******************************************************************************
212  * class QLineF
213  *******************************************************************************/
214 class Q_CORE_EXPORT QLineF {
215 public:
216 
217     enum IntersectType { NoIntersection, BoundedIntersection, UnboundedIntersection };
218     using IntersectionType = IntersectType;
219 
220     Q_DECL_CONSTEXPR inline QLineF();
221     Q_DECL_CONSTEXPR inline QLineF(const QPointF &pt1, const QPointF &pt2);
222     Q_DECL_CONSTEXPR inline QLineF(qreal x1, qreal y1, qreal x2, qreal y2);
QLineF(const QLine & line)223     Q_DECL_CONSTEXPR inline QLineF(const QLine &line) : pt1(line.p1()), pt2(line.p2()) { }
224 
225     Q_REQUIRED_RESULT static QLineF fromPolar(qreal length, qreal angle);
226 
227     Q_DECL_CONSTEXPR bool isNull() const;
228 
229     Q_DECL_CONSTEXPR inline QPointF p1() const;
230     Q_DECL_CONSTEXPR inline QPointF p2() const;
231 
232     Q_DECL_CONSTEXPR inline qreal x1() const;
233     Q_DECL_CONSTEXPR inline qreal y1() const;
234 
235     Q_DECL_CONSTEXPR inline qreal x2() const;
236     Q_DECL_CONSTEXPR inline qreal y2() const;
237 
238     Q_DECL_CONSTEXPR inline qreal dx() const;
239     Q_DECL_CONSTEXPR inline qreal dy() const;
240 
241     qreal length() const;
242     void setLength(qreal len);
243 
244     qreal angle() const;
245     void setAngle(qreal angle);
246 
247     qreal angleTo(const QLineF &l) const;
248 
249     Q_REQUIRED_RESULT QLineF unitVector() const;
250     Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QLineF normalVector() const;
251 
252     IntersectionType intersects(const QLineF &l, QPointF *intersectionPoint) const;
253 
254 #if QT_DEPRECATED_SINCE(5, 14)
255     QT_DEPRECATED_VERSION_X(5, 14, "Use intersects() instead")
256     IntersectType intersect(const QLineF &l, QPointF *intersectionPoint) const;
257     QT_DEPRECATED_X("Use qMin(l1.angleTo(l2), l2.angleTo(l1)) instead")
258     qreal angle(const QLineF &l) const;
259 #endif
260 
261     Q_DECL_CONSTEXPR inline QPointF pointAt(qreal t) const;
262     inline void translate(const QPointF &p);
263     inline void translate(qreal dx, qreal dy);
264 
265     Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QLineF translated(const QPointF &p) const;
266     Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QLineF translated(qreal dx, qreal dy) const;
267 
268     Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QPointF center() const;
269 
270     inline void setP1(const QPointF &p1);
271     inline void setP2(const QPointF &p2);
272     inline void setPoints(const QPointF &p1, const QPointF &p2);
273     inline void setLine(qreal x1, qreal y1, qreal x2, qreal y2);
274 
275     Q_DECL_CONSTEXPR inline bool operator==(const QLineF &d) const;
276     Q_DECL_CONSTEXPR inline bool operator!=(const QLineF &d) const { return !(*this == d); }
277 
278     Q_DECL_CONSTEXPR QLine toLine() const;
279 
280 private:
281     QPointF pt1, pt2;
282 };
283 Q_DECLARE_TYPEINFO(QLineF, Q_MOVABLE_TYPE);
284 
285 /*******************************************************************************
286  * class QLineF inline members
287  *******************************************************************************/
288 
QLineF()289 Q_DECL_CONSTEXPR inline QLineF::QLineF()
290 {
291 }
292 
QLineF(const QPointF & apt1,const QPointF & apt2)293 Q_DECL_CONSTEXPR inline QLineF::QLineF(const QPointF &apt1, const QPointF &apt2)
294     : pt1(apt1), pt2(apt2)
295 {
296 }
297 
QLineF(qreal x1pos,qreal y1pos,qreal x2pos,qreal y2pos)298 Q_DECL_CONSTEXPR inline QLineF::QLineF(qreal x1pos, qreal y1pos, qreal x2pos, qreal y2pos)
299     : pt1(x1pos, y1pos), pt2(x2pos, y2pos)
300 {
301 }
302 
x1()303 Q_DECL_CONSTEXPR inline qreal QLineF::x1() const
304 {
305     return pt1.x();
306 }
307 
y1()308 Q_DECL_CONSTEXPR inline qreal QLineF::y1() const
309 {
310     return pt1.y();
311 }
312 
x2()313 Q_DECL_CONSTEXPR inline qreal QLineF::x2() const
314 {
315     return pt2.x();
316 }
317 
y2()318 Q_DECL_CONSTEXPR inline qreal QLineF::y2() const
319 {
320     return pt2.y();
321 }
322 
isNull()323 Q_DECL_CONSTEXPR inline bool QLineF::isNull() const
324 {
325     return qFuzzyCompare(pt1.x(), pt2.x()) && qFuzzyCompare(pt1.y(), pt2.y());
326 }
327 
p1()328 Q_DECL_CONSTEXPR inline QPointF QLineF::p1() const
329 {
330     return pt1;
331 }
332 
p2()333 Q_DECL_CONSTEXPR inline QPointF QLineF::p2() const
334 {
335     return pt2;
336 }
337 
dx()338 Q_DECL_CONSTEXPR inline qreal QLineF::dx() const
339 {
340     return pt2.x() - pt1.x();
341 }
342 
dy()343 Q_DECL_CONSTEXPR inline qreal QLineF::dy() const
344 {
345     return pt2.y() - pt1.y();
346 }
347 
normalVector()348 Q_DECL_CONSTEXPR inline QLineF QLineF::normalVector() const
349 {
350     return QLineF(p1(), p1() + QPointF(dy(), -dx()));
351 }
352 
translate(const QPointF & point)353 inline void QLineF::translate(const QPointF &point)
354 {
355     pt1 += point;
356     pt2 += point;
357 }
358 
translate(qreal adx,qreal ady)359 inline void QLineF::translate(qreal adx, qreal ady)
360 {
361     this->translate(QPointF(adx, ady));
362 }
363 
translated(const QPointF & p)364 Q_DECL_CONSTEXPR inline QLineF QLineF::translated(const QPointF &p) const
365 {
366     return QLineF(pt1 + p, pt2 + p);
367 }
368 
translated(qreal adx,qreal ady)369 Q_DECL_CONSTEXPR inline QLineF QLineF::translated(qreal adx, qreal ady) const
370 {
371     return translated(QPointF(adx, ady));
372 }
373 
center()374 Q_DECL_CONSTEXPR inline QPointF QLineF::center() const
375 {
376     return QPointF(0.5 * pt1.x() + 0.5 * pt2.x(), 0.5 * pt1.y() + 0.5 * pt2.y());
377 }
378 
setLength(qreal len)379 inline void QLineF::setLength(qreal len)
380 {
381     if (isNull())
382         return;
383     Q_ASSERT(length() > 0);
384     const QLineF v = unitVector();
385     len /= v.length(); // In case it's not quite exactly 1.
386     pt2 = QPointF(pt1.x() + len * v.dx(), pt1.y() + len * v.dy());
387 }
388 
pointAt(qreal t)389 Q_DECL_CONSTEXPR inline QPointF QLineF::pointAt(qreal t) const
390 {
391     return QPointF(pt1.x() + (pt2.x() - pt1.x()) * t, pt1.y() + (pt2.y() - pt1.y()) * t);
392 }
393 
toLine()394 Q_DECL_CONSTEXPR inline QLine QLineF::toLine() const
395 {
396     return QLine(pt1.toPoint(), pt2.toPoint());
397 }
398 
399 
setP1(const QPointF & aP1)400 inline void QLineF::setP1(const QPointF &aP1)
401 {
402     pt1 = aP1;
403 }
404 
setP2(const QPointF & aP2)405 inline void QLineF::setP2(const QPointF &aP2)
406 {
407     pt2 = aP2;
408 }
409 
setPoints(const QPointF & aP1,const QPointF & aP2)410 inline void QLineF::setPoints(const QPointF &aP1, const QPointF &aP2)
411 {
412     pt1 = aP1;
413     pt2 = aP2;
414 }
415 
setLine(qreal aX1,qreal aY1,qreal aX2,qreal aY2)416 inline void QLineF::setLine(qreal aX1, qreal aY1, qreal aX2, qreal aY2)
417 {
418     pt1 = QPointF(aX1, aY1);
419     pt2 = QPointF(aX2, aY2);
420 }
421 
422 
423 Q_DECL_CONSTEXPR inline bool QLineF::operator==(const QLineF &d) const
424 {
425     return pt1 == d.pt1 && pt2 == d.pt2;
426 }
427 
428 
429 
430 #ifndef QT_NO_DEBUG_STREAM
431 Q_CORE_EXPORT QDebug operator<<(QDebug d, const QLineF &p);
432 #endif
433 
434 #ifndef QT_NO_DATASTREAM
435 Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QLineF &);
436 Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QLineF &);
437 #endif
438 
439 QT_END_NAMESPACE
440 
441 #endif // QLINE_H
442