52 #ifdef CHECK_MEMORY_LEAKS
54 #endif // CHECK_MEMORY_LEAKS
64 std::copy(v.begin(), v.end(), std::back_inserter(
myCont));
96 for (ContType::const_iterator i =
myCont.begin(); i !=
myCont.end() - 1; i++) {
101 (*(i + 1)).x() - p.
x(),
102 (*(i + 1)).y() - p.
y());
106 (*(
myCont.end() - 1)).x() - p.
x(),
107 (*(
myCont.end() - 1)).y() - p.
y());
109 (*(
myCont.begin())).x() - p.
x(),
110 (*(
myCont.begin())).y() - p.
y());
112 return (!(fabs(angle) <
PI));
118 for (ContType::const_iterator i =
myCont.begin(); i !=
myCont.end() - 1; i++) {
119 if (poly.
around(*i, offset)) {
132 for (ContType::const_iterator i =
myCont.begin(); i !=
myCont.end() - 1; i++) {
147 for (ContType::const_iterator i =
myCont.begin(); i !=
myCont.end() - 1; i++) {
160 for (ContType::const_iterator i =
myCont.begin(); i !=
myCont.end() - 1; i++) {
171 for (ContType::const_iterator i =
myCont.begin(); i !=
myCont.end() - 1; i++) {
219 ContType::const_iterator i =
myCont.begin();
222 const SUMOReal nextLength = (*i).distanceTo(*(i + 1));
223 if (seenLength + nextLength > pos) {
226 seenLength += nextLength;
227 }
while (++i !=
myCont.end() - 1);
234 ContType::const_iterator i =
myCont.begin();
237 const SUMOReal nextLength = (*i).distanceTo2D(*(i + 1));
238 if (seenLength + nextLength > pos) {
241 seenLength += nextLength;
242 }
while (++i !=
myCont.end() - 1);
249 ContType::const_iterator i =
myCont.begin();
252 SUMOReal nextLength = (*i).distanceTo(*(i + 1));
253 if (seenLength + nextLength > pos) {
254 Line l(*i, *(i + 1));
257 seenLength += nextLength;
258 }
while (++i !=
myCont.end() - 1);
272 return p1 + (p2 - p1) * (pos / dist);
284 return p1 + (p2 - p1) * (pos / dist);
291 for (ContType::const_iterator i =
myCont.begin(); i !=
myCont.end(); i++) {
302 for (ContType::const_iterator i =
myCont.begin(); i !=
myCont.end(); i++) {
316 const int endIndex = (
int)tmp.
size() - 1;
320 if (tmp.
area() != 0) {
322 for (
int i = 0; i < endIndex; i++) {
323 const SUMOReal z = tmp[i].x() * tmp[i + 1].y() - tmp[i + 1].x() * tmp[i].y();
325 x += (tmp[i].x() + tmp[i + 1].x()) * z;
326 y += (tmp[i].y() + tmp[i + 1].y()) * z;
334 for (
int i = 0; i < endIndex; i++) {
336 x += (tmp[i].x() + tmp[i + 1].x()) * length / 2;
337 y += (tmp[i].y() + tmp[i + 1].y()) * length / 2;
340 return Position(x / lengthSum, y / lengthSum);
348 for (
size_t i = 0; i <
size(); i++) {
349 myCont[i] = centroid + ((
myCont[i] - centroid) * factor);
366 for (ContType::const_iterator i =
myCont.begin(); i !=
myCont.end() - 1; i++) {
367 len += (*i).distanceTo(*(i + 1));
380 const int endIndex = (
int)tmp.
size() - 1;
382 for (
int i = 0; i < endIndex; i++) {
383 area += tmp[i].x() * tmp[i + 1].y() - tmp[i + 1].x() * tmp[i].y();
394 for (ContType::const_iterator i =
myCont.begin(); i !=
myCont.end() - 1; i++) {
395 if (poly.
around(*i, offset)) {
423 std::pair<PositionVector, PositionVector>
434 ContType::const_iterator it =
myCont.begin() + 1;
447 Position p = tmpL.getPositionAtDistance(where - seen);
454 for (; it !=
myCont.end(); it++) {
457 assert(first.
size() >= 2);
458 assert(second.
size() >= 2);
461 return std::pair<PositionVector, PositionVector>(first, second);
467 for (PositionVector::ContType::const_iterator i = geom.
myCont.begin(); i != geom.
myCont.end(); i++) {
468 if (i != geom.
myCont.begin()) {
485 for (
size_t i = 0; i <
size(); i++) {
486 myCont[i].add(xoff, yoff, zoff);
493 for (
size_t i = 0; i <
size(); i++) {
494 myCont[i].reshiftRotate(xoff, yoff, rot);
502 return atan2(p1.
x(), p1.
y()) < atan2(p2.
x(), p2.
y());
521 if (p1.
x() != p2.
x()) {
522 return p1.
x() < p2.
x();
524 return p1.
y() < p2.
y();
532 return (P1.
x() - P0.
x()) * (P2.
y() - P0.
y()) - (P2.
x() - P0.
x()) * (P1.
y() - P0.
y());
553 for (ContType::const_iterator i =
myCont.begin(); i !=
myCont.end() - 1; i++) {
556 *i, *(i + 1), line.
p1(), line.
p2()));
574 if (l1.intersects(l2) && l1.intersectsAtLength2D(l2) < l1.length2D() - 100) {
600 ContType::const_iterator i =
myCont.begin();
602 while ((i + 1) !=
myCont.end()
604 seen + (*i).distanceTo(*(i + 1)) <
begin) {
605 seen += (*i).distanceTo(*(i + 1));
609 while ((i + 1) !=
myCont.end()
611 seen + (*i).distanceTo(*(i + 1)) <
end) {
619 seen += (*i).distanceTo(*(i + 1));
642 ContType::const_iterator i =
myCont.begin();
644 while ((i + 1) !=
myCont.end()
646 seen + (*i).distanceTo2D(*(i + 1)) <
begin) {
647 seen += (*i).distanceTo2D(*(i + 1));
651 while ((i + 1) !=
myCont.end()
653 seen + (*i).distanceTo2D(*(i + 1)) <
end) {
661 seen += (*i).distanceTo2D(*(i + 1));
680 if (currDist >= 0 && currDist < dist) {
685 for (ContType::iterator i =
myCont.begin(); i !=
myCont.end() - 1; i++, currPos++) {
687 if (currDist >= 0 && currDist < dist) {
693 for (
size_t j = 0; j < pos; j++) {
703 if (np != *(
myCont.begin())) {
705 if (np != *(
myCont.begin())) {
707 assert(
myCont.size() > 1);
724 if (currDist >= 0 && currDist < dist) {
729 for (ContType::reverse_iterator i =
myCont.rbegin(); i !=
myCont.rend() - 1; i++, currPos++) {
731 if (currDist >= 0 && currDist < dist) {
737 for (
size_t j = 0; j < pos; j++) {
749 if (np != *(myCont.end() - 1)) {
750 myCont.erase(myCont.end() - 1);
751 if (np != *(myCont.end() - 1)) {
752 myCont.push_back(np);
753 assert(myCont.size() > 1);
754 assert(*(myCont.begin()) != *(myCont.end() - 1));
782 for (ContType::const_iterator i =
myCont.begin(); i !=
myCont.end() - 1; i++) {
788 if (dist >= 0 && (shortestDist < 0 || shortestDist > dist)) {
789 nearestPos = pos + seen;
792 seen += (*i).distanceTo2D(*(i + 1));
805 for (
int i = 1; i < (
int)
size(); i++) {
807 if (dist < minDist) {
821 int insertionIndex = 1;
822 for (
int i = 1; i < (
int)
size() - 1; i++) {
824 if (dist < minDist) {
825 insertionIndex = i + 1;
837 for (ContType::const_iterator i =
myCont.begin(); i !=
myCont.end() - 1; i++) {
839 p, *i, *(i + 1), outIntersection));
845 std::vector<SUMOReal>
847 std::vector<SUMOReal> ret;
848 for (ContType::const_iterator i = other.
myCont.begin(); i != other.
myCont.end() - 1; i++) {
850 copy(atSegment.begin(), atSegment.end(), back_inserter(ret));
856 std::vector<SUMOReal>
858 std::vector<SUMOReal> ret;
860 for (ContType::const_iterator i =
myCont.begin(); i !=
myCont.end() - 1; i++) {
861 Line l((*i), *(i + 1));
866 ret.push_back(atLength + pos);
876 assert(
myCont.size() > 1);
882 myCont.erase(myCont.begin());
884 myCont.erase(myCont.end() - 1);
892 for (ContType::const_reverse_iterator i =
myCont.rbegin(); i !=
myCont.rend(); i++) {
905 for (
size_t i = 0; i <
myCont.size(); i++) {
909 std::pair<SUMOReal, SUMOReal> offsets =
912 from.
y() - offsets.second, from.
z()));
913 }
else if (i ==
myCont.size() - 1) {
916 std::pair<SUMOReal, SUMOReal> offsets =
919 to.
y() - offsets.second, to.
z()));
925 me.
x() - to.
x(), me.
y() - to.
y()) / 2);
929 std::pair<SUMOReal, SUMOReal> off =
934 std::pair<SUMOReal, SUMOReal> offsets =
936 std::pair<SUMOReal, SUMOReal> offsets2 =
939 Position(from.
x() - offsets.first, from.
y() - offsets.second),
940 Position(me.
x() - offsets.first, me.
y() - offsets.second));
943 Position(me.
x() - offsets2.first, me.
y() - offsets2.second),
944 Position(to.
x() - offsets2.first, to.
y() - offsets2.second));
986 assert(
myCont.size() > pos + 1);
1012 std::vector<SUMOReal>
1014 std::vector<SUMOReal> ret;
1015 ContType::const_iterator i;
1070 assert(
size() > index);
1084 ContType::iterator last =
myCont.begin();
1085 for (ContType::iterator i =
myCont.begin() + 1; i !=
myCont.end();) {
1086 if (last->almostSame(*i)) {
1101 for (ContType::iterator i =
myCont.begin() + 1; i !=
myCont.end() - 1;) {
1116 for (
int i = 0; i < (
int)
size(); i++) {
1117 if ((*
this)[i] != v2[i]) {