OGS
Polyline.h
Go to the documentation of this file.
1 
15 #pragma once
16 
17 #include <cmath>
18 #include <vector>
19 
20 // GeoLib
21 #include "GeoObject.h"
22 #include "LineSegment.h"
23 #include "Point.h"
24 
25 // MathLib
26 #include "MathLib/Point3d.h"
27 
28 namespace GeoLib
29 {
30 enum class Location
31 {
32  LEFT,
33  RIGHT,
34  BEYOND,
35  BEHIND,
36  BETWEEN,
37  SOURCE,
39 };
40 
50 class Polyline : public GeoObject
51 {
52 public:
53  class SegmentIterator final
54  : public std::iterator<std::forward_iterator_tag, LineSegment>
55  {
56  public:
57  explicit SegmentIterator(Polyline const& polyline,
58  std::size_t segment_number);
59 
60  SegmentIterator(SegmentIterator const& src);
61 
62  SegmentIterator() = delete;
63  ~SegmentIterator() = default;
64 
66 
67  std::size_t getSegmentNumber() const;
68 
70 
71  LineSegment operator*() const;
72 
74 
75  bool operator==(SegmentIterator const& other) const;
76 
77  bool operator!=(SegmentIterator const& other) const;
78 
79  SegmentIterator& operator+=(std::vector<GeoLib::Point>::difference_type n);
80 
81  SegmentIterator operator+(std::vector<GeoLib::Point>::difference_type n);
82 
83  SegmentIterator& operator-=(std::vector<GeoLib::Point>::difference_type n);
84 
85  SegmentIterator operator-(std::vector<GeoLib::Point>::difference_type n);
86 
87  private:
89  std::vector<GeoLib::Point*>::size_type _segment_number;
90  };
91 
92  friend class Polygon;
96  explicit Polyline(const std::vector<Point*>& pnt_vec);
101  Polyline(const Polyline& ply);
102  Polyline& operator=(Polyline const& other) = delete;
103 
104  ~Polyline() override = default;
105 
107  GEOTYPE getGeoType() const override { return GEOTYPE::POLYLINE; }
108 
117  virtual bool addPoint(std::size_t pnt_id);
118 
130  virtual bool insertPoint(std::size_t pos, std::size_t pnt_id);
131 
137  virtual void removePoint(std::size_t pos);
138 
142  void closePolyline();
143 
146  static Polyline* constructPolylineFromSegments(const std::vector<Polyline*> &ply_vec,
147  double prox = 0.0);
148 
153  std::size_t getNumberOfPoints() const;
154 
155  std::size_t getNumberOfSegments() const;
156 
158  bool isClosed() const;
159 
161  bool isCoplanar() const;
162 
169  bool isPointIDInPolyline(std::size_t pnt_id) const;
170 
175  std::size_t getPointID(std::size_t i) const;
176 
182  void setPointID(std::size_t idx, std::size_t id);
183 
187  const Point* getPoint(std::size_t i) const;
188 
190  {
191  return SegmentIterator(*this, 0);
192  }
193 
195  {
196  return SegmentIterator(*this, getNumberOfSegments());
197  }
198 
199  std::vector<Point*> const& getPointsVec () const;
200 
208  double getDistanceAlongPolyline(const MathLib::Point3d& pnt,
209  const double epsilon_radius) const;
210 
211 protected:
221  Location getLocationOfPoint(std::size_t k,
222  MathLib::Point3d const& pnt) const;
223 
225  const std::vector<Point*> &_ply_pnts;
227  std::vector<std::size_t> _ply_pnt_ids;
228 
229 private:
230  LineSegment getSegment(std::size_t i) const;
231  LineSegment getSegment(std::size_t i);
232 };
233 
234 bool containsEdge (const Polyline& ply, std::size_t id0, std::size_t id1);
235 
242 bool operator==(Polyline const& lhs, Polyline const& rhs);
243 
244 bool pointsAreIdentical(const std::vector<Point*> &pnt_vec, std::size_t i, std::size_t j,
245  double prox);
246 } // namespace GeoLib
Base class for classes Point, Polyline, Surface.
Definition of the Point3d class.
GeoLib::Polyline const * _polyline
Definition: Polyline.h:88
SegmentIterator & operator++()
Definition: Polyline.cpp:427
SegmentIterator operator-(std::vector< GeoLib::Point >::difference_type n)
Definition: Polyline.cpp:502
SegmentIterator & operator+=(std::vector< GeoLib::Point >::difference_type n)
Definition: Polyline.cpp:454
LineSegment operator*() const
Definition: Polyline.cpp:433
SegmentIterator & operator=(SegmentIterator const &rhs)
Definition: Polyline.cpp:409
bool operator==(SegmentIterator const &other) const
Definition: Polyline.cpp:443
SegmentIterator operator+(std::vector< GeoLib::Point >::difference_type n)
Definition: Polyline.cpp:474
std::vector< GeoLib::Point * >::size_type _segment_number
Definition: Polyline.h:89
std::size_t getSegmentNumber() const
Definition: Polyline.cpp:422
bool operator!=(SegmentIterator const &other) const
Definition: Polyline.cpp:448
SegmentIterator & operator-=(std::vector< GeoLib::Point >::difference_type n)
Definition: Polyline.cpp:482
Class Polyline consists mainly of a reference to a point vector and a vector that stores the indices ...
Definition: Polyline.h:51
GEOTYPE getGeoType() const override
return a geometry type
Definition: Polyline.h:107
double getDistanceAlongPolyline(const MathLib::Point3d &pnt, const double epsilon_radius) const
Definition: Polyline.cpp:353
~Polyline() override=default
std::size_t getPointID(std::size_t i) const
Definition: Polyline.cpp:150
std::size_t getNumberOfSegments() const
Definition: Polyline.cpp:104
static Polyline * constructPolylineFromSegments(const std::vector< Polyline * > &ply_vec, double prox=0.0)
Definition: Polyline.cpp:187
std::size_t getNumberOfPoints() const
Definition: Polyline.cpp:99
const Point * getPoint(std::size_t i) const
returns the i-th point contained in the polyline
Definition: Polyline.cpp:176
virtual bool insertPoint(std::size_t pos, std::size_t pnt_id)
Definition: Polyline.cpp:51
std::vector< std::size_t > _ply_pnt_ids
Definition: Polyline.h:227
void setPointID(std::size_t idx, std::size_t id)
Definition: Polyline.cpp:170
SegmentIterator begin() const
Definition: Polyline.h:189
bool isClosed() const
Definition: Polyline.cpp:109
virtual bool addPoint(std::size_t pnt_id)
Definition: Polyline.cpp:34
const std::vector< Point * > & _ply_pnts
Definition: Polyline.h:225
Polyline & operator=(Polyline const &other)=delete
void closePolyline()
Definition: Polyline.cpp:299
Location getLocationOfPoint(std::size_t k, MathLib::Point3d const &pnt) const
Definition: Polyline.cpp:312
LineSegment getSegment(std::size_t i) const
Definition: Polyline.cpp:156
Polyline(const std::vector< Point * > &pnt_vec)
Definition: Polyline.cpp:27
bool isPointIDInPolyline(std::size_t pnt_id) const
Definition: Polyline.cpp:144
bool isCoplanar() const
Definition: Polyline.cpp:119
SegmentIterator end() const
Definition: Polyline.h:194
virtual void removePoint(std::size_t pos)
Definition: Polyline.cpp:87
std::vector< Point * > const & getPointsVec() const
Definition: Polyline.cpp:182
GEOTYPE
Definition: GeoType.h:25
bool containsEdge(const Polyline &ply, std::size_t id0, std::size_t id1)
Definition: Polyline.cpp:510
bool pointsAreIdentical(const std::vector< Point * > &pnt_vec, std::size_t i, std::size_t j, double prox)
Definition: Polyline.cpp:557
Location
Definition: Polyline.h:31
bool operator==(LineSegment const &s0, LineSegment const &s1)