LibrePCB Developers Documentation
Loading...
Searching...
No Matches
point.h
Go to the documentation of this file.
1/*
2 * LibrePCB - Professional EDA for everyone!
3 * Copyright (C) 2013 LibrePCB Developers, see AUTHORS.md for contributors.
4 * https://librepcb.org/
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#ifndef LIBREPCB_CORE_POINT_H
21#define LIBREPCB_CORE_POINT_H
22
23/*******************************************************************************
24 * Includes
25 ******************************************************************************/
26#include "length.h"
27
28#include <QtCore>
29
30/*******************************************************************************
31 * Namespace / Forward Declarations
32 ******************************************************************************/
33namespace librepcb {
34
35class Angle;
36class SExpression;
37
38/*******************************************************************************
39 * Class Point
40 ******************************************************************************/
41
78class Point final {
79public:
80 // Constructors / Destructor
81
87 Point() noexcept : Point(Length(0), Length(0)) {}
88
94 Point(const Point& point) noexcept : mX(point.mX), mY(point.mY) {}
95
102 explicit Point(const Length& x, const Length& y) noexcept : mX(x), mY(y) {}
103
104 explicit Point(const SExpression& node);
105
109 ~Point() noexcept {}
110
111 // Setters
112
118 void setX(const Length& x) noexcept { mX = x; }
119
125 void setY(const Length& y) noexcept { mY = y; }
126
135 void setXmm(const QString& mm) { mX.setLengthMm(mm); }
136
145 void setYmm(const QString& mm) { mY.setLengthMm(mm); }
146
150 void setPointNm(LengthBase_t nmX, LengthBase_t nmY) noexcept {
151 mX.setLengthNm(nmX);
152 mY.setLengthNm(nmY);
153 }
154
158 void setPointMm(const QPointF& millimeters) {
159 mX.setLengthMm(millimeters.x());
160 mY.setLengthMm(millimeters.y());
161 }
162
166 void setPointInch(const QPointF& inches) {
167 mX.setLengthInch(inches.x());
168 mY.setLengthInch(inches.y());
169 }
170
174 void setPointMil(const QPointF& mils) {
175 mX.setLengthMil(mils.x());
176 mX.setLengthMil(mils.y());
177 }
178
184 void setPointPx(const QPointF& pixels) {
185 mX.setLengthPx(pixels.x());
186 mY.setLengthPx(-pixels.y());
187 } // invert Y!
188
189 // Getters
190
196 const Length& getX() const noexcept { return mX; }
197
203 const Length& getY() const noexcept { return mY; }
204
211 UnsignedLength getLength() const noexcept {
212 LengthBase_t length =
213 static_cast<LengthBase_t>(std::hypot(mX.toNm(), mY.toNm()));
214 Q_ASSERT(length >= 0);
215 return UnsignedLength(length);
216 }
217
223 bool isOrigin() const noexcept { return ((mX == 0) && (mY == 0)); }
224
225 // Conversions
226
236 QPointF toMmQPointF() const noexcept { return QPointF(mX.toMm(), mY.toMm()); }
237
247 QPointF toInchQPointF() const noexcept {
248 return QPointF(mX.toInch(), mY.toInch());
249 }
250
260 QPointF toMilQPointF() const noexcept {
261 return QPointF(mX.toMil(), mY.toMil());
262 }
263
276 QPointF toPxQPointF() const noexcept {
277 return QPointF(mX.toPx(), -mY.toPx());
278 } // invert Y!
279
280 // General Methods
281
290 Point abs() const noexcept;
291
299 Point& makeAbs() noexcept;
300
310 Point mappedToGrid(const PositiveLength& gridInterval) const noexcept;
311
321 Point& mapToGrid(const PositiveLength& gridInterval) noexcept;
322
332 bool isOnGrid(const PositiveLength& gridInterval) const noexcept;
333
349 Point rotated(const Angle& angle,
350 const Point& center = Point(0, 0)) const noexcept;
351
367 Point& rotate(const Angle& angle, const Point& center = Point(0, 0)) noexcept;
368
381 Point mirrored(Qt::Orientation orientation,
382 const Point& center = Point(0, 0)) const noexcept;
383
395 Point& mirror(Qt::Orientation orientation,
396 const Point& center = Point(0, 0)) noexcept;
397
403 void serialize(SExpression& root) const;
404
405 // Static Functions
406
408 static Point fromMm(qreal millimetersX, qreal millimetersY);
409 static Point fromMm(const QPointF& millimeters);
410
412 static Point fromInch(qreal inchesX, qreal inchesY);
413 static Point fromInch(const QPointF& inches);
414
416 static Point fromMil(qreal milsX, qreal milsY);
417 static Point fromMil(const QPointF& mils);
418
423 static Point fromPx(qreal pixelsX, qreal pixelsY);
424 static Point fromPx(const QPointF& pixels);
425
426 // Operators
427 Point& operator=(const Point& rhs) {
428 mX = rhs.mX;
429 mY = rhs.mY;
430 return *this;
431 }
432 Point& operator+=(const Point& rhs) {
433 mX += rhs.mX;
434 mY += rhs.mY;
435 return *this;
436 }
437 Point& operator-=(const Point& rhs) {
438 mX -= rhs.mX;
439 mY -= rhs.mY;
440 return *this;
441 }
442 Point& operator*=(const Point& rhs) {
443 mX *= rhs.mX;
444 mY *= rhs.mY;
445 return *this;
446 }
448 mX *= rhs;
449 mY *= rhs;
450 return *this;
451 }
452 Point& operator/=(const Point& rhs) {
453 mX /= rhs.mX;
454 mY /= rhs.mY;
455 return *this;
456 }
458 mX /= rhs;
459 mY /= rhs;
460 return *this;
461 }
462 Point operator+(const Point& rhs) const {
463 return Point(mX + rhs.mX, mY + rhs.mY);
464 }
465 Point operator-() const { return Point(-mX, -mY); }
466 Point operator-(const Point& rhs) const {
467 return Point(mX - rhs.mX, mY - rhs.mY);
468 }
469 Point operator*(const Length& rhs) const { return Point(mX * rhs, mY * rhs); }
470 Point operator*(LengthBase_t rhs) const { return Point(mX * rhs, mY * rhs); }
471 Point operator/(const Length& rhs) const { return Point(mX / rhs, mY / rhs); }
472 Point operator/(LengthBase_t rhs) const { return Point(mX / rhs, mY / rhs); }
473 Point operator%(const Length& rhs) const { return Point(mX % rhs, mY % rhs); }
474 bool operator==(const Point& rhs) const {
475 return (mX == rhs.mX) && (mY == rhs.mY);
476 }
477 bool operator!=(const Point& rhs) const {
478 return (mX != rhs.mX) || (mY != rhs.mY);
479 }
480
482
496 bool operator<(const Point& rhs) const noexcept {
497 return (mX < rhs.mX) || ((mX == rhs.mX) && (mY < rhs.mY));
498 }
499 bool operator<=(const Point& rhs) const noexcept {
500 return (mX < rhs.mX) || ((mX == rhs.mX) && (mY <= rhs.mY));
501 }
502 bool operator>(const Point& rhs) const noexcept {
503 return (mX > rhs.mX) || ((mX == rhs.mX) && (mY > rhs.mY));
504 }
505 bool operator>=(const Point& rhs) const noexcept {
506 return (mX > rhs.mX) || ((mX == rhs.mX) && (mY >= rhs.mY));
507 }
509
510private:
513};
514
515/*******************************************************************************
516 * Non-Member Functions
517 ******************************************************************************/
518
519QDataStream& operator<<(QDataStream& stream, const Point& point);
520QDebug operator<<(QDebug stream, const Point& point);
521
522inline std::size_t qHash(const Point& key, std::size_t seed = 0) noexcept {
523 return ::qHash(qMakePair(key.getX(), key.getY()), seed);
524}
525
526/*******************************************************************************
527 * End of File
528 ******************************************************************************/
529
530} // namespace librepcb
531
532Q_DECLARE_METATYPE(librepcb::Point)
533
534#endif
The Angle class is used to represent an angle (for example 12.75 degrees)
Definition angle.h:76
The Length class is used to represent a length (for example 12.75 millimeters)
Definition length.h:82
void setLengthMil(qreal mils)
Set the length in mils (1/1000 inch)
Definition length.h:187
void setLengthPx(qreal pixels)
Set the length in pixels (from QGraphics* objects)
Definition length.h:204
qreal toMm() const noexcept
Get the length in millimeters.
Definition length.h:239
qreal toInch() const noexcept
Get the length in inches.
Definition length.h:261
void setLengthNm(LengthBase_t nanometers) noexcept
Set the length in nanometers.
Definition length.h:123
void setLengthInch(qreal inches)
Set the length in inches.
Definition length.h:172
qreal toPx() const noexcept
Get the length in pixels (for QGraphics* objects)
Definition length.h:282
void setLengthMm(qreal millimeters)
Set the length in millimeters.
Definition length.h:140
qreal toMil() const noexcept
Get the length in mils (1/1000 inches)
Definition length.h:270
LengthBase_t toNm() const noexcept
Get the length in nanometers.
Definition length.h:213
The Point class is used to represent a point/coordinate/vector, for example (1.2mm; 5....
Definition point.h:78
Length mX
the X coordinate
Definition point.h:511
bool isOrigin() const noexcept
Check if the position represents the origin (X == 0 and Y == 0)
Definition point.h:223
Point & makeAbs() noexcept
Make both coordinates absolute (X,Y >= 0)
Definition point.cpp:56
const Length & getX() const noexcept
Get the X coordinate.
Definition point.h:196
Point(const Point &point) noexcept
Copy Constructor.
Definition point.h:94
static Point fromPx(qreal pixelsX, qreal pixelsY)
Definition point.cpp:176
void setPointNm(LengthBase_t nmX, LengthBase_t nmY) noexcept
Definition point.h:150
void setYmm(const QString &mm)
Set the Y coordinate from a string in millimeters.
Definition point.h:145
Point operator*(const Length &rhs) const
Definition point.h:469
Point operator-() const
Definition point.h:465
bool operator<(const Point &rhs) const noexcept
Less/Greater comparison operator overloadings.
Definition point.h:496
Point operator%(const Length &rhs) const
Definition point.h:473
void setY(const Length &y) noexcept
Set the Y coordinate.
Definition point.h:125
QPointF toMilQPointF() const noexcept
Get the point as a QPointF object in mils (1/1000 inches)
Definition point.h:260
bool operator<=(const Point &rhs) const noexcept
Definition point.h:499
QPointF toInchQPointF() const noexcept
Get the point as a QPointF object in inches.
Definition point.h:247
Point operator*(LengthBase_t rhs) const
Definition point.h:470
QPointF toPxQPointF() const noexcept
Get the point as a QPointF object in pixels (for QGraphics* objects)
Definition point.h:276
Point abs() const noexcept
Get a Point object with both coordinates in absolute values (X,Y >= 0)
Definition point.cpp:50
Point & mapToGrid(const PositiveLength &gridInterval) noexcept
Map this Point object to a specific grid interval.
Definition point.cpp:68
Point rotated(const Angle &angle, const Point &center=Point(0, 0)) const noexcept
Get the point rotated by a specific angle with respect to a specific center.
Definition point.cpp:78
Point() noexcept
Default Constructor.
Definition point.h:87
Length mY
the Y coordinate
Definition point.h:512
Point(const Length &x, const Length &y) noexcept
Constructor for passing two Length objects.
Definition point.h:102
Point operator-(const Point &rhs) const
Definition point.h:466
Point & operator*=(const Point &rhs)
Definition point.h:442
static Point fromInch(qreal inchesX, qreal inchesY)
Definition point.cpp:154
Point & operator-=(const Point &rhs)
Definition point.h:437
void setX(const Length &x) noexcept
Set the X coordinate.
Definition point.h:118
void setPointMil(const QPointF &mils)
Definition point.h:174
const Length & getY() const noexcept
Get the Y coordinate.
Definition point.h:203
Point mirrored(Qt::Orientation orientation, const Point &center=Point(0, 0)) const noexcept
Get the point mirrored horizontally or vertically around a specific center.
Definition point.cpp:114
void setXmm(const QString &mm)
Set the X coordinate from a string in millimeters.
Definition point.h:135
~Point() noexcept
Destructor.
Definition point.h:109
bool operator>(const Point &rhs) const noexcept
Definition point.h:502
Point operator+(const Point &rhs) const
Definition point.h:462
UnsignedLength getLength() const noexcept
Get the length of the vector if X and Y represents a vector (e.g. the distance of this Point from the...
Definition point.h:211
void serialize(SExpression &root) const
Serialize into librepcb::SExpression node.
Definition point.cpp:136
bool isOnGrid(const PositiveLength &gridInterval) const noexcept
Check whether the Point lies on the grid.
Definition point.cpp:74
static Point fromMm(qreal millimetersX, qreal millimetersY)
Definition point.cpp:143
QPointF toMmQPointF() const noexcept
Get the point as a QPointF object in millimeters.
Definition point.h:236
Point operator/(const Length &rhs) const
Definition point.h:471
Point mappedToGrid(const PositiveLength &gridInterval) const noexcept
Get a Point object which is mapped to a specific grid interval.
Definition point.cpp:62
void setPointInch(const QPointF &inches)
Definition point.h:166
Point operator/(LengthBase_t rhs) const
Definition point.h:472
bool operator!=(const Point &rhs) const
Definition point.h:477
static Point fromMil(qreal milsX, qreal milsY)
Definition point.cpp:165
Point & operator*=(LengthBase_t rhs)
Definition point.h:447
Point & operator/=(LengthBase_t rhs)
Definition point.h:457
Point & operator+=(const Point &rhs)
Definition point.h:432
void setPointMm(const QPointF &millimeters)
Definition point.h:158
Point & operator/=(const Point &rhs)
Definition point.h:452
Point & mirror(Qt::Orientation orientation, const Point &center=Point(0, 0)) noexcept
Mirror the point horizontally or vertically around a specific center.
Definition point.cpp:121
void setPointPx(const QPointF &pixels)
Definition point.h:184
bool operator>=(const Point &rhs) const noexcept
Definition point.h:505
bool operator==(const Point &rhs) const
Definition point.h:474
Point & rotate(const Angle &angle, const Point &center=Point(0, 0)) noexcept
Rotate the point by a specific angle with respect to a specific center.
Definition point.cpp:84
The SExpression class.
Definition sexpression.h:69
Definition occmodel.cpp:76
std::size_t qHash(const AttributeKey &key, std::size_t seed=0) noexcept
Definition attributekey.h:118
type_safe::constrained_type< Length, PositiveLengthConstraint, PositiveLengthVerifier > PositiveLength
Definition length.h:810
type_safe::constrained_type< Length, UnsignedLengthConstraint, UnsignedLengthVerifier > UnsignedLength
Definition length.h:694
qint64 LengthBase_t
This type is the ONLY base type to store all lengths (always in nanometers)!
Definition length.h:61
QDataStream & operator<<(QDataStream &stream, const AttributeKey &obj)
Definition attributekey.h:108