OGS
Polyline.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include <cmath>
7#include <vector>
8
9// GeoLib
10#include "GeoObject.h"
11#include "LineSegment.h"
12#include "Point.h"
13
14// MathLib
15#include "MathLib/Point3d.h"
16
17namespace GeoLib
18{
19class PointVec;
20
28class Polyline : public GeoObject
29{
30public:
31 class SegmentIterator final
32 {
33 public:
34 using iterator_category = std::forward_iterator_tag;
36 using difference_type = std::ptrdiff_t;
39
40 explicit SegmentIterator(Polyline const& polyline,
41 std::size_t segment_number);
42
44
45 SegmentIterator() = delete;
46 ~SegmentIterator() = default;
47
49
50 std::size_t getSegmentNumber() const;
51
53
54 LineSegment operator*() const;
55
57
58 bool operator==(SegmentIterator const& other) const;
59
60 bool operator!=(SegmentIterator const& other) const;
61
63 std::vector<GeoLib::Point>::difference_type n);
64
66 std::vector<GeoLib::Point>::difference_type n);
67
69 std::vector<GeoLib::Point>::difference_type n);
70
72 std::vector<GeoLib::Point>::difference_type n);
73
74 private:
76 std::vector<GeoLib::Point*>::size_type _segment_number;
77 };
78
79 friend class Polygon;
83 explicit Polyline(const std::vector<Point*>& pnt_vec);
88 Polyline(const Polyline& ply);
89 Polyline& operator=(Polyline const& other) = delete;
90
91 ~Polyline() override = default;
92
94 GEOTYPE getGeoType() const override { return GEOTYPE::POLYLINE; }
95
104 virtual bool addPoint(std::size_t pnt_id);
105
117 virtual bool insertPoint(std::size_t pos, std::size_t pnt_id);
118
124 void removePoint(std::size_t pos);
125
130 void closePolyline();
131
135 const std::vector<Polyline*>& ply_vec, double prox = 0.0);
136
141 std::size_t getNumberOfPoints() const;
142
143 std::size_t getNumberOfSegments() const;
144
146 bool isClosed() const;
147
149 bool isCoplanar() const;
150
157 bool isPointIDInPolyline(std::size_t pnt_id) const;
158
163 std::size_t getPointID(std::size_t const i) const;
164
170 void setPointID(std::size_t idx, std::size_t id);
171
175 const Point* getPoint(std::size_t i) const;
176
177 SegmentIterator begin() const { return SegmentIterator(*this, 0); }
178
180 {
181 return SegmentIterator(*this, getNumberOfSegments());
182 }
183
184 std::vector<Point*> const& getPointsVec() const;
185
196 const double epsilon_radius) const;
197
198protected:
200 const std::vector<Point*>& _ply_pnts;
201
202 void reverseOrientation();
203
204 std::vector<std::size_t> const& getPolylinePointIDs() const
205 {
206 return _ply_pnt_ids;
207 }
208
209private:
211 std::vector<std::size_t> _ply_pnt_ids;
212
213 LineSegment getSegment(std::size_t i) const;
214};
215
216bool containsEdge(const Polyline& ply, std::size_t id0, std::size_t id1);
217
219void resetPointIDs(Polyline& polyline, std::vector<std::size_t> const& mapping);
220
222void markUsedPoints(Polyline const& polyline, std::vector<bool>& used_points);
223
230bool operator==(Polyline const& lhs, Polyline const& rhs);
231
232bool pointsAreIdentical(const std::vector<Point*>& pnt_vec, std::size_t i,
233 std::size_t j, double prox);
234
236std::unique_ptr<Polyline> createPolyline(GeoLib::PointVec const& points_vec,
237 std::vector<std::size_t>&& point_ids);
238
239} // namespace GeoLib
This class manages pointers to Points in a std::vector along with a name. It also handles the deletio...
Definition PointVec.h:25
GeoLib::Polyline const * _polyline
Definition Polyline.h:75
std::forward_iterator_tag iterator_category
Definition Polyline.h:34
SegmentIterator & operator++()
Definition Polyline.cpp:381
SegmentIterator operator-(std::vector< GeoLib::Point >::difference_type n)
Definition Polyline.cpp:456
SegmentIterator & operator+=(std::vector< GeoLib::Point >::difference_type n)
Definition Polyline.cpp:408
LineSegment operator*() const
Definition Polyline.cpp:387
SegmentIterator & operator=(SegmentIterator const &rhs)
Definition Polyline.cpp:363
bool operator==(SegmentIterator const &other) const
Definition Polyline.cpp:397
SegmentIterator operator+(std::vector< GeoLib::Point >::difference_type n)
Definition Polyline.cpp:428
std::vector< GeoLib::Point * >::size_type _segment_number
Definition Polyline.h:76
std::size_t getSegmentNumber() const
Definition Polyline.cpp:376
bool operator!=(SegmentIterator const &other) const
Definition Polyline.cpp:402
SegmentIterator(Polyline const &polyline, std::size_t segment_number)
Definition Polyline.cpp:350
SegmentIterator & operator-=(std::vector< GeoLib::Point >::difference_type n)
Definition Polyline.cpp:436
Class Polyline consists mainly of a reference to a point vector and a vector that stores the indices ...
Definition Polyline.h:29
GEOTYPE getGeoType() const override
return a geometry type
Definition Polyline.h:94
double getDistanceAlongPolyline(const MathLib::Point3d &pnt, const double epsilon_radius) const
Definition Polyline.cpp:304
std::size_t getPointID(std::size_t const i) const
Definition Polyline.cpp:149
~Polyline() override=default
Polyline & operator=(Polyline const &other)=delete
friend class Polygon
Definition Polyline.h:79
std::size_t getNumberOfSegments() const
Definition Polyline.cpp:103
static Polyline * constructPolylineFromSegments(const std::vector< Polyline * > &ply_vec, double prox=0.0)
Definition Polyline.cpp:179
std::size_t getNumberOfPoints() const
Definition Polyline.cpp:98
const Point * getPoint(std::size_t i) const
returns the i-th point contained in the polyline
Definition Polyline.cpp:168
virtual bool insertPoint(std::size_t pos, std::size_t pnt_id)
Definition Polyline.cpp:44
std::vector< std::size_t > _ply_pnt_ids
Definition Polyline.h:211
void setPointID(std::size_t idx, std::size_t id)
Definition Polyline.cpp:162
void reverseOrientation()
Definition Polyline.cpp:345
SegmentIterator begin() const
Definition Polyline.h:177
bool isClosed() const
Definition Polyline.cpp:108
virtual bool addPoint(std::size_t pnt_id)
Definition Polyline.cpp:24
const std::vector< Point * > & _ply_pnts
Definition Polyline.h:200
LineSegment getSegment(std::size_t i) const
Definition Polyline.cpp:155
Polyline(const std::vector< Point * > &pnt_vec)
Definition Polyline.cpp:17
bool isPointIDInPolyline(std::size_t pnt_id) const
Definition Polyline.cpp:143
std::vector< std::size_t > const & getPolylinePointIDs() const
Definition Polyline.h:204
bool isCoplanar() const
Definition Polyline.cpp:118
SegmentIterator end() const
Definition Polyline.h:179
void removePoint(std::size_t pos)
Definition Polyline.cpp:86
std::vector< Point * > const & getPointsVec() const
Definition Polyline.cpp:174
bool containsEdge(const Polyline &ply, std::size_t id0, std::size_t id1)
Definition Polyline.cpp:494
bool pointsAreIdentical(const std::vector< Point * > &pnt_vec, std::size_t i, std::size_t j, double prox)
Definition Polyline.cpp:541
void markUsedPoints(Polyline const &polyline, std::vector< bool > &used_points)
Resets the point IDs of the polyline corresponding to the mapping.
Definition Polyline.cpp:479
GEOTYPE
Definition GeoType.h:12
void resetPointIDs(Polyline &polyline, std::vector< std::size_t > const &mapping)
Resets the point IDs of the polyline corresponding to the mapping.
Definition Polyline.cpp:464
bool operator==(LineSegment const &s0, LineSegment const &s1)
std::unique_ptr< Polyline > createPolyline(GeoLib::PointVec const &points_vec, std::vector< std::size_t > &&point_ids)
Create a polyline from given point ids.
Definition Polyline.cpp:553