ActiveLib
Loading...
Searching...
No Matches
Polygon.h
1
6#ifndef ACTIVE_GEOMETRY_POLYGON
7#define ACTIVE_GEOMETRY_POLYGON
8
9#include "Active/Container/List.h"
10#include "Active/Container/Vector.h"
11#include "Active/Geometry/Box.h"
12#include "Active/Geometry/PolyPoint.h"
13#include "Active/Geometry/Rotation.h"
14#include "Active/Geometry/XPoint.h"
15#include "Active/Utility/Cloner.h"
16
17namespace active::geometry {
18
19 class Arc;
20 class Line;
21 class LinEquation;
22 class Plane;
23 class PolyEdge;
24 class PolyVector;
25 class PolyVector;
26 class XList;
27
57 class Polygon : public container::Vector<PolyPoint>, public utility::Cloner, public utility::Mover {
58 public:
59
60 //MARK: - Types
61
65 using Unique = std::unique_ptr<Polygon>;
67 using Shared = std::shared_ptr<Polygon>;
69 using Option = std::optional<Polygon>;
70
72 static const vertex_index defSize = 5;
73
74 struct Index {
75 part_index part = 0;
76 vertex_index vertex = 0;
77 const PolyPoint* point = nullptr;
78 };
79
80 using enum Rotation;
81
82 //MARK: - Constructors
83
90 Polygon(vertex_index size = defSize, part_index holeSize = 0, bool isClosed = true);
96 Polygon(const std::initializer_list<PolyPoint>& points, bool isClosed = true) : base(points) { this->isClosed = isClosed; }
102 Polygon(const Box& source, double angle = 0.0);
107 Polygon(const Polygon& source);
112 Polygon(Polygon&& source) noexcept;
116 virtual ~Polygon() = default;
117
122 virtual Polygon* clonePtr() const { return new Polygon(*this); }
127 virtual Polygon* movePtr() { return new Polygon(std::move(*this)); }
132 virtual Polygon::Unique cloneGeometry() const;
133
134 // MARK: - Public variables
135
137 bool isHole = false;
139 bool isClosed = true;
140
141 // MARK: - Operators
142
148 virtual Polygon& operator= (const Polygon& source);
154 virtual Polygon& operator= (Polygon&& source) noexcept;
166 const PolyPoint* operator[] (vertex_index index) const;
172 Polygon operator+ (const Point& offset) const;
178 Polygon& operator+= (const Point& offset);
184 Polygon operator- (const Point& offset) const;
190 Polygon& operator-= (const Point& offset);
196 Polygon operator* (const double& mult) const;
202 Polygon& operator*= (const double& mult);
208 Polygon operator* (const Matrix3x3& mult) const;
214 Polygon& operator*= (const Matrix3x3& mult);
220 Polygon operator* (const Matrix4x4& mult) const;
226 Polygon& operator*= (const Matrix4x4& mult);
232 Polygon operator/ (const double& mult) const;
238 Polygon& operator/= (const double& mult);
239
240 //MARK: - Functions (const)
241
248 virtual bool isValid(bool doIntersect = false, double prec = math::eps) const;
255 bool isEqual2D(const Polygon& ref, double prec = math::eps) const;
262 bool isEqual3D(const Polygon& ref, double prec = math::eps) const;
268 vertex_index vertSize(bool isOuter = true) const;
273 vertex_index edgeSize() const { return isClosed ? vertSize() : vertSize() - 1; }
278 part_index getHoleSize() const;
283 vertex_id getTopID() const { return m_topID; }
289 Polygon* getHole(part_index which) const;
294 PolyVector* getHoles() const { return m_hole.get(); }
299 std::optional<Rotation> getDirection() const;
304 Box::Option bounds() const;
309 double getPerimeter2D() const;
314 double getPerimeter3D() const;
321 vertex_index tracePerimeter(double len, PolyPoint& endPos) const;
328 double getArea(bool isNet = true, bool isResultSigned = false) const;
334 double getInternalAngleAt(vertex_index index) const;
341 bool isTangentialAt(vertex_index vertex, double anglePrec = math::epsAngle) const;
349 bool isReflection(vertex_index index, const LinEquation& ref, double prec = math::eps) const;
360 std::optional<Index> findVertexById(vertex_id ID) const;
367 std::optional<Index> findVertexByLocation(const Point& pt, double prec = math::eps) const;
373 const Polygon& getShape(part_index index) const;
404 XPoint closestPointAlong3D(const Point& ref, bool withHoles, double prec = math::eps) const;
411 XPoint closestPointAlong2D(const Point& ref, bool withHoles, double prec = math::eps) const;
418 Position positionOf(const Point& ref, double prec = math::eps) const;
426 vertex_index intersectionWith(const Line& ref, XList& inter, double prec = math::eps) const;
434 vertex_index intersectionWith(const Arc& ref, XList& inter, double prec = math::eps) const;
442 vertex_index intersectionWith(const PolyEdge& ref, XList& inter, double prec = math::eps) const;
450 vertex_index intersectionWith(const Polygon& ref, XList& inter, double prec = math::eps) const;
458 void splitWith(const LinEquation& ref, PolyVector* polyRight = nullptr, PolyVector* polyLeft = nullptr, double prec = math::eps) const;
466 void splitWith(const Polygon& ref, PolyVector* polyIn = nullptr, PolyVector* polyOut = nullptr, double prec = math::eps) const;
473 part_index resolveSelfIntersect(PolyVector& resolved, double prec = math::eps) const;
480 bool crosses(const Line& ref, double prec = math::eps) const;
487 bool encloses(const Point& ref, double prec = math::eps) const;
494 bool encloses(const Polygon& ref, double prec = math::eps) const;
501 bool overlaps(const Polygon& ref, double prec = math::eps) const;
502
503 //MARK: - Functions (mutating)
504
509 vertex_id allocateID() { return ++m_topID; }
514 void setTopID(vertex_id topId) { m_topID = topId; }
520 void clear(bool allVertices = true, bool allHoles = true);
526 Polygon* insertHole(const Polygon& hole);
532 Polygon* insertHole(Polygon* hole = nullptr);
544 Polygon* emplaceHole(Polygon&& hole);
549 void setHoles(std::unique_ptr<PolyVector>&& holes = nullptr);
554 void setHoles(PolyVector&& hole);
559 void removeHole(part_index which);
573 vertex_id addNodeAlong(vertex_id ID, const Point& pos, double prec = math::eps);
580 virtual bool insertUniqueVertex(PolyPoint&& pt, vertOption where = std::nullopt);
585 std::unique_ptr<PolyVector> releaseHoles();
592 virtual void setDirection(Rotation direct = clockwise, bool withHoles = true, bool invertHoleDir = false);
596 virtual void reverse();
602 bool removeDuplicates2D(double prec = math::eps);
608 bool removeDuplicates3D(double prec = math::eps);
614 void optimise(bool doColin = false, double prec = math::eps);
618 void renumber(bool restart = false);
622 void facet();
627 void setBaseLevel(double z = 0);
632 void alignTo(const Plane& plane);
633
634 private:
636 std::unique_ptr<PolyVector> m_hole;
638 vertex_id m_topID = 0;
639 };
640
641
643 class PolyVector : public container::Vector<Polygon> {
644 public:
645
646 //MARK: - Types
647
651 using size_type = typename base::size_type;
653 using Unique = std::unique_ptr<PolyVector>;
655 using Shared = std::shared_ptr<PolyVector>;
657 using Option = std::optional<PolyVector>;
658
659 //MARK: - Constructors
660
665 PolyVector(size_type toReserve = 0) : base(toReserve) {}
670 PolyVector(const PolyVector& source) : base(source) {}
674 virtual ~PolyVector() = default;
675
676 //MARK: - Functions (const)
677
683
684 //MARK: - Functions (mutating)
685
691 };
692
693}
694
695#endif //ACTIVE_GEOMETRY_POLYGON
Definition Vector.h:26
typename base::size_type size_type
Container size (index) type.
Definition Vector.h:36
typename base::iterator iterator
Container iterator type.
Definition Vector.h:38
typename base::const_iterator const_iterator
Container const iterator type.
Definition Vector.h:40
Class to represent an arc.
Definition Arc.h:25
Definition Box.h:19
std::optional< Box > Option
Optional.
Definition Box.h:31
Class to represent a linear equation.
Definition LinEquation.h:19
Class to represent a line.
Definition Line.h:21
A 3x3 matrix class.
Definition Matrix3x3.h:16
A 4x4 matrix class.
Definition Matrix4x4.h:14
Class to represent a plane.
Definition Plane.h:21
Definition Point.h:36
std::optional< Point > Option
Optional.
Definition Point.h:48
Definition PolyEdge.h:25
Definition PolyPoint.h:24
A vector of polygons.
Definition Polygon.h:643
const_iterator findLargest() const
Definition Polygon.cpp:2405
PolyVector(const PolyVector &source)
Definition Polygon.h:670
std::optional< PolyVector > Option
Optional.
Definition Polygon.h:657
typename base::size_type size_type
Size type for indexing etc.
Definition Polygon.h:651
virtual ~PolyVector()=default
PolyVector(size_type toReserve=0)
Definition Polygon.h:665
std::shared_ptr< PolyVector > Shared
Shared pointer.
Definition Polygon.h:655
std::unique_ptr< PolyVector > Unique
Unique pointer.
Definition Polygon.h:653
Definition Polygon.h:57
std::optional< Index > findVertexByLocation(const Point &pt, double prec=math::eps) const
Definition Polygon.cpp:1048
vertex_id getTopID() const
Definition Polygon.h:283
virtual Polygon & operator=(const Polygon &source)
Definition Polygon.cpp:652
const Polygon & getShape(part_index index) const
Definition Polygon.cpp:1067
void setHoles(PolyVector &&hole)
virtual bool isValid(bool doIntersect=false, double prec=math::eps) const
Definition Polygon.cpp:911
Polygon(vertex_index size=defSize, part_index holeSize=0, bool isClosed=true)
Definition Polygon.cpp:570
Box::Option bounds() const
Definition Polygon.cpp:1117
void setBaseLevel(double z=0)
Definition Polygon.cpp:2375
static const vertex_index defSize
The default number of vertices in a new polygon.
Definition Polygon.h:72
vertex_index intersectionWith(const Line &ref, XList &inter, double prec=math::eps) const
Definition Polygon.cpp:1513
double getArea(bool isNet=true, bool isResultSigned=false) const
Definition Polygon.cpp:1216
Polygon operator*(const double &mult) const
Definition Polygon.cpp:753
virtual bool insertUniqueVertex(PolyPoint &&pt, vertOption where=std::nullopt)
Definition Polygon.cpp:2204
virtual ~Polygon()=default
bool isEqual3D(const Polygon &ref, double prec=math::eps) const
Definition Polygon.cpp:964
void removeHole(part_index which)
Definition Polygon.cpp:2094
XPoint closestPointAlong3D(const Point &ref, bool withHoles, double prec=math::eps) const
Definition Polygon.cpp:1469
std::unique_ptr< Polygon > Unique
Unique pointer.
Definition Polygon.h:65
XPoint closestPointAlong2D(const Point &ref, bool withHoles, double prec=math::eps) const
Definition Polygon.cpp:1428
double getPerimeter2D() const
Definition Polygon.cpp:1152
vertex_index wrapIndex(vertex_index index) const
Definition Polygon.cpp:1246
bool isTangentialAt(vertex_index vertex, double anglePrec=math::epsAngle) const
Definition Polygon.cpp:1280
void renumber(bool restart=false)
Definition Polygon.cpp:2334
Polygon & operator*=(const double &mult)
Definition Polygon.cpp:765
vertex_index edgeSize() const
Definition Polygon.h:273
Polygon operator-(const Point &offset) const
Definition Polygon.cpp:724
std::shared_ptr< Polygon > Shared
Shared pointer.
Definition Polygon.h:67
void facet()
Definition Polygon.cpp:2355
base::iterator iteratorAt(vertex_index index)
Definition Polygon.cpp:1091
Polygon operator/(const double &mult) const
Definition Polygon.cpp:856
Polygon & operator+=(const Point &offset)
Definition Polygon.cpp:707
double getInternalAngleAt(vertex_index index) const
Definition Polygon.cpp:1262
virtual void reverse()
Definition Polygon.cpp:2236
void alignTo(const Plane &plane)
Definition Polygon.cpp:2390
virtual Polygon * movePtr()
Definition Polygon.h:127
Polygon operator+(const Point &offset) const
Definition Polygon.cpp:695
bool removeDuplicates3D(double prec=math::eps)
Definition Polygon.cpp:2285
double getPerimeter3D() const
Definition Polygon.cpp:1165
bool overlaps(const Polygon &ref, double prec=math::eps) const
Definition Polygon.cpp:1965
void splitWith(const LinEquation &ref, PolyVector *polyRight=nullptr, PolyVector *polyLeft=nullptr, double prec=math::eps) const
Definition Polygon.cpp:1621
std::unique_ptr< PolyVector > releaseHoles()
Definition Polygon.cpp:2136
vertex_index tracePerimeter(double len, PolyPoint &endPos) const
Definition Polygon.cpp:1181
Polygon(const std::initializer_list< PolyPoint > &points, bool isClosed=true)
Definition Polygon.h:96
void setHoles(std::unique_ptr< PolyVector > &&holes=nullptr)
std::optional< Rotation > getDirection() const
Definition Polygon.cpp:1140
Polygon & operator-=(const Point &offset)
Definition Polygon.cpp:736
bool isEqual2D(const Polygon &ref, double prec=math::eps) const
Definition Polygon.cpp:940
PolyPoint * operator[](vertex_index index)
Definition Polygon.cpp:885
Polygon * emplaceHole(Polygon::Unique &&hole)
Definition Polygon.cpp:2067
bool isHole
True if the polygon is a hole.
Definition Polygon.h:137
bool isClosed
True if the polygon is closed, i.e. an edge is assumed from the last vertex to the first.
Definition Polygon.h:139
void optimise(bool doColin=false, double prec=math::eps)
Definition Polygon.cpp:2311
void clear(bool allVertices=true, bool allHoles=true)
Definition Polygon.cpp:2026
bool removeDuplicates2D(double prec=math::eps)
Definition Polygon.cpp:2258
bool encloses(const Point &ref, double prec=math::eps) const
Definition Polygon.cpp:1887
virtual Polygon::Unique cloneGeometry() const
Definition Polygon.cpp:633
virtual void setDirection(Rotation direct=clockwise, bool withHoles=true, bool invertHoleDir=false)
Definition Polygon.cpp:2222
vertex_id addNodeAlong(vertex_id ID, const Point &pos, double prec=math::eps)
Definition Polygon.cpp:2150
void setTopID(vertex_id topId)
Definition Polygon.h:514
bool crosses(const Line &ref, double prec=math::eps) const
Definition Polygon.cpp:1860
Polygon & operator/=(const double &mult)
Definition Polygon.cpp:868
Polygon * getHole(part_index which) const
Definition Polygon.cpp:1014
vertex_index vertSize(bool isOuter=true) const
Definition Polygon.cpp:987
part_index getHoleSize() const
Definition Polygon.cpp:1002
std::optional< Polygon > Option
Optional.
Definition Polygon.h:69
Point::Option getInternalPoint() const
Definition Polygon.cpp:1324
PolyVector * getHoles() const
Definition Polygon.h:294
part_index resolveSelfIntersect(PolyVector &resolved, double prec=math::eps) const
Definition Polygon.cpp:1795
Polygon::Unique releaseHole(part_index which)
Definition Polygon.cpp:2110
Position positionOf(const Point &ref, double prec=math::eps) const
Definition Polygon.cpp:1356
Polygon * insertHole(const Polygon &hole)
Definition Polygon.cpp:2043
virtual Polygon * clonePtr() const
Definition Polygon.h:122
bool isReflection(vertex_index index, const LinEquation &ref, double prec=math::eps) const
Definition Polygon.cpp:1296
vertex_id allocateID()
Definition Polygon.h:509
std::optional< Index > findVertexById(vertex_id ID) const
Definition Polygon.cpp:1028
Definition XList.h:24
Definition XPoint.h:25
Definition Cloner.h:17
Definition Mover.h:17
Definition Anchor2D.h:11
std::optional< vertex_index > vertOption
Optional vertex index (for an undefined or missing vertex index)
Definition Point.h:24
int32_t vertex_index
Index of a vertex, e.g. within a polygon.
Definition Point.h:22
Position
Relative spatial position.
Definition Position.h:12
int32_t part_index
Index of a part, e.g. a hole within a polygon.
Definition Point.h:26
Rotation
Arc direction of travel.
Definition Rotation.h:12
@ clockwise
Clockwise direction.
constexpr double eps
Default length precision (0.01mm)
Definition MathFunctions.h:22
constexpr double epsAngle
Default angle precision (0.1 degrees)
Definition MathFunctions.h:24
Definition Polygon.h:74