44 #ifdef CHECK_MEMORY_LEAKS
46 #endif // CHECK_MEMORY_LEAKS
65 bool singleDirection =
false;
67 singleDirection =
true;
71 singleDirection =
true;
74 if (singleDirection) {
87 for (EdgeVector::const_iterator i = incoming.begin(); i != incoming.end(); ++i) {
89 for (EdgeVector::const_iterator j = outgoing.begin(); j != outgoing.end(); ++j) {
93 maxAngle =
MAX2(ad, maxAngle);
97 if (maxAngle > 22.5) {
105 if (ret.
size() < 3) {
116 tmp.rotateAtP1(
PI / 2);
117 tmp.extrapolateBy(100);
140 size_t counterLanes,
SUMOReal counterDist,
156 Line l(g[-2], g[-1]);
167 size_t counterLanes,
SUMOReal counterDist,
199 EdgeVector::const_iterator i;
201 std::map<NBEdge*, EdgeVector > same;
203 std::map<NBEdge*, PositionVector> geomsCCW;
205 std::map<NBEdge*, PositionVector> geomsCW;
207 std::map<NBEdge*, NBEdge*> ccwBoundary;
208 std::map<NBEdge*, NBEdge*> cwBoundary;
211 ccwBoundary[*i] = *i;
218 if (newAll.size() < 2) {
222 std::map<NBEdge*, bool> myExtended;
223 std::map<NBEdge*, SUMOReal> distances;
224 for (i = newAll.begin(); i != newAll.end(); ++i) {
225 EdgeVector::const_iterator cwi = i;
227 if (cwi == newAll.end()) {
228 cwi = newAll.begin();
230 EdgeVector::const_iterator ccwi = i;
231 if (ccwi == newAll.begin()) {
232 ccwi = newAll.end() - 1;
237 assert(geomsCCW.find(*i) != geomsCCW.end());
238 assert(geomsCW.find(*ccwi) != geomsCW.end());
239 assert(geomsCW.find(*cwi) != geomsCW.end());
240 SUMOReal angleI = geomsCCW[*i].lineAt(0).atan2PositiveAngle();
241 SUMOReal angleCCW = geomsCW[*ccwi].lineAt(0).atan2PositiveAngle();
242 SUMOReal angleCW = geomsCW[*cwi].lineAt(0).atan2PositiveAngle();
246 if (angleI > angleCCW) {
247 ccad = angleI - angleCCW;
249 ccad = twoPI - angleCCW + angleI;
252 if (angleI > angleCW) {
253 cad = twoPI - angleI + angleCW;
255 cad = angleCW - angleI;
270 if (simpleContinuation && ccad < (
SUMOReal)(45. / 180.*
PI)) {
273 if (simpleContinuation && cad < (
SUMOReal)(45. / 180.*
PI)) {
277 if (fabs(ccad - cad) < (
SUMOReal) 0.1 && *cwi == *ccwi) {
280 if (myExtended.find(*ccwi) != myExtended.end()) {
281 p = geomsCCW[*ccwi][0];
282 p.
add(geomsCW[*ccwi][0]);
285 p = geomsCCW[*ccwi][0];
286 p.
add(geomsCW[*ccwi][0]);
287 p.
add(geomsCCW[*i][0]);
288 p.
add(geomsCW[*i][0]);
292 SUMOReal dist = geomsCCW[*i].nearest_position_on_line_to_point2D(p);
304 (*i)->setGeometry(g);
307 geomsCCW[*i].extrapolate(100);
309 geomsCW[*i].extrapolate(100);
312 myExtended[*i] =
true;
314 if (!simpleContinuation) {
318 distances[*i] = dist;
323 if (!simpleContinuation) {
324 if (geomsCCW[*i].intersects(geomsCW[*ccwi])) {
325 distances[*i] = (
SUMOReal) 1.5 + geomsCCW[*i].intersectsAtLengths2D(geomsCW[*ccwi])[0];
326 if (*cwi != *ccwi && geomsCW[*i].intersects(geomsCCW[*cwi])) {
328 SUMOReal a2 = (
SUMOReal) 1.5 + geomsCW[*i].intersectsAtLengths2D(geomsCCW[*cwi])[0];
330 SUMOReal mmin =
MIN2(distances[*cwi], distances[*ccwi]);
339 if (*cwi != *ccwi && geomsCW[*i].intersects(geomsCCW[*cwi])) {
340 distances[*i] = (
SUMOReal) 1.5 + geomsCW[*i].intersectsAtLengths2D(geomsCCW[*cwi])[0];
342 distances[*i] = (
SUMOReal)(100. + 1.5);
346 if (geomsCCW[*i].intersects(geomsCW[*ccwi])) {
347 distances[*i] = geomsCCW[*i].intersectsAtLengths2D(geomsCW[*ccwi])[0];
353 if (!simpleContinuation) {
354 if (geomsCW[*i].intersects(geomsCCW[*cwi])) {
355 distances[*i] = (
SUMOReal)(1.5 + geomsCW[*i].intersectsAtLengths2D(geomsCCW[*cwi])[0]);
356 if (*cwi != *ccwi && geomsCCW[*i].intersects(geomsCW[*ccwi])) {
358 SUMOReal a2 = (
SUMOReal)(1.5 + geomsCCW[*i].intersectsAtLengths2D(geomsCW[*ccwi])[0]);
360 SUMOReal mmin =
MIN2(distances[*cwi], distances[*ccwi]);
369 if (*cwi != *ccwi && geomsCCW[*i].intersects(geomsCW[*ccwi])) {
370 distances[*i] = (
SUMOReal) 1.5 + geomsCCW[*i].intersectsAtLengths2D(geomsCW[*ccwi])[0];
372 distances[*i] = (
SUMOReal)(100. + 1.5);
376 if (geomsCW[*i].intersects(geomsCCW[*cwi])) {
377 distances[*i] = geomsCW[*i].intersectsAtLengths2D(geomsCCW[*cwi])[0];
386 for (i = newAll.begin(); i != newAll.end(); ++i) {
387 if (distances.find(*i) != distances.end()) {
390 EdgeVector::const_iterator cwi = i;
392 if (cwi == newAll.end()) {
393 cwi = newAll.begin();
395 EdgeVector::const_iterator ccwi = i;
396 if (ccwi == newAll.begin()) {
397 ccwi = newAll.end() - 1;
402 assert(geomsCW.find(*ccwi) != geomsCW.end());
403 assert(geomsCW.find(*cwi) != geomsCW.end());
404 Position p1 = distances.find(*cwi) != distances.end() && distances[*cwi] != -1
405 ? geomsCCW[*cwi].positionAtLengthPosition2D(distances[*cwi])
406 : geomsCCW[*cwi].positionAtLengthPosition2D((
SUMOReal) - .1);
407 Position p2 = distances.find(*ccwi) != distances.end() && distances[*ccwi] != -1
408 ? geomsCW[*ccwi].positionAtLengthPosition2D(distances[*ccwi])
409 : geomsCW[*ccwi].positionAtLengthPosition2D((
SUMOReal) - .1);
412 SUMOReal angleI = geomsCCW[*i].lineAt(0).atan2PositiveAngle();
413 SUMOReal angleCCW = geomsCW[*ccwi].lineAt(0).atan2PositiveAngle();
414 SUMOReal angleCW = geomsCW[*cwi].lineAt(0).atan2PositiveAngle();
418 if (angleI > angleCCW) {
419 ccad = angleI - angleCCW;
421 ccad = twoPI - angleCCW + angleI;
424 if (angleI > angleCW) {
425 cad = twoPI - angleI + angleCW;
427 cad = angleCW - angleI;
443 int laneDiff = (*i)->getNumLanes() - (*ccwi)->getNumLanes();
445 laneDiff -= (*cwi)->getNumLanes();
459 if (distances.find(*cwi) == distances.end()) {
463 (*cwi)->getGeometry(), (*cwi)->getNumLanes(), distances[*cwi],
466 if (distances.find(*ccwi) == distances.end()) {
469 counter = (*ccwi)->getGeometry();
474 counter, (*ccwi)->getNumLanes(), distances[*ccwi],
479 if (distances.find(*ccwi) == distances.end()) {
483 (*ccwi)->getGeometry().reverse(), (*ccwi)->getNumLanes(), distances[*ccwi],
486 if (distances.find(*cwi) == distances.end()) {
489 counter = (*cwi)->getGeometry();
494 counter, (*cwi)->getNumLanes(), distances[*cwi],
498 (*i)->setGeometry(g);
500 if (cwBoundary[*i] != *i) {
507 if (distances.find(*cwi) == distances.end()) {
511 counter, (*cwi)->getNumLanes(), distances[*cwi],
514 if (distances.find(*cwi) == distances.end()) {
518 counter, (*cwi)->getNumLanes(), distances[*cwi],
521 cwBoundary[*i]->setGeometry(g);
522 myExtended[cwBoundary[*i]] =
true;
529 geomsCW[*i].extrapolate(100);
531 if (ccwBoundary[*i] != *i) {
538 if (distances.find(*ccwi) == distances.end()) {
542 counter, (*ccwi)->getNumLanes(), distances[*ccwi],
545 if (distances.find(*cwi) == distances.end()) {
549 counter, (*cwi)->getNumLanes(), distances[*cwi],
552 ccwBoundary[*i]->setGeometry(g);
553 myExtended[ccwBoundary[*i]] =
true;
559 geomsCCW[*i].extrapolate(100);
564 if (((*cwi)->getNumLanes() + (*ccwi)->getNumLanes()) > (*i)->getNumLanes()) {
567 if (ccwBoundary[*i] != cwBoundary[*i]) {
571 myExtended[*i] =
true;
572 distances[*i] = 100 + offset;
577 for (i = newAll.begin(); i != newAll.end(); ++i) {
608 std::map<NBEdge*, PositionVector> &geomsCCW,
609 std::map<NBEdge*, PositionVector> &geomsCW) {
610 EdgeVector::const_iterator i, j;
621 Line tmp = geomsCCW[*i].lineAt(0);
623 geomsCCW[*i].replaceAt(0, tmp.
p1());
624 tmp = geomsCW[*i].lineAt(0);
626 geomsCW[*i].replaceAt(0, tmp.
p1());
636 tmp = geomsCCW[*j].lineAt(0);
638 geomsCCW[*j].replaceAt(0, tmp.
p1());
639 tmp = geomsCW[*j].lineAt(0);
641 geomsCW[*j].replaceAt(0, tmp.
p1());
643 if (same.find(*i) == same.end()) {
646 if (same.find(*j) == same.end()) {
649 if (find(same[*i].begin(), same[*i].end(), *j) == same[*i].end()) {
650 same[*i].push_back(*j);
652 if (find(same[*j].begin(), same[*j].end(), *i) == same[*j].end()) {
653 same[*j].push_back(*i);
663 const std::map<NBEdge*, EdgeVector > &same,
664 std::map<NBEdge*, PositionVector> &geomsCCW,
665 std::map<NBEdge*, PositionVector> &geomsCW,
666 std::map<NBEdge*, NBEdge*> &ccwBoundary,
667 std::map<NBEdge*, NBEdge*> &cwBoundary) {
669 EdgeVector::const_iterator j;
670 EdgeVector::iterator i2;
671 std::map<NBEdge*, EdgeVector >::iterator k;
675 for (i2 = newAll.begin(); !changed && i2 != newAll.end();) {
677 if (same.find(*i2) != same.end()) {
678 other = same.find(*i2)->second;
680 for (j = other.begin(); j != other.end(); ++j) {
681 EdgeVector::iterator k = find(newAll.begin(), newAll.end(), *j);
682 if (k != newAll.end()) {
685 geomsCW[*i2] = geomsCW[*j];
686 cwBoundary[*i2] = *j;
691 ccwBoundary[*i2] = *j;
692 geomsCCW[*i2] = geomsCCW[*j];
712 EdgeVector::const_iterator i;
717 Line cross(edgebound1);