46 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
56 for (std::vector<NBEdge*>::const_iterator k = incoming.begin(); k != incoming.end(); ++k) {
57 (*k)->setTurningDestination(0);
59 std::vector<Combination> combinations;
60 for (std::vector<NBEdge*>::const_iterator j = outgoing.begin(); j != outgoing.end(); ++j) {
62 for (std::vector<NBEdge*>::const_iterator k = incoming.begin(); k != incoming.end(); ++k) {
66 if (signedAngle > 0 && signedAngle < 177 && e->getGeometry().back().distanceTo2D(outedge->
getGeometry().front()) <
POSITION_EPS) {
71 double angle = fabs(signedAngle);
93 combinations.push_back(c);
98 std::set<NBEdge*> seen;
99 for (std::vector<Combination>::const_iterator j = combinations.begin(); j != combinations.end(); ++j) {
100 if (seen.find((*j).from) != seen.end() || seen.find((*j).to) != seen.end()) {
102 if ((*j).angle > 360 && warn) {
103 WRITE_WARNING(
"Ambiguity in turnarounds computation at junction '" + node->
getID() +
"'.");
109 seen.insert((*j).from);
110 seen.insert((*j).to);
112 bool onlyPossible = (*j).from->getConnections().size() != 0 && !(*j).from->isConnectedTo((*j).to);
114 (*j).from->setTurningDestination((*j).to, onlyPossible);
124 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
125 i->second->sortEdges(useNodeShape);
132 const std::vector<NBEdge*>::iterator& i1,
133 const std::vector<NBEdge*>::iterator& i2) {
151 validateRailCrossings(nc);
152 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
159 bool waterway =
true;
160 for (EdgeVector::const_iterator i = n->
getEdges().begin(); i != n->
getEdges().end(); ++i) {
184 for (EdgeVector::const_iterator j = i + 1; j != n->
myIncomingEdges.end(); j++) {
191 const double s1 = (*i)->getSpeed() * (double) 3.6;
192 const double s2 = (*j)->getSpeed() * (double) 3.6;
193 const int p1 = (*i)->getPriority();
194 const int p2 = (*j)->getPriority();
195 if (fabs(s1 - s2) > (
double) 9.5 ||
MAX2(s1, s2) >= (
double) 49. || p1 != p2) {
209 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
214 int numNonRailway = 0;
215 int numNonRailwayNonPed = 0;
220 numNonRailwayNonPed++;
231 if (numNonRailway == 0 || numRailway == 0) {
234 }
else if (numNonRailwayNonPed > 2) {
246 int numNonRailway = 0;
254 return numRailway > 0 && numNonRailway == 0;
262 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
263 computeEdgePrioritiesSingleNode((*i).second);
281 setPriorityJunctionPriorities(*node);
298 NBEdge* best = incoming[0];
299 while (incoming.size() > 0 && samePriority(best, incoming[0])) {
300 bestIncoming.push_back(*incoming.begin());
301 incoming.erase(incoming.begin());
304 assert(outgoing.size() != 0);
308 while (outgoing.size() > 0 && samePriority(best, outgoing[0])) {
309 bestOutgoing.push_back(*outgoing.begin());
310 outgoing.erase(outgoing.begin());
313 const bool mainDirectionExplicit = (
315 && (incoming.size() == 0 || bestIncoming[0]->getPriority() > incoming[0]->getPriority())
317 && (outgoing.size() == 0 || bestOutgoing[0]->getPriority() > outgoing[0]->getPriority())
318 && !bestIncoming[0]->isTurningDirectionAt(bestOutgoing[0]));
322 EdgeVector::iterator i;
323 std::map<NBEdge*, NBEdge*> counterIncomingEdges;
324 std::map<NBEdge*, NBEdge*> counterOutgoingEdges;
327 for (i = bestIncoming.begin(); i != bestIncoming.end(); ++i) {
329 counterIncomingEdges[*i] = *incoming.begin();
331 counterOutgoingEdges[*i] = *outgoing.begin();
336 if (bestIncoming.size() == 1) {
338 NBEdge* best1 = extractAndMarkFirst(n, bestIncoming);
339 if (!mainDirectionExplicit && counterIncomingEdges.find(best1) != counterIncomingEdges.end()) {
343 NBEdge* s = counterIncomingEdges.find(best1)->second;
345 if (minAngleDiff > 180 - 45
346 || (minAngleDiff > 75 && s->
getPriority() == best1->
getPriority() && hasDifferentPriorities(incoming, best1))) {
350 markBestParallel(n, best1, 0);
351 assert(bestOutgoing.size() != 0);
355 NBEdge* bestOut = extractAndMarkFirst(n, bestOutgoing);
356 if (!mainDirectionExplicit && counterOutgoingEdges.find(bestOut) != counterOutgoingEdges.end()) {
357 NBEdge* s = counterOutgoingEdges.find(bestOut)->second;
370 double bestAngle = 0;
373 bool hadBest =
false;
374 for (i = bestIncoming.begin(); i != bestIncoming.end(); ++i) {
375 EdgeVector::iterator j;
381 for (j = i + 1; j != bestIncoming.end(); ++j) {
388 if (!hadBest || angle > bestAngle) {
398 if (bestOutgoing.size() != 0) {
399 extractAndMarkFirst(n, bestOutgoing);
403 if (bestOutgoing.size() != 0) {
404 extractAndMarkFirst(n, bestOutgoing);
407 markBestParallel(n, bestFirst, bestSecond);
414 const double a2 = bestSecond == 0 ? a1 : bestSecond->
getAngleAtNode(&n);
423 && (p1 & perm) == 0 && (p2 & perm) == 0) {
424 e->setJunctionPriority(&n, 1);
459 if (edges.size() < 2) {
462 int prio = edges[0] == excluded ? edges[1]->
getPriority() : edges[0]->getPriority();
463 for (
auto e : edges) {
474 myOrdering = ordering;
477 rotate(myOrdering.begin(), std::find(myOrdering.begin(), myOrdering.end(), ordering.front()), myOrdering.end());
static double getMinAngleDiff(double angle1, double angle2)
Returns the minimum distance (clockwise/counter-clockwise) between both angles.
std::map< std::string, NBNode * >::const_iterator begin() const
Returns the pointer to the begin of the stored nodes.
static void validateRailCrossings(NBNodeCont &nc)
Checks rail_crossing for validity.
static void markBestParallel(const NBNode &n, NBEdge *bestFirst, NBEdge *bestSecond)
set priority for edges that are parallel to the best edges
std::map< std::string, NBNode * >::const_iterator end() const
Returns the pointer to the end of the stored nodes.
static double normRelAngle(double angle1, double angle2)
ensure that reverse relAngles (>=179.999) always count as turnarounds (-180)
SumoXMLNodeType myType
The type of the junction.
int getPriority() const
Returns the priority of the edge.
int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
The representation of a single edge during network building.
Class to sort edges by their angle in relation to the given edge.
void markBentPriority(bool isBent)
mark whether a priority road turns at this node
const std::string & getID() const
Returns the id.
static void sortNodesEdges(NBNodeCont &nc, bool useNodeShape=false)
Sorts a node's edges clockwise regarding driving direction.
Stores the information about the angle between an incoming ("from") and an outgoing ("to") edge...
#define WRITE_WARNING(msg)
const EdgeVector & getOutgoingEdges() const
Returns this node's outgoing edges (The edges which start at this node)
The link is a straight direction.
static bool hasDifferentPriorities(const EdgeVector &edges, const NBEdge *excluded)
return whether the priorite attribute can be used to distinguish the edges
EdgeVector myAllEdges
Vector of incoming and outgoing edges.
static void swapWhenReversed(const NBNode *const n, const std::vector< NBEdge *>::iterator &i1, const std::vector< NBEdge *>::iterator &i2)
Assures correct order for same-angle opposite-direction edges.
int getNumLanes() const
Returns the number of lanes.
classes which drive on tracks
static void computeEdgePriorities(NBNodeCont &nc)
Computes edge priorities within a node.
bool isWaterway(SVCPermissions permissions)
Returns whether an edge with the given permission is a waterway edge.
static bool isRailwayNode(NBNode *n)
whether the given node only has rail edges
const EdgeVector & getEdges() const
Returns all edges which participate in this node (Edges that start or end at this node) ...
double getAngleAtNode(const NBNode *const node) const
Returns the angle of the edge's geometry at the given node.
crossing_by_junction_angle_sorter(const NBNode *node, const EdgeVector &ordering)
SVCPermissions getPermissions(int lane=-1) const
get the union of allowed classes over all lanes or for a specific lane
EdgeVector myIncomingEdges
Vector of incoming edges.
static void computeTurnDirectionsForNode(NBNode *node, bool warn)
Computes turnaround destinations for all incoming edges of the given nodes (if any) ...
static bool samePriority(const NBEdge *const e1, const NBEdge *const e2)
Returns whether both edges have the same priority.
LinkDirection getDirection(const NBEdge *const incoming, const NBEdge *const outgoing, bool leftHand=false) const
Returns the representation of the described stream's direction.
double getSpeed() const
Returns the speed allowed on this edge.
const PositionVector & getGeometry() const
Returns the geometry of the edge.
EdgeVector myOutgoingEdges
Vector of outgoing edges.
static void computeEdgePrioritiesSingleNode(NBNode *node)
Computes edge priorities within a single node.
const EdgeVector & getIncomingEdges() const
Returns this node's incoming edges (The edges which yield in this node)
static void computeNodeTypes(NBNodeCont &nc)
Computes node types.
SumoXMLNodeType
Numbers representing special SUMO-XML-attribute values for representing node- (junction-) types used ...
std::vector< NBEdge * > EdgeVector
container for (sorted) edges
void setJunctionPriority(const NBNode *const node, int prio)
Sets the junction priority of the edge.
SumoXMLNodeType getType() const
Returns the type of this node.
bool isTurningDirectionAt(const NBEdge *const edge) const
Returns whether the given edge is the opposite direction to this edge.
Represents a single node (junction) during network building.
static void computeTurnDirections(NBNodeCont &nc, bool warn=true)
Computes turnaround destinations for all edges (if exist)
static NBEdge * extractAndMarkFirst(NBNode &n, std::vector< NBEdge *> &s, int prio=1)
Sets the priorites in case of a priority junction.
NBEdge * getOppositeIncoming(NBEdge *e) const
returns the opposite incoming edge of certain edge
Sorts "Combination"s by decreasing angle.
static void setPriorityJunctionPriorities(NBNode &n)
Sets the priorites in case of a priority junction.
NBNode * getFromNode() const
Returns the origin node of the edge.
Container for nodes during the netbuilding process.
NBNode * getToNode() const
Returns the destination node of the edge.
bool isSimpleContinuation(bool checkLaneNumbers=true) const
check if node is a simple continuation