Position2DVector.h
Go to the documentation of this file.00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef Position2DVector_h
00020 #define Position2DVector_h
00021
00022
00023
00024
00025
00026 #ifdef _MSC_VER
00027 #include <windows_config.h>
00028 #else
00029 #include <config.h>
00030 #endif
00031
00032 #include <queue>
00033 #include <iostream>
00034 #include <utils/common/VectorHelper.h>
00035 #include "AbstractPoly.h"
00036 #include "Boundary.h"
00037 #include "Position2D.h"
00038
00039
00040 class Line2D;
00041
00042
00043
00044
00049 class Position2DVector
00050 : public AbstractPoly {
00051 public:
00053 typedef std::deque<Position2D> ContType;
00054
00055 public:
00060 Position2DVector() throw();
00061
00062
00066 Position2DVector(const std::vector<Position2D> &v) throw();
00067
00068
00070 ~Position2DVector() throw();
00071
00072
00075
00079 void push_back(const Position2D &p) throw();
00080
00081
00085 void push_back(const Position2DVector &p) throw();
00087
00088
00089
00091 void push_front(const Position2D &p);
00092
00095 bool around(const Position2D &p, SUMOReal offset=0) const;
00096
00099 bool overlapsWith(const AbstractPoly &poly, SUMOReal offset=0) const;
00100
00102 bool intersects(const Position2D &p1, const Position2D &p2) const;
00103
00105 bool intersects(const Position2DVector &v1) const;
00106
00108 Position2D intersectsAtPoint(const Position2D &p1,
00109 const Position2D &p2) const;
00110
00111 Position2DVector intersectsAtPoints(const Position2D &p1,
00112 const Position2D &p2) const;
00113
00114 DoubleVector intersectsAtLengths(const Position2DVector &s) const;
00115
00116 DoubleVector intersectsAtLengths(const Line2D &s) const;
00117
00119 Position2D intersectsAtPoint(const Position2DVector &v1) const;
00120
00122 void clear();
00123
00124 void closePolygon();
00125
00128 const Position2D &operator[](int index) const;
00129 Position2D &operator[](int index);
00130
00132 size_t size() const;
00133
00135 Position2D positionAtLengthPosition(SUMOReal pos) const;
00136
00138 SUMOReal rotationDegreeAtLengthPosition(SUMOReal pos) const;
00139
00141 static Position2D positionAtLengthPosition(const Position2D &p1,
00142 const Position2D &p2, SUMOReal pos);
00143
00145 Boundary getBoxBoundary() const;
00146
00149 Position2D getPolygonCenter() const;
00150 Position2D getLineCenter() const;
00151
00152 Position2D pop_back();
00153 Position2D pop_front();
00154
00156 SUMOReal length() const;
00157
00159 bool partialWithin(const AbstractPoly &poly, SUMOReal offset=0) const;
00160
00162 const Position2D &getBegin() const;
00163
00165 const Position2D &getEnd() const;
00166
00168 std::pair<Position2DVector, Position2DVector> splitAt(SUMOReal where) const;
00169
00171 friend std::ostream &operator<<(std::ostream &os,
00172 const Position2DVector &geom);
00173
00174 bool crosses(const Position2D &p1, const Position2D &p2) const;
00175
00176 void reshiftRotate(SUMOReal xoff, SUMOReal yoff, SUMOReal rot);
00177
00178 Position2DVector convexHull() const;
00179
00180 int appendWithCrossingPoint(const Position2DVector &v);
00181
00182
00183 const ContType &getCont() const {
00184 return myCont;
00185 }
00186
00187 Position2DVector getSubpart(SUMOReal begin, SUMOReal end) const;
00188
00189 void sortAsPolyCWByAngle();
00190
00191 void sortByIncreasingXY();
00192
00193 void extrapolate(SUMOReal val);
00194
00195 Position2DVector reverse() const;
00196
00197 void move2side(SUMOReal amount);
00198 void move2side(SUMOReal amount, int index);
00199
00200 Line2D lineAt(size_t pos) const;
00201
00202 Line2D getBegLine() const;
00203
00204 Line2D getEndLine() const;
00205
00206
00207 void insertAt(int index, const Position2D &p);
00208
00209 class as_poly_cw_sorter {
00210 public:
00212 explicit as_poly_cw_sorter(Position2D center);
00213
00214 public:
00216 int operator()(const Position2D &p1, const Position2D &p2) const;
00217
00218 private:
00220 Position2D myCenter;
00221
00222 };
00223
00224 class increasing_x_y_sorter {
00225 public:
00227 explicit increasing_x_y_sorter();
00228
00229 public:
00231 int operator()(const Position2D &p1, const Position2D &p2) const;
00232
00233 };
00234
00235
00236 SUMOReal isLeft(const Position2D &P0, const Position2D &P1, const Position2D &P2) const;
00237
00238 void set(size_t pos, const Position2D &p);
00239
00240 void pruneFromBeginAt(const Position2D &p);
00241 void pruneFromEndAt(const Position2D &p);
00242
00243 SUMOReal beginEndAngle() const;
00244
00245 void eraseAt(int i);
00246
00247 SUMOReal nearest_position_on_line_to_point(const Position2D &p) const;
00248
00249 DoubleVector distances(const Position2DVector &s) const;
00250 DoubleVector distancesExt(const Position2DVector &s) const;
00251
00252 SUMOReal distance(const Position2D &p) const;
00253
00254 void push_back_noDoublePos(const Position2D &p);
00255 void push_front_noDoublePos(const Position2D &p);
00256
00257 void replaceAt(size_t index, const Position2D &by);
00258
00259 bool isClosed() const;
00260
00261 void removeDoublePoints();
00262
00263 void removeColinearPoints();
00264
00265 private:
00266
00268 ContType myCont;
00269
00270 };
00271
00272
00273 #endif
00274
00275
00276