SUMO - Simulation of Urban MObility
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
PositionVector.h
Go to the documentation of this file.
1 /****************************************************************************/
9 // A list of positions
10 /****************************************************************************/
11 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/
12 // Copyright (C) 2001-2013 DLR (http://www.dlr.de/) and contributors
13 /****************************************************************************/
14 //
15 // This file is part of SUMO.
16 // SUMO is free software: you can redistribute it and/or modify
17 // it under the terms of the GNU General Public License as published by
18 // the Free Software Foundation, either version 3 of the License, or
19 // (at your option) any later version.
20 //
21 /****************************************************************************/
22 #ifndef PositionVector_h
23 #define PositionVector_h
24 
25 
26 // ===========================================================================
27 // included modules
28 // ===========================================================================
29 #ifdef _MSC_VER
30 #include <windows_config.h>
31 #else
32 #include <config.h>
33 #endif
34 
35 #include <vector>
36 #include "AbstractPoly.h"
37 
38 
39 // ===========================================================================
40 // class declarations
41 // ===========================================================================
42 class Line;
43 class Boundary;
44 
45 
46 // ===========================================================================
47 // class definitions
48 // ===========================================================================
53 class PositionVector : public AbstractPoly, private std::vector<Position> {
54 
55 private:
56  typedef std::vector<Position> vp;
57 
58 public:
64 
65 
69  PositionVector(const std::vector<Position>& v);
70 
71 
74 
75  using vp::iterator;
76  using vp::const_iterator;
77  using vp::const_reference;
78  using vp::value_type;
79  using vp::begin;
80  using vp::end;
81  using vp::push_back;
82  using vp::pop_back;
83  using vp::clear;
84  using vp::size;
85  using vp::front;
86  using vp::back;
87  using vp::reference;
88 
89 
92 
93 
97  void push_back(const PositionVector& p);
99 
100 
102  void push_front(const Position& p);
103 
106 
107  void insertAt(int index, const Position& p);
108 
109  void replaceAt(int index, const Position& by);
110 
111  void eraseAt(int i);
112 
115  bool around(const Position& p, SUMOReal offset = 0) const;
116 
119  bool overlapsWith(const AbstractPoly& poly, SUMOReal offset = 0) const;
120 
122  bool intersects(const Position& p1, const Position& p2) const;
123 
125  bool intersects(const PositionVector& v1) const;
126 
129  const Position& p2) const; // !!!
130 
132  PositionVector intersectionPoints2D(const Line& line) const;
133 
136  std::vector<SUMOReal> intersectsAtLengths2D(const PositionVector& other) const; // !!!
137 
140  std::vector<SUMOReal> intersectsAtLengths2D(const Line& line) const; // !!!
141 
143  Position intersectsAtPoint(const PositionVector& v1) const; // !!!
144 
146  void closePolygon();
147 
150  const Position& operator[](int index) const;
151  Position& operator[](int index);
152 
155 
158 
161 
164 
166  static Position positionAtOffset(const Position& p1,
167  const Position& p2, SUMOReal pos);
168 
170  static Position positionAtOffset2D(const Position& p1,
171  const Position& p2, SUMOReal pos);
172 
174  Boundary getBoxBoundary() const;
175 
178  Position getPolygonCenter() const;
179 
181  Position getCentroid() const;
182 
184  void scaleSize(SUMOReal factor);
185 
186  Position getLineCenter() const;
187 
189  SUMOReal length() const;
190 
191 
193  SUMOReal area() const;
194 
196  bool partialWithin(const AbstractPoly& poly, SUMOReal offset = 0) const;
197 
199  std::pair<PositionVector, PositionVector> splitAt(SUMOReal where) const;
200 
202  friend std::ostream& operator<<(std::ostream& os, const PositionVector& geom);
203 
204  bool crosses(const Position& p1, const Position& p2) const;
205 
206  void add(SUMOReal xoff, SUMOReal yoff, SUMOReal zoff);
207 
208  void reshiftRotate(SUMOReal xoff, SUMOReal yoff, SUMOReal rot);
209 
210  PositionVector convexHull() const;
211 
213 
214  // @brief append the given vector to this one
215  void append(const PositionVector& v);
216 
217  PositionVector getSubpart(SUMOReal beginOffset, SUMOReal endOffset) const;
218 
219  PositionVector getSubpart2D(SUMOReal beginOffset, SUMOReal endOffset) const;
220 
221  void sortAsPolyCWByAngle();
222 
223  void sortByIncreasingXY();
224 
225  void extrapolate(SUMOReal val);
226 
227  PositionVector reverse() const;
228 
229  void move2side(SUMOReal amount);
230 
231  Line lineAt(size_t pos) const;
232 
233  Line getBegLine() const;
234 
235  Line getEndLine() const;
236 
237 
238  // @brief inserts p between the two closest positions and returns the insertion index
239  int insertAtClosest(const Position& p);
240 
242  bool operator==(const PositionVector& v2) const;
243 
245  public:
248 
249  public:
251  int operator()(const Position& p1, const Position& p2) const;
252 
253  };
254 
256  public:
258  explicit increasing_x_y_sorter();
259 
260  public:
262  int operator()(const Position& p1, const Position& p2) const;
263 
264  };
265 
266  // !!!
267  SUMOReal isLeft(const Position& P0, const Position& P1, const Position& P2) const;
268 
269  void pruneFromBeginAt(const Position& p);
270  void pruneFromEndAt(const Position& p);
271 
272  SUMOReal beginEndAngle() const;
273 
274  SUMOReal nearest_offset_to_point2D(const Position& p, bool perpendicular = true) const;
275 
276  /* @brief index of the closest position to p
277  * @note: may only be called for a non-empty vector */
278  int indexOfClosest(const Position& p) const;
279 
280  // distances of all my points to s and all of s points to myself
281  std::vector<SUMOReal> distances(const PositionVector& s) const;
282 
283  SUMOReal distance(const Position& p) const;
284 
285  void push_back_noDoublePos(const Position& p);
286  void push_front_noDoublePos(const Position& p);
287 
288  bool isClosed() const;
289 
294  void removeDoublePoints(SUMOReal minDist = POSITION_EPS, bool assertLength = false);
295 
296  void removeColinearPoints();
297 
298 };
299 
300 
301 #endif
302 
303 /****************************************************************************/
304