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) {
66 std::vector<Combination> combinations;
67 for (std::vector<NBEdge*>::const_iterator j = outgoing.begin(); j != outgoing.end(); ++j) {
69 for (std::vector<NBEdge*>::const_iterator k = incoming.begin(); k != incoming.end(); ++k) {
103 combinations.push_back(c);
108 std::set<NBEdge*> seen;
109 bool haveWarned =
false;
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 && !haveWarned) {
114 WRITE_WARNING(
"Ambiguity in turnarounds computation at node '" + node->
getID() +
"'.");
120 seen.insert((*j).from);
121 seen.insert((*j).to);
123 (*j).from->setTurningDestination((*j).to);
133 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
139 EdgeVector& incoming = (*i).second->myIncomingEdges;
140 EdgeVector& outgoing = (*i).second->myOutgoingEdges;
141 std::vector<NBNode::Crossing>& crossings = (*i).second->myCrossings;
146 std::vector<NBEdge*>::iterator j;
147 for (j = allEdges.begin(); j != allEdges.end() - 1 && j != allEdges.end(); ++j) {
150 if (allEdges.size() > 1 && j != allEdges.end()) {
170 const std::vector<NBEdge*>::iterator& i1,
171 const std::vector<NBEdge*>::iterator& i2) {
193 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
212 for (EdgeVector::const_iterator j = i + 1; j != n->
myIncomingEdges.end(); j++) {
221 const int p1 = (*i)->getPriority();
222 const int p2 = (*j)->getPriority();
240 for (std::map<std::string, NBNode*>::const_iterator i = nc.
begin(); i != nc.
end(); ++i) {
244 (*j)->setJunctionPriority(n, 0);
270 NBEdge* best = incoming[0];
271 while (incoming.size() > 0 &&
samePriority(best, incoming[0])) {
272 bestIncoming.push_back(*incoming.begin());
273 incoming.erase(incoming.begin());
276 assert(outgoing.size() != 0);
280 while (outgoing.size() > 0 &&
samePriority(best, outgoing[0])) {
281 bestOutgoing.push_back(*outgoing.begin());
282 outgoing.erase(outgoing.begin());
287 EdgeVector::iterator i;
288 std::map<NBEdge*, NBEdge*> counterIncomingEdges;
289 std::map<NBEdge*, NBEdge*> counterOutgoingEdges;
292 for (i = bestIncoming.begin(); i != bestIncoming.end(); ++i) {
294 counterIncomingEdges[*i] = *incoming.begin();
296 counterOutgoingEdges[*i] = *outgoing.begin();
300 if (bestIncoming.size() == 1) {
303 if (counterIncomingEdges.find(best1) != counterIncomingEdges.end()) {
307 NBEdge* s = counterIncomingEdges.find(best1)->second;
312 if (bestOutgoing.size() != 0) {
316 if (counterOutgoingEdges.find(best1) != counterOutgoingEdges.end()) {
317 NBEdge* s = counterOutgoingEdges.find(best1)->second;
333 bool hadBest =
false;
334 for (i = bestIncoming.begin(); i != bestIncoming.end(); ++i) {
335 EdgeVector::iterator j;
341 for (j = i + 1; j != bestIncoming.end(); ++j) {
348 if (!hadBest || angle > bestAngle) {
358 if (bestOutgoing.size() != 0) {
363 if (bestOutgoing.size() != 0) {
const EdgeVector & getIncomingEdges() const
Returns this node's incoming edges.
Sorts incoming and outgoing edges clockwise around the given node.
Sorts crossings by minimum clockwise clockwise edge angle. Use the ordering found in myAllEdges of th...
NBEdge * getOppositeIncoming(NBEdge *e) const
SumoXMLNodeType myType
The type of the junction.
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, bool leftHand, const std::vector< NBEdge * >::iterator &i1, const std::vector< NBEdge * >::iterator &i2)
Assures correct order for same-angle opposite-direction edges.
static void computeTurnDirectionsForNode(NBNode *node)
Computes turnaround destinations for all incoming edges of the given nodes (if any) ...
bool isTurningDirectionAt(const NBNode *n, const NBEdge *const edge) const
Returns whether the given edge is the opposite direction to this edge.
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.
const std::string & getID() const
Returns the id.
EdgeVector myAllEdges
Vector of incoming and outgoing edges.
bool isConnectedTo(NBEdge *e)
Returns the information whethe a connection to the given edge has been added (or computed) ...
int getPriority() const
Returns the priority of the edge.
bool isSimpleContinuation() const
static void computeEdgePriorities(NBNodeCont &nc)
Computes edge priorities within a node.
unsigned int getNumLanes() const
Returns the number of lanes.
static void computeTurnDirections(NBNodeCont &nc)
Computes turnaround destinations for all edges (if exist)
std::map< std::string, NBNode * >::const_iterator end() const
Returns the pointer to the end of the stored nodes.
EdgeVector myIncomingEdges
Vector of incoming edges.
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
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.
SUMOReal getTotalAngle() const
get the angle as measure from the start to the end of this edge
Represents a single node (junction) during network building.
static NBEdge * extractAndMarkFirst(NBNode &n, std::vector< NBEdge * > &s)
Sets the priorites in case of a priority junction.
Sorts "Combination"s by decreasing angle.
static SUMOReal relAngle(SUMOReal angle1, SUMOReal angle2)
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.
static void sortNodesEdges(NBNodeCont &nc, bool leftHand)
Sorts a node's edges clockwise regarding driving direction.
const std::vector< Connection > & getConnections() const
Returns the connections.
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.