QCAD
Open Source 2D CAD
Loading...
Searching...
No Matches
RVector.h
Go to the documentation of this file.
1
20#ifndef RVECTOR_H
21#define RVECTOR_H
22
23#include "../core_global.h"
24
25#include <QList>
26#include <QMetaType>
27#include <QMultiMap>
28
29#include "RS.h"
30
31class RMatrix;
32class RBox;
33class RLine;
34class RPolyline;
35class QDebug;
36class QTransform;
37
38#define RDEFAULT_RVECTOR RVector()
39
48public:
52 inline RVector() :
53 x(0.0), y(0.0), z(0.0), valid(true) {
54 }
55
62 // inline explicit RVector(bool v) :
63 // x(0.0), y(0.0), z(0.0), valid(v) {
64 // }
65
69 RVector(double vx, double vy, double vz = 0.0, bool valid_in = true);
70
71 explicit RVector(const QList<double>& tuples);
72
73 ~RVector();
74
78 inline void set(double vx, double vy, double vz = 0.0) {
79 x = vx;
80 y = vy;
81 z = vz;
82 valid = true;
83 }
84 void setPolar(double radius, double angle);
85
86 RVector get2D() const {
87 return RVector(x,y);
88 }
89
90 bool isValid() const;
91 bool isZero() const;
92 bool isSane() const;
93 bool isNaN() const;
94
95 bool isInside(const RBox& b) const;
96
97 bool equalsFuzzy(const RVector& v, double tol = RS::PointTolerance) const;
98 bool equalsFuzzy2D(const RVector& v, double tol = RS::PointTolerance) const;
99 double getDistanceTo(const RVector& v) const;
100 double getDistanceTo2D(const RVector& v) const;
101 void setAngle(double a);
102 double getAngle() const;
103 double getAngleToPlaneXY() const;
104 double getAngleTo(const RVector& v) const;
105 void setMagnitude2D(double m);
106 double getMagnitude() const;
107 double getSquaredMagnitude() const;
108 double getMagnitude2D() const;
109 RVector getLerp(const RVector& v, double t) const;
110 RVector getUnitVector() const;
111 void setX(double x);
112 double getX();
113 void setY(double y);
114 double getY();
115 void setZ(double z);
116 double getZ();
117
118 bool isInWindow(const RVector& firstCorner, const RVector& secondCorner);
119
120 RVector move(const RVector& offset);
121
125 static void moveList(QList<RVector>& list, const RVector& offset);
126
127 RVector rotate(double rotation);
128 RVector rotate(double rotation, const RVector& center);
129 RVector getRotated(double rotation, const RVector& center) const;
130 RVector rotate3D(const RLine& axis, double rotation);
131 RVector rotate3D(const QQuaternion& quaternion);
132
136 static void rotateList(QList<RVector>& list, double rotation);
137
141 static void rotateList(QList<RVector>& list, double rotation, const RVector& center);
142
143 RVector scale(double factor, const RVector& center=nullVector);
144 RVector scale(const RVector& factors, const RVector& center=nullVector);
145 RVector getScaled(const RVector& factors, const RVector& center) const;
146
150 static void scaleList(QList<RVector>& list, double factor, const RVector& center=nullVector);
151
155 static void scaleList(QList<RVector>& list, const RVector& factors, const RVector& center=nullVector);
156
157 RVector mirror(const RLine& axis);
158 RVector getMirrored(const RLine& axis) const;
159 RVector mirror(const RVector& axis1, const RVector& axis2);
160 RVector flipHorizontal();
161 RVector flipVertical();
162 RVector stretch(const RPolyline& area, const RVector& offset);
163 RVector isoProject(RS::IsoProjectionType type);
164 RVector axonometricProjection(RS::IsoProjectionType type);
165 RVector obliqueProjection(RS::IsoProjectionType type);
166 RVector transform(const RMatrix& m);
167 RVector transform2DM(const RMatrix& m);
168 RVector transform2D(const QTransform& t);
169
170 RVector getTransformed(const RMatrix& m) const;
171 RVector getTransformed2DM(const RMatrix& m) const;
172 RVector getTransformed2D(const QTransform& t) const;
173
174 RVector getDividedComponents(const RVector& v) const;
175 RVector getMultipliedComponents(const RVector& v) const;
176
177 RVector getClosest(const QList<RVector>& list) const;
178 RVector getClosest2D(const QList<RVector>& list) const;
179 double getClosestDistance(const QList<RVector>& list, int counts);
180 int getClosestIndex(const QList<RVector>& list, bool ignoreZ = false) const;
181 int getClosestIndex2D(const QList<RVector>& list) const {
182 return getClosestIndex(list, true);
183 }
184
185 RVector operator +(const RVector& v) const;
186 RVector operator -(const RVector& v) const;
187 RVector operator *(double s) const;
188 RVector operator /(double s) const;
189 RVector operator -() const;
190 RVector getNegated() const;
191 RVector getAbsolute() const;
192
193 double dot(const RVector& other) const {
194 return RVector::getDotProduct(*this, other);
195 }
196
197 RVector normalize();
198 RVector getNormalized() const;
199
200 void operator +=(const RVector& v);
201 void operator -=(const RVector& v);
202 void operator *=(double s);
203 void operator /=(double s);
204
205 bool operator ==(const RVector& v) const;
206 bool operator !=(const RVector& v) const {
207 return !operator==(v);
208 }
209
210 RVector getFloor() const;
211 RVector getCeil() const;
212
213 bool lteXY(const RVector& v) const {
214 return RVector::lessThanEqualXY(*this, v);
215 }
216 bool gteXY(const RVector& v) const {
217 return RVector::greaterThanEqualXY(*this, v);
218 }
219
220#if QT_VERSION >= 0x060000
225 RVector copy() const {
226 return *this;
227 }
228#endif
229
230 static bool containsFuzzy(const QList<RVector>& vectors, const RVector& v, double tol = RS::PointTolerance);
231 static int findFirstFuzzy(const QList<RVector>& vectors, const RVector& v, double tol = RS::PointTolerance);
232
233 static RVector getMinimum(const QList<RVector>& vectors);
234 static RVector getMaximum(const QList<RVector>& vectors);
235
236 static RVector getMinimumX(const QList<RVector>& vectors);
237 static RVector getMaximumX(const QList<RVector>& vectors);
238 static RVector getMinimumY(const QList<RVector>& vectors);
239 static RVector getMaximumY(const QList<RVector>& vectors);
240
241 static RVector getMinimum(const RVector& v1, const RVector& v2);
242 static RVector getMaximum(const RVector& v1, const RVector& v2);
243
244 static RVector getAverage(const RVector& v1, const RVector& v2);
245 static RVector getAverage(const QList<RVector>& vectors);
246
247 static QList<RVector> getUnion(const QList<RVector>& vectorsA, const QList<RVector>& vectorsB, double tol = RS::PointTolerance);
248 static QList<RVector> getUnique(const QList<RVector>& vectors, double tol = RS::PointTolerance);
249
250 static QList<double> getXList(const QList<RVector>& vectors);
251 static QList<double> getYList(const QList<RVector>& vectors);
252 static QList<double> getZList(const QList<RVector>& vectors);
253
254 static RVector getCrossProduct(const RVector& v1, const RVector& v2);
255 static double getDotProduct(const RVector& v1, const RVector& v2);
256 static RVector createPolar(double radius, double angle) {
257 RVector ret;
258 ret.setPolar(radius, angle);
259 return ret;
260 }
261
262 static bool lessThanX(const RVector& v1, const RVector& v2) {
263 return v1.x < v2.x;
264 }
265
266 static bool greaterThanX(const RVector& v1, const RVector& v2) {
267 return v1.x > v2.x;
268 }
269
270 static bool lessThanY(const RVector& v1, const RVector& v2) {
271 return v1.y < v2.y;
272 }
273
274 static bool greaterThanY(const RVector& v1, const RVector& v2) {
275 return v1.y > v2.y;
276 }
277
278 static bool lessThanEqualXY(const RVector& v1, const RVector& v2) {
279 return v1.x <= v2.x && v2.y <= v2.y;
280 }
281
282 static bool greaterThanEqualXY(const RVector& v1, const RVector& v2) {
283 return v1.x >= v2.x && v2.y >= v2.y;
284 }
285
286
287 static QList<RVector> getSortedByDistance(const QList<RVector>& list, const RVector& v);
289 public:
290 static bool lessThan(const RVector& v1, const RVector& v2);
291 static RVector v;
292 };
293
294 static QList<RVector> getSortedLeftRightTopBottom(const QList<RVector>& list);
296 public:
297 static bool lessThan(const RVector& v1, const RVector& v2);
298 };
299
300 static QList<RVector> getSortedByAngle(const QList<RVector>& list, const RVector& center, double angle);
302 public:
303 static bool lessThan(const RVector& v1, const RVector& v2);
305 static double angle;
306 };
307
308public:
313 double x;
314
319 double y;
320
325 double z;
326
330 bool valid;
331
335 static const RVector invalid;
336
340 static const RVector nullVector;
341
345 static const RVector nanVector;
346
350 static const RVector zAxis;
351};
352
353QCADCORE_EXPORT RVector operator*(double s, const RVector& v);
354
355QCADCORE_EXPORT QDebug operator<<(QDebug dbg, const RVector& v);
356
360QCADCORE_EXPORT QDataStream& operator<<(QDataStream& stream, const RVector& vector);
361
365QCADCORE_EXPORT QDataStream& operator>>(QDataStream& stream, RVector& vector);
366
367
368Q_DECLARE_METATYPE(QList<RVector>)
369Q_DECLARE_METATYPE(QList<RVector>*)
370typedef QMultiMap<int, RVector> _RMapIntVector;
375
376#endif
Q_DECLARE_METATYPE(RMath *)
QCADCORE_EXPORT RVector operator*(double s, const RVector &v)
Multiplication operator.
Definition RVector.cpp:1219
QCADCORE_EXPORT QDataStream & operator>>(QDataStream &stream, RVector &vector)
Deserializes the given RColor object.
Definition RVector.cpp:1246
QMultiMap< int, RVector > _RMapIntVector
Definition RVector.h:370
QCADCORE_EXPORT QDebug operator<<(QDebug dbg, const RVector &v)
Stream operator for QDebug.
Definition RVector.cpp:1226
Represents a box e.g.
Definition RBox.h:46
Low-level mathematical representation of a line.
Definition RLine.h:41
Simple matrix class.
Definition RMatrix.h:36
Low-level mathematical representation of an open polyline or closed polyline (= polygon).
Definition RPolyline.h:50
static const double PointTolerance
Copyright (c) 2011-2018 by Andrew Mustun.
Definition RS.h:920
IsoProjectionType
Projection type for isometric projections.
Definition RS.h:381
Definition RVector.h:301
static double angle
Definition RVector.h:305
static RVector center
Definition RVector.h:304
Definition RVector.h:288
static RVector v
Definition RVector.h:291
Represents a 3d vector (x/y/z).
Definition RVector.h:47
static bool lessThanY(const RVector &v1, const RVector &v2)
Definition RVector.h:270
static bool greaterThanY(const RVector &v1, const RVector &v2)
Definition RVector.h:274
static double getDotProduct(const RVector &v1, const RVector &v2)
Scalarproduct (dot product).
Definition RVector.cpp:731
static const RVector nullVector
null vector
Definition RVector.h:340
double dot(const RVector &other) const
Definition RVector.h:193
void setPolar(double radius, double angle)
Sets a new position for the vector in polar coordinates.
Definition RVector.cpp:112
static const RVector nanVector
NaN vector.
Definition RVector.h:345
static const RVector zAxis
Z axis vector (default extrusion direction)
Definition RVector.h:350
bool gteXY(const RVector &v) const
Definition RVector.h:216
RVector()
Constructor for a valid null vector (0/0/0).
Definition RVector.h:52
static bool greaterThanEqualXY(const RVector &v1, const RVector &v2)
Definition RVector.h:282
int getClosestIndex2D(const QList< RVector > &list) const
Definition RVector.h:181
static RVector createPolar(double radius, double angle)
Definition RVector.h:256
static const RVector invalid
invalid vector
Definition RVector.h:335
bool lteXY(const RVector &v) const
Definition RVector.h:213
static bool lessThanX(const RVector &v1, const RVector &v2)
Definition RVector.h:262
double x
Getter function for this property: getX Setter function for this property: setX
Definition RVector.h:313
static bool greaterThanX(const RVector &v1, const RVector &v2)
Definition RVector.h:266
RVector get2D() const
Definition RVector.h:86
double y
Getter function for this property: getY Setter function for this property: setY
Definition RVector.h:319
static bool lessThanEqualXY(const RVector &v1, const RVector &v2)
Definition RVector.h:278
void set(double vx, double vy, double vz=0.0)
Sets new values for the vector and makes the vector valid.
Definition RVector.h:78
bool valid
Getter function for this property: isValid
Definition RVector.h:330
double z
Getter function for this property: getZ Setter function for this property: setZ
Definition RVector.h:325
#define QCADCORE_EXPORT
Definition core_global.h:10
void rotate(void e, void angle, void center)
Rotates the given entity or shape by the given angle around the given center.
Definition simple_modify.js:109
void move(void e, void offset)
Moves the given entity or shape by the given offset.
Definition simple_modify.js:58
void scale(void e, void factor, void focusPoint)
Scales the given entity or shape by the given factor with the given focus point.
Definition simple_modify.js:15
void mirror(void e, void axis)
Mirrors the given entity or shape at the given axis.
Definition simple_modify.js:95
ON_DECL ON_2fPoint operator*(int, const ON_2fPoint &)
Definition opennurbs_point.cpp:1718
char s
Definition opennurbs_string.cpp:32
#define true
Definition opennurbs_system.h:248
#define const
Definition zconf.h:156