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::input_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
62 private:
64 std::vector<GeoLib::Point*>::size_type _segment_number;
65 };
66
67 friend class Polygon;
71 explicit Polyline(const std::vector<Point*>& pnt_vec);
76 Polyline(const Polyline& ply);
77 Polyline& operator=(Polyline const& other) = delete;
78
79 ~Polyline() override = default;
80
82 GEOTYPE getGeoType() const override { return GEOTYPE::POLYLINE; }
83
92 virtual bool addPoint(std::size_t pnt_id);
93
105 virtual bool insertPoint(std::size_t pos, std::size_t pnt_id);
106
112 void removePoint(std::size_t pos);
113
118 void closePolyline();
119
123 const std::vector<Polyline*>& ply_vec, double prox = 0.0);
124
129 std::size_t getNumberOfPoints() const;
130
131 std::size_t getNumberOfSegments() const;
132
134 bool isClosed() const;
135
137 bool isCoplanar() const;
138
145 bool isPointIDInPolyline(std::size_t pnt_id) const;
146
151 std::size_t getPointID(std::size_t const i) const;
152
158 void setPointID(std::size_t idx, std::size_t id);
159
163 const Point* getPoint(std::size_t i) const;
164
165 SegmentIterator begin() const { return SegmentIterator(*this, 0); }
166
168 {
169 return SegmentIterator(*this, getNumberOfSegments());
170 }
171
172 std::vector<Point*> const& getPointsVec() const;
173
184 const double epsilon_radius) const;
185
186protected:
188 const std::vector<Point*>& _ply_pnts;
189
190 void reverseOrientation();
191
192 std::vector<std::size_t> const& getPolylinePointIDs() const
193 {
194 return _ply_pnt_ids;
195 }
196
197private:
199 std::vector<std::size_t> _ply_pnt_ids;
200
201 LineSegment getSegment(std::size_t i) const;
202};
203
204bool containsEdge(const Polyline& ply, std::size_t id0, std::size_t id1);
205
207void resetPointIDs(Polyline& polyline, std::vector<std::size_t> const& mapping);
208
210void markUsedPoints(Polyline const& polyline, std::vector<bool>& used_points);
211
218bool operator==(Polyline const& lhs, Polyline const& rhs);
219
220bool pointsAreIdentical(const std::vector<Point*>& pnt_vec, std::size_t i,
221 std::size_t j, double prox);
222
224std::unique_ptr<Polyline> createPolyline(GeoLib::PointVec const& points_vec,
225 std::vector<std::size_t>&& point_ids);
226
227} // 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:63
SegmentIterator & operator++()
Definition Polyline.cpp:381
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
std::input_iterator_tag iterator_category
Definition Polyline.h:34
std::vector< GeoLib::Point * >::size_type _segment_number
Definition Polyline.h:64
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
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:82
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:67
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:199
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:165
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:188
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:192
bool isCoplanar() const
Definition Polyline.cpp:118
SegmentIterator end() const
Definition Polyline.h:167
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:438
bool pointsAreIdentical(const std::vector< Point * > &pnt_vec, std::size_t i, std::size_t j, double prox)
Definition Polyline.cpp:485
void markUsedPoints(Polyline const &polyline, std::vector< bool > &used_points)
Resets the point IDs of the polyline corresponding to the mapping.
Definition Polyline.cpp:423
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:408
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:497