44 #ifdef CHECK_MEMORY_LEAKS 46 #endif // CHECK_MEMORY_LEAKS 57 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
67 for (std::vector<NBEdge*>::const_iterator k = incoming.begin(); k != incoming.end(); ++k) {
68 (*k)->setTurningDestination(0);
70 std::vector<Combination> combinations;
71 for (std::vector<NBEdge*>::const_iterator j = outgoing.begin(); j != outgoing.end(); ++j) {
73 for (std::vector<NBEdge*>::const_iterator k = incoming.begin(); k != incoming.end(); ++k) {
77 if (signedAngle > 0 && signedAngle < 177 && e->getGeometry().back().distanceTo2D(outedge->
getGeometry().front()) <
POSITION_EPS) {
104 combinations.push_back(c);
109 std::set<NBEdge*> seen;
110 for (std::vector<Combination>::const_iterator j = combinations.begin(); j != combinations.end(); ++j) {
111 if (seen.find((*j).from) != seen.end() || seen.find((*j).to) != seen.end()) {
113 if ((*j).angle > 360 && warn) {
114 WRITE_WARNING(
"Ambiguity in turnarounds computation at junction '" + node->
getID() +
"'.");
120 seen.insert((*j).from);
121 seen.insert((*j).to);
123 bool onlyPossible = (*j).from->getConnections().size() != 0 && !(*j).from->isConnectedTo((*j).to);
125 (*j).from->setTurningDestination((*j).to, onlyPossible);
135 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
136 i->second->sortEdges(useNodeShape);
143 const std::vector<NBEdge*>::iterator& i1,
144 const std::vector<NBEdge*>::iterator& i2) {
162 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
169 bool waterway =
true;
170 for (EdgeVector::const_iterator i = n->
getEdges().begin(); i != n->
getEdges().end(); ++i) {
194 for (EdgeVector::const_iterator j = i + 1; j != n->
myIncomingEdges.end(); j++) {
203 const int p1 = (*i)->getPriority();
204 const int p2 = (*j)->getPriority();
222 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
234 setPriorityJunctionPriorities(*n);
252 NBEdge* best = incoming[0];
253 while (incoming.size() > 0 && samePriority(best, incoming[0])) {
254 bestIncoming.push_back(*incoming.begin());
255 incoming.erase(incoming.begin());
258 assert(outgoing.size() != 0);
262 while (outgoing.size() > 0 && samePriority(best, outgoing[0])) {
263 bestOutgoing.push_back(*outgoing.begin());
264 outgoing.erase(outgoing.begin());
267 const bool mainDirectionExplicit = (
269 && (incoming.size() == 0 || bestIncoming[0]->getPriority() > incoming[0]->getPriority())
271 && (outgoing.size() == 0 || bestOutgoing[0]->getPriority() > outgoing[0]->getPriority())
272 && !bestIncoming[0]->isTurningDirectionAt(bestOutgoing[0]));
276 EdgeVector::iterator i;
277 std::map<NBEdge*, NBEdge*> counterIncomingEdges;
278 std::map<NBEdge*, NBEdge*> counterOutgoingEdges;
281 for (i = bestIncoming.begin(); i != bestIncoming.end(); ++i) {
283 counterIncomingEdges[*i] = *incoming.begin();
285 counterOutgoingEdges[*i] = *outgoing.begin();
289 if (bestIncoming.size() == 1) {
291 NBEdge* best1 = extractAndMarkFirst(n, bestIncoming);
292 if (!mainDirectionExplicit && counterIncomingEdges.find(best1) != counterIncomingEdges.end()) {
296 NBEdge* s = counterIncomingEdges.find(best1)->second;
301 assert(bestOutgoing.size() != 0);
305 best1 = extractAndMarkFirst(n, bestOutgoing);
306 if (!mainDirectionExplicit && counterOutgoingEdges.find(best1) != counterOutgoingEdges.end()) {
307 NBEdge* s = counterOutgoingEdges.find(best1)->second;
322 bool hadBest =
false;
323 for (i = bestIncoming.begin(); i != bestIncoming.end(); ++i) {
324 EdgeVector::iterator j;
330 for (j = i + 1; j != bestIncoming.end(); ++j) {
337 if (!hadBest || angle > bestAngle) {
347 if (bestOutgoing.size() != 0) {
348 extractAndMarkFirst(n, bestOutgoing);
352 if (bestOutgoing.size() != 0) {
353 extractAndMarkFirst(n, bestOutgoing);
387 myOrdering = ordering;
390 rotate(myOrdering.begin(), std::find(myOrdering.begin(), myOrdering.end(), ordering.front()), myOrdering.end());
const EdgeVector & getIncomingEdges() const
Returns this node's incoming edges (The edges which yield in this node)
NBEdge * getOppositeIncoming(NBEdge *e) const
returns the opposite incoming edge of certain edge
SumoXMLNodeType myType
The type of the junction.
static SUMOReal normRelAngle(SUMOReal angle1, SUMOReal angle2)
ensure that reverse relAngles (>=179.999) always count as turnarounds (-180)
The representation of a single edge during network building.
Class to sort edges by their angle in relation to the given edge.
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.
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)
const std::string & getID() const
Returns the id.
EdgeVector myAllEdges
Vector of incoming and outgoing edges.
int getPriority() const
Returns the priority of the edge.
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 NBEdge * extractAndMarkFirst(NBNode &n, std::vector< NBEdge * > &s, int prio=1)
Sets the priorites in case of a priority junction.
int getNumLanes() const
Returns the number of lanes.
bool isTurningDirectionAt(const NBEdge *const edge) const
Returns whether the given edge is the opposite direction to this edge.
const EdgeVector & getEdges() const
Returns all edges which participate in this node (Edges that start or end at this node) ...
std::map< std::string, NBNode * >::const_iterator end() const
Returns the pointer to the end of the stored nodes.
crossing_by_junction_angle_sorter(const NBNode *node, const EdgeVector &ordering)
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.
EdgeVector myOutgoingEdges
Vector of outgoing edges.
NBNode * getToNode() const
Returns the destination node of the edge.
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
const PositionVector & getGeometry() const
Returns the geometry of the edge.
static SUMOReal getMinAngleDiff(SUMOReal angle1, SUMOReal angle2)
Returns the minimum distance (clockwise/counter-clockwise) between both angles.
void setJunctionPriority(const NBNode *const node, int prio)
Sets the junction priority of the edge.
Represents a single node (junction) during network building.
bool isSimpleContinuation(bool checkLaneNumbers=true) const
check if node is a simple continuation
static void computeTurnDirections(NBNodeCont &nc, bool warn=true)
Computes turnaround destinations for all edges (if exist)
Sorts "Combination"s by decreasing angle.
static void setPriorityJunctionPriorities(NBNode &n)
Sets the priorites in case of a priority junction.
SUMOReal getSpeed() const
Returns the speed allowed on this edge.
Container for nodes during the netbuilding process.
std::map< std::string, NBNode * >::const_iterator begin() const
Returns the pointer to the begin of the stored nodes.
SUMOReal getAngleAtNode(const NBNode *const node) const
Returns the angle of the edge's geometry at the given node.
NBNode * getFromNode() const
Returns the origin node of the edge.