bool NBTrafficLightDefinition::forbids(const NBEdge* const possProhibitorFrom, const NBEdge* const possProhibitorTo, const NBEdge* const possProhibitedFrom, const NBEdge* const possProhibitedTo, bool regardNonSignalisedLowerPriority, bool sameNodeOnly) const { if (possProhibitorFrom == 0 || possProhibitorTo == 0 || possProhibitedFrom == 0 || possProhibitedTo == 0) { return false; } // retrieve both nodes std::vector<NBNode*>::const_iterator incoming = find_if(myControlledNodes.begin(), myControlledNodes.end(), NBContHelper::node_with_incoming_finder(possProhibitorFrom)); std::vector<NBNode*>::const_iterator outgoing = find_if(myControlledNodes.begin(), myControlledNodes.end(), NBContHelper::node_with_outgoing_finder(possProhibitedTo)); assert(incoming != myControlledNodes.end()); NBNode* incnode = *incoming; NBNode* outnode = *outgoing; EdgeVector::const_iterator i; if (incnode != outnode) { if (sameNodeOnly) { return false; } // the links are located at different nodes const EdgeVector& ev1 = possProhibitedTo->getConnectedEdges(); // go through the following edge, // check whether one of these connections is prohibited for (i = ev1.begin(); i != ev1.end(); ++i) { std::vector<NBNode*>::const_iterator outgoing2 = find_if(myControlledNodes.begin(), myControlledNodes.end(), NBContHelper::node_with_outgoing_finder(*i)); if (outgoing2 == myControlledNodes.end()) { continue; } NBNode* outnode2 = *outgoing2; if (incnode != outnode2) { continue; } if (incnode->getDirection(possProhibitedTo, *i) != LINKDIR_STRAIGHT) { continue; } bool ret1 = incnode->foes(possProhibitorFrom, possProhibitorTo, possProhibitedTo, *i); bool ret2 = incnode->forbids(possProhibitorFrom, possProhibitorTo, possProhibitedTo, *i, regardNonSignalisedLowerPriority); bool ret = ret1 || ret2; if (ret) { return true; } } const EdgeVector& ev2 = possProhibitorTo->getConnectedEdges(); // go through the following edge, // check whether one of these connections is prohibited for (i = ev2.begin(); i != ev2.end(); ++i) { std::vector<NBNode*>::const_iterator incoming2 = find_if(myControlledNodes.begin(), myControlledNodes.end(), NBContHelper::node_with_incoming_finder(possProhibitorTo)); if (incoming2 == myControlledNodes.end()) { continue; } NBNode* incnode2 = *incoming2; if (incnode2 != outnode) { continue; } if (incnode2->getDirection(possProhibitorTo, *i) != LINKDIR_STRAIGHT) { continue; } bool ret1 = incnode2->foes(possProhibitorTo, *i, possProhibitedFrom, possProhibitedTo); bool ret2 = incnode2->forbids(possProhibitorTo, *i, possProhibitedFrom, possProhibitedTo, regardNonSignalisedLowerPriority); bool ret = ret1 || ret2; if (ret) { return true; } } return false; } // both links are located at the same node // check using this node's information return incnode->forbids(possProhibitorFrom, possProhibitorTo, possProhibitedFrom, possProhibitedTo, regardNonSignalisedLowerPriority); }
void GNELane::drawArrows() const { const Position& end = getShape().back(); const Position& f = getShape()[-2]; SUMOReal rot = (SUMOReal) atan2((end.x() - f.x()), (f.y() - end.y())) * (SUMOReal) 180.0 / (SUMOReal) PI; glPushMatrix(); glPushName(0); glTranslated(0, 0, GLO_JUNCTION + .1); // must draw on top of junction shape glColor3d(1, 1, 1); glTranslated(end.x(), end.y(), 0); glRotated(rot, 0, 0, 1); // draw all links const std::vector<NBEdge::Connection>& edgeCons = myParentEdge.getNBEdge()->myConnections; NBNode* dest = myParentEdge.getNBEdge()->myTo; for (std::vector<NBEdge::Connection>::const_iterator i = edgeCons.begin(); i != edgeCons.end(); ++i) { if ((*i).fromLane == myIndex) { LinkDirection dir = dest->getDirection(myParentEdge.getNBEdge(), i->toEdge, OptionsCont::getOptions().getBool("lefthand")); switch (dir) { case LINKDIR_STRAIGHT: GLHelper::drawBoxLine(Position(0, 4), 0, 2, .05); GLHelper::drawTriangleAtEnd(Position(0, 4), Position(0, 1), (SUMOReal) 1, (SUMOReal) .25); break; case LINKDIR_LEFT: GLHelper::drawBoxLine(Position(0, 4), 0, 1.5, .05); GLHelper::drawBoxLine(Position(0, 2.5), 90, 1, .05); GLHelper::drawTriangleAtEnd(Position(0, 2.5), Position(1.5, 2.5), (SUMOReal) 1, (SUMOReal) .25); break; case LINKDIR_RIGHT: GLHelper::drawBoxLine(Position(0, 4), 0, 1.5, .05); GLHelper::drawBoxLine(Position(0, 2.5), -90, 1, .05); GLHelper::drawTriangleAtEnd(Position(0, 2.5), Position(-1.5, 2.5), (SUMOReal) 1, (SUMOReal) .25); break; case LINKDIR_TURN: GLHelper::drawBoxLine(Position(0, 4), 0, 1.5, .05); GLHelper::drawBoxLine(Position(0, 2.5), 90, .5, .05); GLHelper::drawBoxLine(Position(0.5, 2.5), 180, 1, .05); GLHelper::drawTriangleAtEnd(Position(0.5, 2.5), Position(0.5, 4), (SUMOReal) 1, (SUMOReal) .25); break; case LINKDIR_TURN_LEFTHAND: GLHelper::drawBoxLine(Position(0, 4), 0, 1.5, .05); GLHelper::drawBoxLine(Position(0, 2.5), -90, 1, .05); GLHelper::drawBoxLine(Position(-0.5, 2.5), -180, 1, .05); GLHelper::drawTriangleAtEnd(Position(-0.5, 2.5), Position(-0.5, 4), (SUMOReal) 1, (SUMOReal) .25); break; case LINKDIR_PARTLEFT: GLHelper::drawBoxLine(Position(0, 4), 0, 1.5, .05); GLHelper::drawBoxLine(Position(0, 2.5), 45, .7, .05); GLHelper::drawTriangleAtEnd(Position(0, 2.5), Position(1.2, 1.3), (SUMOReal) 1, (SUMOReal) .25); break; case LINKDIR_PARTRIGHT: GLHelper::drawBoxLine(Position(0, 4), 0, 1.5, .05); GLHelper::drawBoxLine(Position(0, 2.5), -45, .7, .05); GLHelper::drawTriangleAtEnd(Position(0, 2.5), Position(-1.2, 1.3), (SUMOReal) 1, (SUMOReal) .25); break; case LINKDIR_NODIR: GLHelper::drawBoxLine(Position(1, 5.8), 245, 2, .05); GLHelper::drawBoxLine(Position(-1, 5.8), 115, 2, .05); glTranslated(0, 5, 0); GLHelper::drawOutlineCircle(0.9, 0.8, 32); glTranslated(0, -5, 0); break; } } } glPopName(); glPopMatrix(); }