Eclipse SUMO - Simulation of Urban MObility
PositionVector.h
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2001-2019 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
17 // A list of positions
18 /****************************************************************************/
19 #ifndef PositionVector_h
20 #define PositionVector_h
21 
22 
23 // ===========================================================================
24 // included modules
25 // ===========================================================================
26 #include <config.h>
27 
28 #include <vector>
29 #include <limits>
30 #include "AbstractPoly.h"
31 
32 
33 // ===========================================================================
34 // class declarations
35 // ===========================================================================
36 
37 class Boundary;
38 
39 // ===========================================================================
40 // class definitions
41 // ===========================================================================
46 class PositionVector : public AbstractPoly, private std::vector<Position> {
47 
48 private:
50  typedef std::vector<Position> vp;
51 
52 public:
55 
58  PositionVector(const std::vector<Position>& v);
59 
63  PositionVector(const std::vector<Position>::const_iterator beg, const std::vector<Position>::const_iterator end);
64 
68  PositionVector(const Position& p1, const Position& p2);
69 
72 
74  static const PositionVector EMPTY;
75 
79  using vp::iterator;
80 
82  using vp::const_iterator;
83 
85  using vp::const_reference;
86 
88  using vp::value_type;
89 
91  using vp::begin;
92 
94  using vp::end;
95 
97  using vp::push_back;
98 
100  using vp::pop_back;
101 
103  using vp::clear;
105  using vp::size;
106 
108  using vp::front;
109 
111  using vp::back;
112 
114  using vp::reference;
115 
117  using vp::erase;
118 
120  using vp::insert;
122 
125  bool around(const Position& p, double offset = 0) const;
126 
129  bool overlapsWith(const AbstractPoly& poly, double offset = 0) const;
130 
132  double getOverlapWith(const PositionVector& poly, double zThreshold) const;
133 
135  bool intersects(const Position& p1, const Position& p2) const;
136 
138  bool intersects(const PositionVector& v1) const;
139 
141  Position intersectionPosition2D(const Position& p1, const Position& p2, const double withinDist = 0.) const;
142 
144  std::vector<double> intersectsAtLengths2D(const PositionVector& other) const;
145 
147  std::vector<double> intersectsAtLengths2D(const Position& lp1, const Position& lp2) const;
148 
151 
153  void closePolygon();
154 
157  const Position& operator[](int index) const;
158 
160  Position& operator[](int index);
161 
163  Position positionAtOffset(double pos, double lateralOffset = 0) const;
164 
166  Position positionAtOffset2D(double pos, double lateralOffset = 0) const;
167 
169  double rotationAtOffset(double pos) const;
170 
172  double rotationDegreeAtOffset(double pos) const;
173 
175  double slopeDegreeAtOffset(double pos) const;
176 
178  static Position positionAtOffset(const Position& p1, const Position& p2, double pos, double lateralOffset = 0.);
179 
181  static Position positionAtOffset2D(const Position& p1, const Position& p2, double pos, double lateralOffset = 0.);
182 
184  Boundary getBoxBoundary() const;
185 
188  Position getPolygonCenter() const;
189 
191  Position getCentroid() const;
192 
194  void scaleRelative(double factor);
195 
197  void scaleAbsolute(double offset);
198 
200  Position getLineCenter() const;
201 
203  double length() const;
204 
206  double length2D() const;
207 
209  double area() const;
210 
212  bool partialWithin(const AbstractPoly& poly, double offset = 0) const;
213 
215  std::pair<PositionVector, PositionVector> splitAt(double where, bool use2D = false) const;
216 
218  friend std::ostream& operator<<(std::ostream& os, const PositionVector& geom);
219 
221  bool crosses(const Position& p1, const Position& p2) const;
222 
224  void add(double xoff, double yoff, double zoff);
225 
227  void add(const Position& offset);
228 
230  void sub(double xoff, double yoff, double zoff);
231 
233  void sub(const Position& offset);
234 
236  PositionVector added(const Position& offset) const;
237 
239  void mirrorX();
240 
242  void rotate2D(double angle);
243 
245  void append(const PositionVector& v, double sameThreshold = 2.0);
246 
248  PositionVector getSubpart(double beginOffset, double endOffset) const;
249 
251  PositionVector getSubpart2D(double beginOffset, double endOffset) const;
252 
254  PositionVector getSubpartByIndex(int beginIndex, int count) const;
255 
257  void sortAsPolyCWByAngle();
258 
260  void sortByIncreasingXY();
261 
263  void extrapolate(const double val, const bool onlyFirst = false, const bool onlyLast = false);
264 
266  void extrapolate2D(const double val, const bool onlyFirst = false);
267 
269  PositionVector reverse() const;
270 
272  static Position sideOffset(const Position& beg, const Position& end, const double amount);
273 
275  void move2side(double amount, double maxExtension = 100);
276 
278  void move2side(std::vector<double> amount, double maxExtension = 100);
279 
281  double angleAt2D(int pos) const;
282 
284  int insertAtClosest(const Position& p);
285 
287  int removeClosest(const Position& p);
288 
290  bool operator==(const PositionVector& v2) const;
291 
293  bool operator!=(const PositionVector& v2) const;
294 
296  PositionVector operator-(const PositionVector& v2) const;
297 
299  PositionVector operator+(const PositionVector& v2) const;
300 
303  public:
306 
308  int operator()(const Position& p1, const Position& p2) const;
309  };
310 
313  public:
315  explicit increasing_x_y_sorter();
316 
318  int operator()(const Position& p1, const Position& p2) const;
319  };
320 
323  double isLeft(const Position& P0, const Position& P1, const Position& P2) const;
324 
326  double beginEndAngle() const;
327 
329  double nearest_offset_to_point2D(const Position& p, bool perpendicular = true) const;
330 
332  double nearest_offset_to_point25D(const Position& p, bool perpendicular = true) const;
333 
341  Position transformToVectorCoordinates(const Position& p, bool extend = false) const;
342 
345  int indexOfClosest(const Position& p) const;
346 
349  std::vector<double> distances(const PositionVector& s, bool perpendicular = false) const;
350 
352  double distance2D(const Position& p, bool perpendicular = false) const;
353 
355  void push_back_noDoublePos(const Position& p);
356 
358  void push_front_noDoublePos(const Position& p);
359 
361  void insert_noDoublePos(const std::vector<Position>::iterator& at, const Position& p);
362 
364  bool isClosed() const;
365 
367  bool isNAN() const;
368 
373  void removeDoublePoints(double minDist = POSITION_EPS, bool assertLength = false);
374 
376  bool hasElevation() const;
377 
379  PositionVector simplified() const;
380 
387  PositionVector getOrthogonal(const Position& p, double extend, bool before, double length = 1.0) const;
388 
390  PositionVector smoothedZFront(double dist = std::numeric_limits<double>::max()) const;
391 
393  PositionVector interpolateZ(double zStart, double zEnd) const;
394 
396  PositionVector resample(double maxLength) const;
397 
399  double offsetAtIndex2D(int index) const;
400 
401  /* @brief return the maximum grade of all segments as a fraction of zRange/length2D
402  * @param[out] maxJump The maximum vertical jump (with grade infinity)
403  */
404  double getMaxGrade(double& maxJump) const;
405 
407  PositionVector bezier(int numPoints);
408 
409 private:
411  static bool intersects(const Position& p11, const Position& p12, const Position& p21, const Position& p22, const double withinDist = 0., double* x = 0, double* y = 0, double* mu = 0);
412 };
413 
414 
415 #endif
416 
417 /****************************************************************************/
418 
PositionVector::nearest_offset_to_point25D
double nearest_offset_to_point25D(const Position &p, bool perpendicular=true) const
return the nearest offest to point 2D projected onto the 3D geometry
Definition: PositionVector.cpp:845
AbstractPoly
Definition: AbstractPoly.h:36
PositionVector::operator==
bool operator==(const PositionVector &v2) const
comparing operation
Definition: PositionVector.cpp:1323
PositionVector::beginEndAngle
double beginEndAngle() const
returns the angle in radians of the line connecting the first and the last position
Definition: PositionVector.cpp:800
PositionVector::vp
std::vector< Position > vp
vector of position
Definition: PositionVector.h:50
PositionVector::getPolygonCenter
Position getPolygonCenter() const
Returns the arithmetic of all corner points.
Definition: PositionVector.cpp:392
PositionVector::getSubpartByIndex
PositionVector getSubpartByIndex(int beginIndex, int count) const
get subpart of a position vector using index and a cout
Definition: PositionVector.cpp:781
PositionVector::simplified
PositionVector simplified() const
return the same shape with intermediate colinear points removed
Definition: PositionVector.cpp:1475
PositionVector::intersectsAtLengths2D
std::vector< double > intersectsAtLengths2D(const PositionVector &other) const
For all intersections between this vector and other, return the 2D-length of the subvector from this ...
Definition: PositionVector.cpp:991
PositionVector::isLeft
double isLeft(const Position &P0, const Position &P1, const Position &P2) const
get left
Definition: PositionVector.cpp:682
PositionVector::getSubpart2D
PositionVector getSubpart2D(double beginOffset, double endOffset) const
get subpart of a position vector in two dimensions (Z is ignored)
Definition: PositionVector.cpp:738
PositionVector::operator[]
const Position & operator[](int index) const
returns the constat position at the given index @ToDo !!! exceptions?
Definition: PositionVector.cpp:208
PositionVector::insertAtClosest
int insertAtClosest(const Position &p)
inserts p between the two closest positions and returns the insertion index
Definition: PositionVector.cpp:951
PositionVector::rotate2D
void rotate2D(double angle)
Definition: PositionVector.cpp:1460
PositionVector::overlapsWith
bool overlapsWith(const AbstractPoly &poly, double offset=0) const
Returns the information whether the given polygon overlaps with this.
Definition: PositionVector.cpp:106
PositionVector::getSubpart
PositionVector getSubpart(double beginOffset, double endOffset) const
get subpart of a position vector
Definition: PositionVector.cpp:698
PositionVector::smoothedZFront
PositionVector smoothedZFront(double dist=std::numeric_limits< double >::max()) const
returned vector that is smoothed at the front (within dist)
Definition: PositionVector.cpp:1539
PositionVector::sortByIncreasingXY
void sortByIncreasingXY()
shory by increasing X-Y Psitions
Definition: PositionVector.cpp:664
PositionVector::operator-
PositionVector operator-(const PositionVector &v2) const
substracts two vectors (requires vectors of the same length)
Definition: PositionVector.cpp:1334
PositionVector::scaleRelative
void scaleRelative(double factor)
enlarges/shrinks the polygon by a factor based at the centroid
Definition: PositionVector.cpp:448
PositionVector::sideOffset
static Position sideOffset(const Position &beg, const Position &end, const double amount)
get a side position of position vector using a offset
Definition: PositionVector.cpp:1079
PositionVector::slopeDegreeAtOffset
double slopeDegreeAtOffset(double pos) const
Returns the slope at the given length.
Definition: PositionVector.cpp:317
PositionVector::PositionVector
PositionVector()
Constructor. Creates an empty position vector.
Definition: PositionVector.cpp:52
PositionVector::isNAN
bool isNAN() const
check if PositionVector is NAN
Definition: PositionVector.cpp:1294
PositionVector::extrapolate
void extrapolate(const double val, const bool onlyFirst=false, const bool onlyLast=false)
extrapolate position vector
Definition: PositionVector.cpp:1025
PositionVector::length
double length() const
Returns the length.
Definition: PositionVector.cpp:476
PositionVector
A list of positions.
Definition: PositionVector.h:46
PositionVector::offsetAtIndex2D
double offsetAtIndex2D(int index) const
return the offset at the given index
Definition: PositionVector.cpp:1608
PositionVector::isClosed
bool isClosed() const
check if PositionVector is closed
Definition: PositionVector.cpp:1288
PositionVector::getBoxBoundary
Boundary getBoxBoundary() const
Returns a boundary enclosing this list of lines.
Definition: PositionVector.cpp:382
PositionVector::increasing_x_y_sorter::operator()
int operator()(const Position &p1, const Position &p2) const
comparing operation
Definition: PositionVector.cpp:673
PositionVector::angleAt2D
double angleAt2D(int pos) const
get angle in certain position of position vector
Definition: PositionVector.cpp:1204
PositionVector::add
void add(double xoff, double yoff, double zoff)
Definition: PositionVector.cpp:609
PositionVector::nearest_offset_to_point2D
double nearest_offset_to_point2D(const Position &p, bool perpendicular=true) const
return the nearest offest to point 2D
Definition: PositionVector.cpp:809
PositionVector::removeClosest
int removeClosest(const Position &p)
removes the point closest to p and return the removal index
Definition: PositionVector.cpp:972
PositionVector::intersects
bool intersects(const Position &p1, const Position &p2) const
Returns the information whether this list of points interesects the given line.
Definition: PositionVector.cpp:157
PositionVector::push_back_noDoublePos
void push_back_noDoublePos(const Position &p)
insert in back a non double position
Definition: PositionVector.cpp:1258
PositionVector::transformToVectorCoordinates
Position transformToVectorCoordinates(const Position &p, bool extend=false) const
return position p within the length-wise coordinate system defined by this position vector....
Definition: PositionVector.cpp:882
PositionVector::crosses
bool crosses(const Position &p1, const Position &p2) const
Returns whether the AbstractPoly crosses the given line.
Definition: PositionVector.cpp:538
PositionVector::getOverlapWith
double getOverlapWith(const PositionVector &poly, double zThreshold) const
Returns the maximum overlaps between this and the given polygon (when not separated by at least zThre...
Definition: PositionVector.cpp:129
PositionVector::operator+
PositionVector operator+(const PositionVector &v2) const
adds two vectors (requires vectors of the same length)
Definition: PositionVector.cpp:1348
PositionVector::around
bool around(const Position &p, double offset=0) const
Returns the information whether the position vector describes a polygon lying around the given point.
Definition: PositionVector.cpp:75
AbstractPoly.h
PositionVector::closePolygon
void closePolygon()
ensures that the last position equals the first
Definition: PositionVector.cpp:1214
PositionVector::positionAtOffset
Position positionAtOffset(double pos, double lateralOffset=0) const
Returns the position at the given length.
Definition: PositionVector.cpp:246
PositionVector::rotationDegreeAtOffset
double rotationDegreeAtOffset(double pos) const
Returns the rotation at the given length.
Definition: PositionVector.cpp:311
PositionVector::sub
void sub(double xoff, double yoff, double zoff)
Definition: PositionVector.cpp:623
Boundary
A class that stores a 2D geometrical boundary.
Definition: Boundary.h:42
PositionVector::increasing_x_y_sorter::increasing_x_y_sorter
increasing_x_y_sorter()
constructor
Definition: PositionVector.cpp:669
Position
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:39
PositionVector::append
void append(const PositionVector &v, double sameThreshold=2.0)
Definition: PositionVector.cpp:688
PositionVector::EMPTY
static const PositionVector EMPTY
empty Vector
Definition: PositionVector.h:74
PositionVector::increasing_x_y_sorter
clase for increasing Sorter
Definition: PositionVector.h:312
PositionVector::as_poly_cw_sorter::operator()
int operator()(const Position &p1, const Position &p2) const
comparing operation for sort
Definition: PositionVector.cpp:658
PositionVector::indexOfClosest
int indexOfClosest(const Position &p) const
index of the closest position to p
Definition: PositionVector.cpp:932
PositionVector::length2D
double length2D() const
Returns the length.
Definition: PositionVector.cpp:489
PositionVector::splitAt
std::pair< PositionVector, PositionVector > splitAt(double where, bool use2D=false) const
Returns the two lists made when this list vector is splitted at the given point.
Definition: PositionVector.cpp:544
PositionVector::getOrthogonal
PositionVector getOrthogonal(const Position &p, double extend, bool before, double length=1.0) const
return orthogonal through p (extending this vector if necessary)
Definition: PositionVector.cpp:1500
PositionVector::distance2D
double distance2D(const Position &p, bool perpendicular=false) const
closest 2D-distance to point p (or -1 if perpendicular is true and the point is beyond this vector)
Definition: PositionVector.cpp:1242
PositionVector::sortAsPolyCWByAngle
void sortAsPolyCWByAngle()
short as polygon CV by angle
Definition: PositionVector.cpp:603
PositionVector::getMaxGrade
double getMaxGrade(double &maxJump) const
Definition: PositionVector.cpp:1621
PositionVector::operator<<
friend std::ostream & operator<<(std::ostream &os, const PositionVector &geom)
Definition: PositionVector.cpp:591
PositionVector::partialWithin
bool partialWithin(const AbstractPoly &poly, double offset=0) const
Returns the information whether this polygon lies partially within the given polygon.
Definition: PositionVector.cpp:524
PositionVector::positionAtOffset2D
Position positionAtOffset2D(double pos, double lateralOffset=0) const
Returns the position at the given length.
Definition: PositionVector.cpp:268
PositionVector::resample
PositionVector resample(double maxLength) const
resample shape with the given number of points (equal spacing)
Definition: PositionVector.cpp:1590
PositionVector::reverse
PositionVector reverse() const
reverse position vector
Definition: PositionVector.cpp:1069
PositionVector::rotationAtOffset
double rotationAtOffset(double pos) const
Returns the rotation at the given length.
Definition: PositionVector.cpp:286
PositionVector::intersectionPosition2D
Position intersectionPosition2D(const Position &p1, const Position &p2, const double withinDist=0.) const
Returns the position of the intersection.
Definition: PositionVector.cpp:185
PositionVector::interpolateZ
PositionVector interpolateZ(double zStart, double zEnd) const
returned vector that varies z smoothly over its length
Definition: PositionVector.cpp:1571
PositionVector::insert_noDoublePos
void insert_noDoublePos(const std::vector< Position >::iterator &at, const Position &p)
insert in front a non double position
Definition: PositionVector.cpp:1274
PositionVector::distances
std::vector< double > distances(const PositionVector &s, bool perpendicular=false) const
distances of all my points to s and all of s points to myself
Definition: PositionVector.cpp:1222
PositionVector::getCentroid
Position getCentroid() const
Returns the centroid (closes the polygon if unclosed)
Definition: PositionVector.cpp:406
config.h
PositionVector::bezier
PositionVector bezier(int numPoints)
return a bezier interpolation
Definition: PositionVector.cpp:1639
PositionVector::as_poly_cw_sorter::as_poly_cw_sorter
as_poly_cw_sorter()
constructor
Definition: PositionVector.cpp:654
PositionVector::hasElevation
bool hasElevation() const
return whether two positions differ in z-coordinate
Definition: PositionVector.cpp:1362
PositionVector::operator!=
bool operator!=(const PositionVector &v2) const
comparing operation
Definition: PositionVector.cpp:1329
PositionVector::as_poly_cw_sorter
clase for CW Sorter
Definition: PositionVector.h:302
PositionVector::getLineCenter
Position getLineCenter() const
get line center
Definition: PositionVector.cpp:466
PositionVector::scaleAbsolute
void scaleAbsolute(double offset)
enlarges/shrinks the polygon by an absolute offset based at the centroid
Definition: PositionVector.cpp:457
PositionVector::area
double area() const
Returns the area (0 for non-closed)
Definition: PositionVector.cpp:502
PositionVector::mirrorX
void mirrorX()
Definition: PositionVector.cpp:647
POSITION_EPS
#define POSITION_EPS
Definition: config.h:169
PositionVector::~PositionVector
~PositionVector()
Destructor.
Definition: PositionVector.cpp:71
PositionVector::extrapolate2D
void extrapolate2D(const double val, const bool onlyFirst=false)
extrapolate position vector in two dimensions (Z is ignored)
Definition: PositionVector.cpp:1047
PositionVector::move2side
void move2side(double amount, double maxExtension=100)
move position vector to side using certain ammount
Definition: PositionVector.cpp:1086
PositionVector::push_front_noDoublePos
void push_front_noDoublePos(const Position &p)
insert in front a non double position
Definition: PositionVector.cpp:1266
PositionVector::removeDoublePoints
void removeDoublePoints(double minDist=POSITION_EPS, bool assertLength=false)
Removes positions if too near.
Definition: PositionVector.cpp:1307
PositionVector::added
PositionVector added(const Position &offset) const
Definition: PositionVector.cpp:637