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 /****************************************************************************/
16 // A list of positions
17 /****************************************************************************/
18 #ifndef PositionVector_h
19 #define PositionVector_h
20 
21 
22 // ===========================================================================
23 // included modules
24 // ===========================================================================
25 #include <config.h>
26 
27 #include <vector>
28 #include <limits>
29 #include "AbstractPoly.h"
30 
31 
32 // ===========================================================================
33 // class declarations
34 // ===========================================================================
35 
36 class Boundary;
37 
38 // ===========================================================================
39 // class definitions
40 // ===========================================================================
45 class PositionVector : public AbstractPoly, private std::vector<Position> {
46 
47 private:
49  typedef std::vector<Position> vp;
50 
51 public:
54 
57  PositionVector(const std::vector<Position>& v);
58 
62  PositionVector(const std::vector<Position>::const_iterator beg, const std::vector<Position>::const_iterator end);
63 
67  PositionVector(const Position& p1, const Position& p2);
68 
71 
73  static const PositionVector EMPTY;
74 
78  using vp::iterator;
79 
81  using vp::const_iterator;
82 
84  using vp::const_reference;
85 
87  using vp::value_type;
88 
90  using vp::begin;
91 
93  using vp::end;
94 
96  using vp::push_back;
97 
99  using vp::pop_back;
100 
102  using vp::clear;
104  using vp::size;
105 
107  using vp::front;
108 
110  using vp::back;
111 
113  using vp::reference;
114 
116  using vp::erase;
117 
119  using vp::insert;
121 
124  bool around(const Position& p, double offset = 0) const;
125 
128  bool overlapsWith(const AbstractPoly& poly, double offset = 0) const;
129 
131  double getOverlapWith(const PositionVector& poly, double zThreshold) const;
132 
134  bool intersects(const Position& p1, const Position& p2) const;
135 
137  bool intersects(const PositionVector& v1) const;
138 
140  Position intersectionPosition2D(const Position& p1, const Position& p2, const double withinDist = 0.) const;
141 
143  std::vector<double> intersectsAtLengths2D(const PositionVector& other) const;
144 
146  std::vector<double> intersectsAtLengths2D(const Position& lp1, const Position& lp2) const;
147 
150 
152  void closePolygon();
153 
156  const Position& operator[](int index) const;
157 
159  Position& operator[](int index);
160 
162  Position positionAtOffset(double pos, double lateralOffset = 0) const;
163 
165  Position positionAtOffset2D(double pos, double lateralOffset = 0) const;
166 
168  double rotationAtOffset(double pos) const;
169 
171  double rotationDegreeAtOffset(double pos) const;
172 
174  double slopeDegreeAtOffset(double pos) const;
175 
177  static Position positionAtOffset(const Position& p1, const Position& p2, double pos, double lateralOffset = 0.);
178 
180  static Position positionAtOffset2D(const Position& p1, const Position& p2, double pos, double lateralOffset = 0.);
181 
183  Boundary getBoxBoundary() const;
184 
187  Position getPolygonCenter() const;
188 
190  Position getCentroid() const;
191 
193  void scaleRelative(double factor);
194 
196  void scaleAbsolute(double offset);
197 
199  Position getLineCenter() const;
200 
202  double length() const;
203 
205  double length2D() const;
206 
208  double area() const;
209 
211  bool partialWithin(const AbstractPoly& poly, double offset = 0) const;
212 
214  std::pair<PositionVector, PositionVector> splitAt(double where, bool use2D = false) const;
215 
217  friend std::ostream& operator<<(std::ostream& os, const PositionVector& geom);
218 
220  bool crosses(const Position& p1, const Position& p2) const;
221 
223  void add(double xoff, double yoff, double zoff);
224 
226  void add(const Position& offset);
227 
229  void sub(double xoff, double yoff, double zoff);
230 
232  void sub(const Position& offset);
233 
235  PositionVector added(const Position& offset) const;
236 
238  void mirrorX();
239 
241  void rotate2D(double angle);
242 
244  void append(const PositionVector& v, double sameThreshold = 2.0);
245 
247  PositionVector getSubpart(double beginOffset, double endOffset) const;
248 
250  PositionVector getSubpart2D(double beginOffset, double endOffset) const;
251 
253  PositionVector getSubpartByIndex(int beginIndex, int count) const;
254 
256  void sortAsPolyCWByAngle();
257 
259  void sortByIncreasingXY();
260 
262  void extrapolate(const double val, const bool onlyFirst = false, const bool onlyLast = false);
263 
265  void extrapolate2D(const double val, const bool onlyFirst = false);
266 
268  PositionVector reverse() const;
269 
271  static Position sideOffset(const Position& beg, const Position& end, const double amount);
272 
274  void move2side(double amount, double maxExtension = 100);
275 
277  void move2side(std::vector<double> amount, double maxExtension = 100);
278 
280  double angleAt2D(int pos) const;
281 
287  int insertAtClosest(const Position& p, bool interpolateZ);
288 
290  int removeClosest(const Position& p);
291 
293  bool operator==(const PositionVector& v2) const;
294 
296  bool operator!=(const PositionVector& v2) const;
297 
299  PositionVector operator-(const PositionVector& v2) const;
300 
302  PositionVector operator+(const PositionVector& v2) const;
303 
306  public:
309 
311  int operator()(const Position& p1, const Position& p2) const;
312  };
313 
316  public:
318  explicit increasing_x_y_sorter();
319 
321  int operator()(const Position& p1, const Position& p2) const;
322  };
323 
326  double isLeft(const Position& P0, const Position& P1, const Position& P2) const;
327 
329  double beginEndAngle() const;
330 
332  double nearest_offset_to_point2D(const Position& p, bool perpendicular = true) const;
333 
335  double nearest_offset_to_point25D(const Position& p, bool perpendicular = true) const;
336 
344  Position transformToVectorCoordinates(const Position& p, bool extend = false) const;
345 
348  int indexOfClosest(const Position& p) const;
349 
352  std::vector<double> distances(const PositionVector& s, bool perpendicular = false) const;
353 
355  double distance2D(const Position& p, bool perpendicular = false) const;
356 
358  void push_front(const Position& p);
359 
361  void pop_front();
362 
364  void push_back_noDoublePos(const Position& p);
365 
367  void push_front_noDoublePos(const Position& p);
368 
370  void insert_noDoublePos(const std::vector<Position>::iterator& at, const Position& p);
371 
373  bool isClosed() const;
374 
376  bool isNAN() const;
377 
382  void removeDoublePoints(double minDist = POSITION_EPS, bool assertLength = false);
383 
385  bool hasElevation() const;
386 
388  PositionVector simplified() const;
389 
396  PositionVector getOrthogonal(const Position& p, double extend, bool before, double length = 1.0) const;
397 
399  PositionVector smoothedZFront(double dist = std::numeric_limits<double>::max()) const;
400 
402  PositionVector interpolateZ(double zStart, double zEnd) const;
403 
405  PositionVector resample(double maxLength) const;
406 
408  double offsetAtIndex2D(int index) const;
409 
410  /* @brief return the maximum grade of all segments as a fraction of zRange/length2D
411  * @param[out] maxJump The maximum vertical jump (with grade infinity)
412  */
413  double getMaxGrade(double& maxJump) const;
414 
416  PositionVector bezier(int numPoints);
417 
418 private:
420  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);
421 };
422 
423 
424 #endif
425 
426 /****************************************************************************/
427 
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:853
AbstractPoly
Definition: AbstractPoly.h:35
PositionVector::operator==
bool operator==(const PositionVector &v2) const
comparing operation
Definition: PositionVector.cpp:1366
PositionVector::beginEndAngle
double beginEndAngle() const
returns the angle in radians of the line connecting the first and the last position
Definition: PositionVector.cpp:808
PositionVector::vp
std::vector< Position > vp
vector of position
Definition: PositionVector.h:49
PositionVector::getPolygonCenter
Position getPolygonCenter() const
Returns the arithmetic of all corner points.
Definition: PositionVector.cpp:400
PositionVector::getSubpartByIndex
PositionVector getSubpartByIndex(int beginIndex, int count) const
get subpart of a position vector using index and a cout
Definition: PositionVector.cpp:789
PositionVector::simplified
PositionVector simplified() const
return the same shape with intermediate colinear points removed
Definition: PositionVector.cpp:1518
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:1008
PositionVector::isLeft
double isLeft(const Position &P0, const Position &P1, const Position &P2) const
get left
Definition: PositionVector.cpp:690
PositionVector::getSubpart2D
PositionVector getSubpart2D(double beginOffset, double endOffset) const
get subpart of a position vector in two dimensions (Z is ignored)
Definition: PositionVector.cpp:746
PositionVector::operator[]
const Position & operator[](int index) const
returns the constat position at the given index @ToDo !!! exceptions?
Definition: PositionVector.cpp:210
PositionVector::rotate2D
void rotate2D(double angle)
Definition: PositionVector.cpp:1503
PositionVector::overlapsWith
bool overlapsWith(const AbstractPoly &poly, double offset=0) const
Returns the information whether the given polygon overlaps with this.
Definition: PositionVector.cpp:108
PositionVector::getSubpart
PositionVector getSubpart(double beginOffset, double endOffset) const
get subpart of a position vector
Definition: PositionVector.cpp:706
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:1582
PositionVector::sortByIncreasingXY
void sortByIncreasingXY()
shory by increasing X-Y Psitions
Definition: PositionVector.cpp:672
PositionVector::operator-
PositionVector operator-(const PositionVector &v2) const
substracts two vectors (requires vectors of the same length)
Definition: PositionVector.cpp:1377
PositionVector::scaleRelative
void scaleRelative(double factor)
enlarges/shrinks the polygon by a factor based at the centroid
Definition: PositionVector.cpp:456
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:1096
PositionVector::slopeDegreeAtOffset
double slopeDegreeAtOffset(double pos) const
Returns the slope at the given length.
Definition: PositionVector.cpp:325
PositionVector::PositionVector
PositionVector()
Constructor. Creates an empty position vector.
Definition: PositionVector.cpp:51
PositionVector::isNAN
bool isNAN() const
check if PositionVector is NAN
Definition: PositionVector.cpp:1331
PositionVector::extrapolate
void extrapolate(const double val, const bool onlyFirst=false, const bool onlyLast=false)
extrapolate position vector
Definition: PositionVector.cpp:1042
PositionVector::length
double length() const
Returns the length.
Definition: PositionVector.cpp:484
PositionVector
A list of positions.
Definition: PositionVector.h:45
PositionVector::offsetAtIndex2D
double offsetAtIndex2D(int index) const
return the offset at the given index
Definition: PositionVector.cpp:1651
PositionVector::isClosed
bool isClosed() const
check if PositionVector is closed
Definition: PositionVector.cpp:1325
PositionVector::getBoxBoundary
Boundary getBoxBoundary() const
Returns a boundary enclosing this list of lines.
Definition: PositionVector.cpp:390
PositionVector::increasing_x_y_sorter::operator()
int operator()(const Position &p1, const Position &p2) const
comparing operation
Definition: PositionVector.cpp:681
PositionVector::angleAt2D
double angleAt2D(int pos) const
get angle in certain position of position vector
Definition: PositionVector.cpp:1221
PositionVector::add
void add(double xoff, double yoff, double zoff)
Definition: PositionVector.cpp:617
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:817
PositionVector::removeClosest
int removeClosest(const Position &p)
removes the point closest to p and return the removal index
Definition: PositionVector.cpp:989
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:159
PositionVector::push_back_noDoublePos
void push_back_noDoublePos(const Position &p)
insert in back a non double position
Definition: PositionVector.cpp:1295
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:890
PositionVector::crosses
bool crosses(const Position &p1, const Position &p2) const
Returns whether the AbstractPoly crosses the given line.
Definition: PositionVector.cpp:546
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:131
PositionVector::operator+
PositionVector operator+(const PositionVector &v2) const
adds two vectors (requires vectors of the same length)
Definition: PositionVector.cpp:1391
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:74
AbstractPoly.h
PositionVector::closePolygon
void closePolygon()
ensures that the last position equals the first
Definition: PositionVector.cpp:1231
PositionVector::positionAtOffset
Position positionAtOffset(double pos, double lateralOffset=0) const
Returns the position at the given length.
Definition: PositionVector.cpp:248
PositionVector::rotationDegreeAtOffset
double rotationDegreeAtOffset(double pos) const
Returns the rotation at the given length.
Definition: PositionVector.cpp:319
PositionVector::sub
void sub(double xoff, double yoff, double zoff)
Definition: PositionVector.cpp:631
Boundary
A class that stores a 2D geometrical boundary.
Definition: Boundary.h:41
PositionVector::increasing_x_y_sorter::increasing_x_y_sorter
increasing_x_y_sorter()
constructor
Definition: PositionVector.cpp:677
Position
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:38
PositionVector::append
void append(const PositionVector &v, double sameThreshold=2.0)
Definition: PositionVector.cpp:696
PositionVector::EMPTY
static const PositionVector EMPTY
empty Vector
Definition: PositionVector.h:73
PositionVector::increasing_x_y_sorter
clase for increasing Sorter
Definition: PositionVector.h:315
PositionVector::as_poly_cw_sorter::operator()
int operator()(const Position &p1, const Position &p2) const
comparing operation for sort
Definition: PositionVector.cpp:666
PositionVector::indexOfClosest
int indexOfClosest(const Position &p) const
index of the closest position to p
Definition: PositionVector.cpp:940
PositionVector::length2D
double length2D() const
Returns the length.
Definition: PositionVector.cpp:497
PositionVector::insertAtClosest
int insertAtClosest(const Position &p, bool interpolateZ)
inserts p between the two closest positions
Definition: PositionVector.cpp:959
PositionVector::pop_front
void pop_front()
pop first Position
Definition: PositionVector.cpp:1285
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:552
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:1543
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:1259
PositionVector::sortAsPolyCWByAngle
void sortAsPolyCWByAngle()
short as polygon CV by angle
Definition: PositionVector.cpp:611
PositionVector::getMaxGrade
double getMaxGrade(double &maxJump) const
Definition: PositionVector.cpp:1664
PositionVector::operator<<
friend std::ostream & operator<<(std::ostream &os, const PositionVector &geom)
Definition: PositionVector.cpp:599
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:532
PositionVector::positionAtOffset2D
Position positionAtOffset2D(double pos, double lateralOffset=0) const
Returns the position at the given length.
Definition: PositionVector.cpp:273
PositionVector::resample
PositionVector resample(double maxLength) const
resample shape with the given number of points (equal spacing)
Definition: PositionVector.cpp:1633
PositionVector::reverse
PositionVector reverse() const
reverse position vector
Definition: PositionVector.cpp:1086
PositionVector::rotationAtOffset
double rotationAtOffset(double pos) const
Returns the rotation at the given length.
Definition: PositionVector.cpp:294
PositionVector::intersectionPosition2D
Position intersectionPosition2D(const Position &p1, const Position &p2, const double withinDist=0.) const
Returns the position of the intersection.
Definition: PositionVector.cpp:187
PositionVector::interpolateZ
PositionVector interpolateZ(double zStart, double zEnd) const
returned vector that varies z smoothly over its length
Definition: PositionVector.cpp:1614
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:1311
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:1239
PositionVector::getCentroid
Position getCentroid() const
Returns the centroid (closes the polygon if unclosed)
Definition: PositionVector.cpp:414
config.h
PositionVector::bezier
PositionVector bezier(int numPoints)
return a bezier interpolation
Definition: PositionVector.cpp:1682
PositionVector::as_poly_cw_sorter::as_poly_cw_sorter
as_poly_cw_sorter()
constructor
Definition: PositionVector.cpp:662
PositionVector::hasElevation
bool hasElevation() const
return whether two positions differ in z-coordinate
Definition: PositionVector.cpp:1405
PositionVector::operator!=
bool operator!=(const PositionVector &v2) const
comparing operation
Definition: PositionVector.cpp:1372
PositionVector::as_poly_cw_sorter
clase for CW Sorter
Definition: PositionVector.h:305
PositionVector::getLineCenter
Position getLineCenter() const
get line center
Definition: PositionVector.cpp:474
PositionVector::scaleAbsolute
void scaleAbsolute(double offset)
enlarges/shrinks the polygon by an absolute offset based at the centroid
Definition: PositionVector.cpp:465
PositionVector::area
double area() const
Returns the area (0 for non-closed)
Definition: PositionVector.cpp:510
PositionVector::mirrorX
void mirrorX()
Definition: PositionVector.cpp:655
POSITION_EPS
#define POSITION_EPS
Definition: config.h:172
PositionVector::~PositionVector
~PositionVector()
Destructor.
Definition: PositionVector.cpp:70
PositionVector::extrapolate2D
void extrapolate2D(const double val, const bool onlyFirst=false)
extrapolate position vector in two dimensions (Z is ignored)
Definition: PositionVector.cpp:1064
PositionVector::move2side
void move2side(double amount, double maxExtension=100)
move position vector to side using certain ammount
Definition: PositionVector.cpp:1103
PositionVector::push_front_noDoublePos
void push_front_noDoublePos(const Position &p)
insert in front a non double position
Definition: PositionVector.cpp:1303
PositionVector::push_front
void push_front(const Position &p)
insert in front a Position
Definition: PositionVector.cpp:1275
PositionVector::removeDoublePoints
void removeDoublePoints(double minDist=POSITION_EPS, bool assertLength=false)
Removes positions if too near.
Definition: PositionVector.cpp:1344
PositionVector::added
PositionVector added(const Position &offset) const
Definition: PositionVector.cpp:645