45 #ifdef CHECK_MEMORY_LEAKS
47 #endif // CHECK_MEMORY_LEAKS
66 bool singleDirection =
false;
68 singleDirection =
true;
72 singleDirection =
true;
75 if (singleDirection) {
88 for (EdgeVector::const_iterator i = incoming.begin(); i != incoming.end(); ++i) {
90 for (EdgeVector::const_iterator j = outgoing.begin(); j != outgoing.end(); ++j) {
94 maxAngle =
MAX2(ad, maxAngle);
98 if (maxAngle > 22.5) {
106 if (ret.size() < 3) {
117 tmp.rotateAtP1(
M_PI / 2);
118 tmp.extrapolateBy(100);
141 size_t counterLanes,
SUMOReal counterDist,
152 g.
replaceAt((
int)g.size() - 1, counterPos);
157 Line l(g[-2], g[-1]);
168 size_t counterLanes,
SUMOReal counterDist,
200 EdgeVector::const_iterator i;
202 std::map<NBEdge*, EdgeVector > same;
204 std::map<NBEdge*, PositionVector> geomsCCW;
206 std::map<NBEdge*, PositionVector> geomsCW;
208 std::map<NBEdge*, NBEdge*> ccwBoundary;
209 std::map<NBEdge*, NBEdge*> cwBoundary;
212 ccwBoundary[*i] = *i;
219 if (newAll.size() < 2) {
223 std::map<NBEdge*, bool> myExtended;
224 std::map<NBEdge*, SUMOReal> distances;
225 for (i = newAll.begin(); i != newAll.end(); ++i) {
226 EdgeVector::const_iterator cwi = i;
228 if (cwi == newAll.end()) {
229 cwi = newAll.begin();
231 EdgeVector::const_iterator ccwi = i;
232 if (ccwi == newAll.begin()) {
233 ccwi = newAll.end() - 1;
238 assert(geomsCCW.find(*i) != geomsCCW.end());
239 assert(geomsCW.find(*ccwi) != geomsCW.end());
240 assert(geomsCW.find(*cwi) != geomsCW.end());
241 SUMOReal angleI = geomsCCW[*i].lineAt(0).atan2PositiveAngle();
242 SUMOReal angleCCW = geomsCW[*ccwi].lineAt(0).atan2PositiveAngle();
243 SUMOReal angleCW = geomsCW[*cwi].lineAt(0).atan2PositiveAngle();
247 if (angleI > angleCCW) {
248 ccad = angleI - angleCCW;
250 ccad = twoPI - angleCCW + angleI;
253 if (angleI > angleCW) {
254 cad = twoPI - angleI + angleCW;
256 cad = angleCW - angleI;
271 if (simpleContinuation && ccad <
DEG2RAD(45.)) {
274 if (simpleContinuation && cad <
DEG2RAD(45.)) {
278 if (fabs(ccad - cad) < (
SUMOReal) 0.1 && *cwi == *ccwi) {
281 if (myExtended.find(*ccwi) != myExtended.end()) {
282 p = geomsCCW[*ccwi][0];
283 p.
add(geomsCW[*ccwi][0]);
286 p = geomsCCW[*ccwi][0];
287 p.
add(geomsCW[*ccwi][0]);
288 p.
add(geomsCCW[*i][0]);
289 p.
add(geomsCW[*i][0]);
293 SUMOReal dist = geomsCCW[*i].nearest_offset_to_point2D(p);
305 (*i)->setGeometry(g);
308 geomsCCW[*i].extrapolate(100);
310 geomsCW[*i].extrapolate(100);
313 myExtended[*i] =
true;
315 if (!simpleContinuation) {
319 distances[*i] = dist;
324 if (!simpleContinuation) {
325 if (geomsCCW[*i].intersects(geomsCW[*ccwi])) {
326 distances[*i] = (
SUMOReal) 1.5 + geomsCCW[*i].intersectsAtLengths2D(geomsCW[*ccwi])[0];
327 if (*cwi != *ccwi && geomsCW[*i].intersects(geomsCCW[*cwi])) {
329 SUMOReal a2 = (
SUMOReal) 1.5 + geomsCW[*i].intersectsAtLengths2D(geomsCCW[*cwi])[0];
331 SUMOReal mmin =
MIN2(distances[*cwi], distances[*ccwi]);
340 if (*cwi != *ccwi && geomsCW[*i].intersects(geomsCCW[*cwi])) {
341 distances[*i] = (
SUMOReal) 1.5 + geomsCW[*i].intersectsAtLengths2D(geomsCCW[*cwi])[0];
343 distances[*i] = (
SUMOReal)(100. + 1.5);
347 if (geomsCCW[*i].intersects(geomsCW[*ccwi])) {
348 distances[*i] = geomsCCW[*i].intersectsAtLengths2D(geomsCW[*ccwi])[0];
354 if (!simpleContinuation) {
355 if (geomsCW[*i].intersects(geomsCCW[*cwi])) {
356 distances[*i] = (
SUMOReal)(1.5 + geomsCW[*i].intersectsAtLengths2D(geomsCCW[*cwi])[0]);
357 if (*cwi != *ccwi && geomsCCW[*i].intersects(geomsCW[*ccwi])) {
359 SUMOReal a2 = (
SUMOReal)(1.5 + geomsCCW[*i].intersectsAtLengths2D(geomsCW[*ccwi])[0]);
361 SUMOReal mmin =
MIN2(distances[*cwi], distances[*ccwi]);
370 if (*cwi != *ccwi && geomsCCW[*i].intersects(geomsCW[*ccwi])) {
371 distances[*i] = (
SUMOReal) 1.5 + geomsCCW[*i].intersectsAtLengths2D(geomsCW[*ccwi])[0];
373 distances[*i] = (
SUMOReal)(100. + 1.5);
377 if (geomsCW[*i].intersects(geomsCCW[*cwi])) {
378 distances[*i] = geomsCW[*i].intersectsAtLengths2D(geomsCCW[*cwi])[0];
387 for (i = newAll.begin(); i != newAll.end(); ++i) {
388 if (distances.find(*i) != distances.end()) {
391 EdgeVector::const_iterator cwi = i;
393 if (cwi == newAll.end()) {
394 cwi = newAll.begin();
396 EdgeVector::const_iterator ccwi = i;
397 if (ccwi == newAll.begin()) {
398 ccwi = newAll.end() - 1;
403 assert(geomsCW.find(*ccwi) != geomsCW.end());
404 assert(geomsCW.find(*cwi) != geomsCW.end());
405 Position p1 = distances.find(*cwi) != distances.end() && distances[*cwi] != -1
406 ? geomsCCW[*cwi].positionAtOffset2D(distances[*cwi])
407 : geomsCCW[*cwi].positionAtOffset2D((
SUMOReal) - .1);
408 Position p2 = distances.find(*ccwi) != distances.end() && distances[*ccwi] != -1
409 ? geomsCW[*ccwi].positionAtOffset2D(distances[*ccwi])
410 : geomsCW[*ccwi].positionAtOffset2D((
SUMOReal) - .1);
413 SUMOReal angleI = geomsCCW[*i].lineAt(0).atan2PositiveAngle();
414 SUMOReal angleCCW = geomsCW[*ccwi].lineAt(0).atan2PositiveAngle();
415 SUMOReal angleCW = geomsCW[*cwi].lineAt(0).atan2PositiveAngle();
419 if (angleI > angleCCW) {
420 ccad = angleI - angleCCW;
422 ccad = twoPI - angleCCW + angleI;
425 if (angleI > angleCW) {
426 cad = twoPI - angleI + angleCW;
428 cad = angleCW - angleI;
444 int laneDiff = (*i)->getNumLanes() - (*ccwi)->getNumLanes();
446 laneDiff -= (*cwi)->getNumLanes();
460 if (distances.find(*cwi) == distances.end()) {
464 (*cwi)->getGeometry(), (*cwi)->getNumLanes(), distances[*cwi],
467 if (distances.find(*ccwi) == distances.end()) {
470 counter = (*ccwi)->getGeometry();
475 counter, (*ccwi)->getNumLanes(), distances[*ccwi],
480 if (distances.find(*ccwi) == distances.end()) {
484 (*ccwi)->getGeometry().reverse(), (*ccwi)->getNumLanes(), distances[*ccwi],
487 if (distances.find(*cwi) == distances.end()) {
490 counter = (*cwi)->getGeometry();
495 counter, (*cwi)->getNumLanes(), distances[*cwi],
499 (*i)->setGeometry(g);
501 if (cwBoundary[*i] != *i) {
508 if (distances.find(*cwi) == distances.end()) {
512 counter, (*cwi)->getNumLanes(), distances[*cwi],
515 if (distances.find(*cwi) == distances.end()) {
519 counter, (*cwi)->getNumLanes(), distances[*cwi],
522 cwBoundary[*i]->setGeometry(g);
523 myExtended[cwBoundary[*i]] =
true;
530 geomsCW[*i].extrapolate(100);
532 if (ccwBoundary[*i] != *i) {
539 if (distances.find(*ccwi) == distances.end()) {
543 counter, (*ccwi)->getNumLanes(), distances[*ccwi],
546 if (distances.find(*cwi) == distances.end()) {
550 counter, (*cwi)->getNumLanes(), distances[*cwi],
553 ccwBoundary[*i]->setGeometry(g);
554 myExtended[ccwBoundary[*i]] =
true;
560 geomsCCW[*i].extrapolate(100);
565 if (((*cwi)->getNumLanes() + (*ccwi)->getNumLanes()) > (*i)->getNumLanes()) {
568 if (ccwBoundary[*i] != cwBoundary[*i]) {
572 myExtended[*i] =
true;
573 distances[*i] = 100 + offset;
578 for (i = newAll.begin(); i != newAll.end(); ++i) {
611 std::map<NBEdge*, PositionVector>& geomsCCW,
612 std::map<NBEdge*, PositionVector>& geomsCW) {
613 EdgeVector::const_iterator i, j;
619 WRITE_WARNING(std::string(
"While computing intersection geometry: ") + std::string(e.what()));
620 geomsCCW[*i] = (*i)->getGeometry();
625 WRITE_WARNING(std::string(
"While computing intersection geometry: ") + std::string(e.what()));
626 geomsCW[*i] = (*i)->getGeometry();
634 Line tmp = geomsCCW[*i].lineAt(0);
636 geomsCCW[*i].replaceAt(0, tmp.
p1());
637 tmp = geomsCW[*i].lineAt(0);
639 geomsCW[*i].replaceAt(0, tmp.
p1());
649 tmp = geomsCCW[*j].lineAt(0);
651 geomsCCW[*j].replaceAt(0, tmp.
p1());
652 tmp = geomsCW[*j].lineAt(0);
654 geomsCW[*j].replaceAt(0, tmp.
p1());
656 if (same.find(*i) == same.end()) {
659 if (same.find(*j) == same.end()) {
662 if (find(same[*i].begin(), same[*i].end(), *j) == same[*i].end()) {
663 same[*i].push_back(*j);
665 if (find(same[*j].begin(), same[*j].end(), *i) == same[*j].end()) {
666 same[*j].push_back(*i);
676 const std::map<NBEdge*, EdgeVector >& same,
677 std::map<NBEdge*, PositionVector>& geomsCCW,
678 std::map<NBEdge*, PositionVector>& geomsCW,
679 std::map<NBEdge*, NBEdge*>& ccwBoundary,
680 std::map<NBEdge*, NBEdge*>& cwBoundary) {
682 EdgeVector::const_iterator j;
683 EdgeVector::iterator i2;
684 std::map<NBEdge*, EdgeVector >::iterator k;
688 for (i2 = newAll.begin(); !changed && i2 != newAll.end();) {
690 if (same.find(*i2) != same.end()) {
691 other = same.find(*i2)->second;
693 for (j = other.begin(); j != other.end(); ++j) {
694 EdgeVector::iterator k = find(newAll.begin(), newAll.end(), *j);
695 if (k != newAll.end()) {
698 geomsCW[*i2] = geomsCW[*j];
699 cwBoundary[*i2] = *j;
704 ccwBoundary[*i2] = *j;
705 geomsCCW[*i2] = geomsCCW[*j];
725 EdgeVector::const_iterator i;
730 Line cross(edgebound1);