本文整理汇总了C++中NBEdge::getToNode方法的典型用法代码示例。如果您正苦于以下问题:C++ NBEdge::getToNode方法的具体用法?C++ NBEdge::getToNode怎么用?C++ NBEdge::getToNode使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类NBEdge
的用法示例。
在下文中一共展示了NBEdge::getToNode方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: assert
void
NWWriter_SUMO::writeConnection(OutputDevice& into, const NBEdge& from, const NBEdge::Connection& c,
bool includeInternal, ConnectionStyle style) {
assert(c.toEdge != 0);
into.openTag(SUMO_TAG_CONNECTION);
into.writeAttr(SUMO_ATTR_FROM, from.getID());
into.writeAttr(SUMO_ATTR_TO, c.toEdge->getID());
into.writeAttr(SUMO_ATTR_FROM_LANE, c.fromLane);
into.writeAttr(SUMO_ATTR_TO_LANE, c.toLane);
if (c.mayDefinitelyPass) {
into.writeAttr(SUMO_ATTR_PASS, c.mayDefinitelyPass);
}
if (style != PLAIN) {
if (includeInternal) {
into.writeAttr(SUMO_ATTR_VIA, c.id + "_0");
}
// set information about the controlling tl if any
if (c.tlID != "") {
into.writeAttr(SUMO_ATTR_TLID, c.tlID);
into.writeAttr(SUMO_ATTR_TLLINKINDEX, c.tlLinkNo);
}
if (style == SUMONET) {
// write the direction information
LinkDirection dir = from.getToNode()->getDirection(&from, c.toEdge);
assert(dir != LINKDIR_NODIR);
into.writeAttr(SUMO_ATTR_DIR, toString(dir));
// write the state information
const LinkState linkState = from.getToNode()->getLinkState(
&from, c.toEdge, c.toLane, c.mayDefinitelyPass, c.tlID);
into.writeAttr(SUMO_ATTR_STATE, linkState);
}
}
into.closeTag();
}
示例2: while
NBEdge*
NIImporter_VISUM::getNamedEdgeContinuating(NBEdge* begin, NBNode* node) {
if (begin == 0) {
return 0;
}
NBEdge* ret = begin;
std::string edgeID = ret->getID();
// hangle forward
while (ret != 0) {
// ok, this is the edge we are looking for
if (ret->getToNode() == node) {
return ret;
}
const EdgeVector& nedges = ret->getToNode()->getOutgoingEdges();
if (nedges.size() != 1) {
// too many edges follow
ret = 0;
continue;
}
NBEdge* next = nedges[0];
if (ret->getID().substr(0, edgeID.length()) != next->getID().substr(0, edgeID.length())) {
// ok, another edge is next...
ret = 0;
continue;
}
if (next->getID().substr(next->getID().length() - node->getID().length()) != node->getID()) {
ret = 0;
continue;
}
ret = next;
}
ret = begin;
// hangle backward
while (ret != 0) {
// ok, this is the edge we are looking for
if (ret->getFromNode() == node) {
return ret;
}
const EdgeVector& nedges = ret->getFromNode()->getIncomingEdges();
if (nedges.size() != 1) {
// too many edges follow
ret = 0;
continue;
}
NBEdge* next = nedges[0];
if (ret->getID().substr(0, edgeID.length()) != next->getID().substr(0, edgeID.length())) {
// ok, another edge is next...
ret = 0;
continue;
}
if (next->getID().substr(next->getID().length() - node->getID().length()) != node->getID()) {
ret = 0;
continue;
}
ret = next;
}
return 0;
}
示例3: writeLane
void
NWWriter_SUMO::writeEdge(OutputDevice& into, const NBEdge& e, bool noNames, bool origNames) {
// write the edge's begin
into.openTag(SUMO_TAG_EDGE).writeAttr(SUMO_ATTR_ID, e.getID());
into.writeAttr(SUMO_ATTR_FROM, e.getFromNode()->getID());
into.writeAttr(SUMO_ATTR_TO, e.getToNode()->getID());
if (!noNames && e.getStreetName() != "") {
into.writeAttr(SUMO_ATTR_NAME, StringUtils::escapeXML(e.getStreetName()));
}
into.writeAttr(SUMO_ATTR_PRIORITY, e.getPriority());
if (e.getTypeID() != "") {
into.writeAttr(SUMO_ATTR_TYPE, e.getTypeID());
}
if (e.isMacroscopicConnector()) {
into.writeAttr(SUMO_ATTR_FUNCTION, EDGEFUNC_CONNECTOR);
}
// write the spread type if not default ("right")
if (e.getLaneSpreadFunction() != LANESPREAD_RIGHT) {
into.writeAttr(SUMO_ATTR_SPREADTYPE, e.getLaneSpreadFunction());
}
if (e.hasLoadedLength()) {
into.writeAttr(SUMO_ATTR_LENGTH, e.getLoadedLength());
}
if (!e.hasDefaultGeometry()) {
into.writeAttr(SUMO_ATTR_SHAPE, e.getGeometry());
}
// write the lanes
const std::vector<NBEdge::Lane>& lanes = e.getLanes();
SUMOReal length = e.getLoadedLength();
if (OptionsCont::getOptions().getBool("no-internal-links") && !e.hasLoadedLength()) {
// use length to junction center even if a modified geometry was given
PositionVector geom = e.cutAtIntersection(e.getGeometry());
geom.push_back_noDoublePos(e.getToNode()->getCenter());
geom.push_front_noDoublePos(e.getFromNode()->getCenter());
length = geom.length();
}
if (length <= 0) {
length = POSITION_EPS;
}
for (unsigned int i = 0; i < (unsigned int) lanes.size(); i++) {
const NBEdge::Lane& l = lanes[i];
writeLane(into, e.getID(), e.getLaneID(i), l.speed,
l.permissions, l.preferred, l.endOffset, l.width, l.shape, l.origID,
length, i, origNames);
}
// close the edge
into.closeTag();
}
示例4: ProcessError
void
NBTrafficLightDefinition::collectAllLinks() {
myControlledLinks.clear();
int tlIndex = 0;
// build the list of links which are controled by the traffic light
for (EdgeVector::iterator i = myIncomingEdges.begin(); i != myIncomingEdges.end(); i++) {
NBEdge* incoming = *i;
unsigned int noLanes = incoming->getNumLanes();
for (unsigned int j = 0; j < noLanes; j++) {
std::vector<NBEdge::Connection> connected = incoming->getConnectionsFromLane(j);
for (std::vector<NBEdge::Connection>::iterator k = connected.begin(); k != connected.end(); k++) {
const NBEdge::Connection& el = *k;
if (incoming->mayBeTLSControlled(el.fromLane, el.toEdge, el.toLane)) {
if (el.toEdge != 0 && el.toLane >= (int) el.toEdge->getNumLanes()) {
throw ProcessError("Connection '" + incoming->getID() + "_" + toString(j) + "->" + el.toEdge->getID() + "_" + toString(el.toLane) + "' yields in a not existing lane.");
}
if (incoming->getToNode()->getType() != NODETYPE_RAIL_CROSSING || !isRailway(incoming->getPermissions())) {
myControlledLinks.push_back(NBConnection(incoming, el.fromLane, el.toEdge, el.toLane, tlIndex++));
} else {
myControlledLinks.push_back(NBConnection(incoming, el.fromLane, el.toEdge, el.toLane, -1));
}
}
}
}
}
}
示例5: st
bool
NIImporter_DlrNavteq::TrafficlightsHandler::report(const std::string& result) {
// #ID POICOL-TYPE DESCRIPTION LONGITUDE LATITUDE NAVTEQ_LINK_ID NODEID
if (result[0] == '#') {
return true;
}
StringTokenizer st(result, StringTokenizer::WHITECHARS);
const std::string edgeID = st.get(5);
NBEdge* edge = myEdgeCont.retrieve(edgeID);
if (edge == nullptr) {
WRITE_WARNING("The traffic light edge '" + edgeID + "' could not be found");
} else {
NBNode* node = edge->getToNode();
if (node->getType() != NODETYPE_TRAFFIC_LIGHT) {
node->reinit(node->getPosition(), NODETYPE_TRAFFIC_LIGHT);
// @note. There may be additional information somewhere in the GDF files about traffic light type ...
TrafficLightType type = SUMOXMLDefinitions::TrafficLightTypes.get(OptionsCont::getOptions().getString("tls.default-type"));
// @note actually we could use the navteq node ID here
NBTrafficLightDefinition* tlDef = new NBOwnTLDef(node->getID(), node, 0, type);
if (!myTLLogicCont.insert(tlDef)) {
// actually, nothing should fail here
delete tlDef;
throw ProcessError("Could not allocate tls for '" + node->getID() + "'.");
}
}
}
return true;
}
示例6: retrieve
void
NBEdgeCont::recheckPostProcessConnections() {
for (std::vector<PostProcessConnection>::const_iterator i = myConnections.begin(); i != myConnections.end(); ++i) {
NBEdge* from = retrieve((*i).from);
NBEdge* to = retrieve((*i).to);
if (from != 0 && to != 0) {
if (!from->addLane2LaneConnection((*i).fromLane, to, (*i).toLane, NBEdge::L2L_USER, false, (*i).mayDefinitelyPass)) {
WRITE_WARNING("Could not insert connection between '" + (*i).from + "' and '" + (*i).to + "' after build.");
}
}
}
// during loading we also kept some ambiguous connections in hope they might be valid after processing
// we need to make sure that all invalid connections are removed now
for (EdgeCont::iterator it = myEdges.begin(); it != myEdges.end(); ++it) {
NBEdge* edge = it->second;
NBNode* to = edge->getToNode();
// make a copy because we may delete connections
std::vector<NBEdge::Connection> connections = edge->getConnections();
for (std::vector<NBEdge::Connection>::iterator it_con = connections.begin(); it_con != connections.end(); ++it_con) {
NBEdge::Connection& c = *it_con;
if (c.toEdge != 0 && c.toEdge->getFromNode() != to) {
WRITE_WARNING("Found and removed invalid connection from " + edge->getID() +
" to " + c.toEdge->getID() + " via " + to->getID());
edge->removeFromConnections(c.toEdge);
}
}
}
}
示例7: buildOnRamp
// ===========================================================================
// method definitions
// ===========================================================================
// ---------------------------------------------------------------------------
// NBRampsComputer
// ---------------------------------------------------------------------------
void
NBRampsComputer::computeRamps(NBNetBuilder& nb, OptionsCont& oc) {
SUMOReal minHighwaySpeed = oc.getFloat("ramps.min-highway-speed");
SUMOReal maxRampSpeed = oc.getFloat("ramps.max-ramp-speed");
SUMOReal rampLength = oc.getFloat("ramps.ramp-length");
bool dontSplit = oc.getBool("ramps.no-split");
std::set<NBEdge*> incremented;
// check whether on-off ramps shall be guessed
if (oc.getBool("ramps.guess")) {
NBNodeCont& nc = nb.getNodeCont();
NBEdgeCont& ec = nb.getEdgeCont();
NBDistrictCont& dc = nb.getDistrictCont();
std::set<NBNode*> potOnRamps;
std::set<NBNode*> potOffRamps;
for (std::map<std::string, NBNode*>::const_iterator i = nc.begin(); i != nc.end(); ++i) {
NBNode* cur = (*i).second;
if (mayNeedOnRamp(cur, minHighwaySpeed, maxRampSpeed)) {
potOnRamps.insert(cur);
}
if (mayNeedOffRamp(cur, minHighwaySpeed, maxRampSpeed)) {
potOffRamps.insert(cur);
}
}
for (std::set<NBNode*>::const_iterator i = potOnRamps.begin(); i != potOnRamps.end(); ++i) {
buildOnRamp(*i, nc, ec, dc, rampLength, dontSplit, incremented);
}
for (std::set<NBNode*>::const_iterator i = potOffRamps.begin(); i != potOffRamps.end(); ++i) {
buildOffRamp(*i, nc, ec, dc, rampLength, dontSplit, incremented);
}
}
// check whether on-off ramps shall be guessed
if (oc.isSet("ramps.set")) {
std::vector<std::string> edges = oc.getStringVector("ramps.set");
NBNodeCont& nc = nb.getNodeCont();
NBEdgeCont& ec = nb.getEdgeCont();
NBDistrictCont& dc = nb.getDistrictCont();
for (std::vector<std::string>::iterator i = edges.begin(); i != edges.end(); ++i) {
NBEdge* e = ec.retrieve(*i);
if (e == 0) {
WRITE_WARNING("Can not build on ramp on edge '" + *i + "' - the edge is not known.");
continue;
}
NBNode* from = e->getFromNode();
if (from->getIncomingEdges().size() == 2 && from->getOutgoingEdges().size() == 1) {
buildOnRamp(from, nc, ec, dc, rampLength, dontSplit, incremented);
}
// load edge again to check offramps
e = ec.retrieve(*i);
if (e == 0) {
WRITE_WARNING("Can not build off ramp on edge '" + *i + "' - the edge is not known.");
continue;
}
NBNode* to = e->getToNode();
if (to->getIncomingEdges().size() == 1 && to->getOutgoingEdges().size() == 2) {
buildOffRamp(to, nc, ec, dc, rampLength, dontSplit, incremented);
}
}
}
}
示例8: writeHeader
void
NWWriter_DlrNavteq::writeLinksUnsplitted(const OptionsCont& oc, NBEdgeCont& ec) {
std::map<const std::string, std::string> nameIDs;
OutputDevice& device = OutputDevice::getDevice(oc.getString("dlr-navteq-output") + "_links_unsplitted.txt");
writeHeader(device, oc);
// write format specifier
device << "# LINK_ID\tNODE_ID_FROM\tNODE_ID_TO\tBETWEEN_NODE_ID\tLENGTH\tVEHICLE_TYPE\tFORM_OF_WAY\tBRUNNEL_TYPE\tFUNCTIONAL_ROAD_CLASS\tSPEED_CATEGORY\tNUMBER_OF_LANES\tSPEED_LIMIT\tSPEED_RESTRICTION\tNAME_ID1_REGIONAL\tNAME_ID2_LOCAL\tHOUSENUMBERS_RIGHT\tHOUSENUMBERS_LEFT\tZIP_CODE\tAREA_ID\tSUBAREA_ID\tTHROUGH_TRAFFIC\tSPECIAL_RESTRICTIONS\tEXTENDED_NUMBER_OF_LANES\tISRAMP\tCONNECTION\n";
// write edges
for (std::map<std::string, NBEdge*>::const_iterator i = ec.begin(); i != ec.end(); ++i) {
NBEdge* e = (*i).second;
const int kph = speedInKph(e->getSpeed());
const std::string& betweenNodeID = (e->getGeometry().size() > 2) ? e->getID() : UNDEFINED;
std::string nameID = UNDEFINED;
if (oc.getBool("output.street-names")) {
const std::string& name = i->second->getStreetName();
if (name != "" && nameIDs.count(name) == 0) {
nameID = toString(nameIDs.size());
nameIDs[name] = nameID;
}
}
device << e->getID() << "\t"
<< e->getFromNode()->getID() << "\t"
<< e->getToNode()->getID() << "\t"
<< betweenNodeID << "\t"
<< getGraphLength(e) << "\t"
<< getAllowedTypes(e->getPermissions()) << "\t"
<< "3\t" // Speed Category 1-8 XXX refine this
<< UNDEFINED << "\t" // no special brunnel type (we don't know yet)
<< getRoadClass(e) << "\t"
<< getSpeedCategory(kph) << "\t"
<< getNavteqLaneCode(e->getNumLanes()) << "\t"
<< getSpeedCategoryUpperBound(kph) << "\t"
<< kph << "\t"
<< nameID << "\t" // NAME_ID1_REGIONAL XXX
<< UNDEFINED << "\t" // NAME_ID2_LOCAL XXX
<< UNDEFINED << "\t" // housenumbers_right
<< UNDEFINED << "\t" // housenumbers_left
<< UNDEFINED << "\t" // ZIP_CODE
<< UNDEFINED << "\t" // AREA_ID
<< UNDEFINED << "\t" // SUBAREA_ID
<< "1\t" // through_traffic (allowed)
<< UNDEFINED << "\t" // special_restrictions
<< UNDEFINED << "\t" // extended_number_of_lanes
<< UNDEFINED << "\t" // isRamp
<< "0\t" // connection (between nodes always in order)
<< "\n";
}
if (oc.getBool("output.street-names")) {
OutputDevice& namesDevice = OutputDevice::getDevice(oc.getString("dlr-navteq-output") + "_names.txt");
writeHeader(namesDevice, oc);
// write format specifier
namesDevice << "# NAME_ID\tName\n" << nameIDs.size() << "\n";
for (std::map<const std::string, std::string>::const_iterator i = nameIDs.begin(); i != nameIDs.end(); ++i) {
namesDevice << i->second << "\t" << i->first << "\n";
}
}
}
示例9: if
void
NIXMLConnectionsHandler::addWalkingArea(const SUMOSAXAttributes& attrs) {
bool ok = true;
NBNode* node = 0;
EdgeVector edges;
const std::string nodeID = attrs.get<std::string>(SUMO_ATTR_NODE, 0, ok);
std::vector<std::string> edgeIDs;
if (!attrs.hasAttribute(SUMO_ATTR_EDGES)) {
WRITE_ERROR("No edges specified for walkingArea at node '" + nodeID + "'.");
return;
}
SUMOSAXAttributes::parseStringVector(attrs.get<std::string>(SUMO_ATTR_EDGES, 0, ok), edgeIDs);
if (!ok) {
return;
}
for (std::vector<std::string>::const_iterator it = edgeIDs.begin(); it != edgeIDs.end(); ++it) {
NBEdge* edge = myEdgeCont.retrieve(*it);
if (edge == 0) {
WRITE_ERROR("Edge '" + (*it) + "' for walkingArea at node '" + nodeID + "' is not known.");
return;
}
if (node == 0) {
if (edge->getToNode()->getID() == nodeID) {
node = edge->getToNode();
} else if (edge->getFromNode()->getID() == nodeID) {
node = edge->getFromNode();
} else {
WRITE_ERROR("Edge '" + (*it) + "' does not touch node '" + nodeID + "'.");
return;
}
} else {
if (edge->getToNode() != node && edge->getFromNode() != node) {
WRITE_ERROR("Edge '" + (*it) + "' does not touch node '" + nodeID + "'.");
return;
}
}
edges.push_back(edge);
}
PositionVector customShape = attrs.getOpt<PositionVector>(SUMO_ATTR_SHAPE, 0, ok, PositionVector::EMPTY);
if (!NBNetBuilder::transformCoordinates(customShape)) {
WRITE_ERROR("Unable to project shape for walkingArea at node '" + node->getID() + "'.");
}
node->addWalkingAreaShape(edges, customShape);
}
示例10: assert
void
NWWriter_SUMO::writeConnection(OutputDevice& into, const NBEdge& from, const NBEdge::Connection& c,
bool includeInternal, ConnectionStyle style) {
assert(c.toEdge != 0);
into.openTag(SUMO_TAG_CONNECTION);
into.writeAttr(SUMO_ATTR_FROM, from.getID());
into.writeAttr(SUMO_ATTR_TO, c.toEdge->getID());
into.writeAttr(SUMO_ATTR_FROM_LANE, c.fromLane);
into.writeAttr(SUMO_ATTR_TO_LANE, c.toLane);
if (c.mayDefinitelyPass && style != TLL) {
into.writeAttr(SUMO_ATTR_PASS, c.mayDefinitelyPass);
}
if ((from.getToNode()->getKeepClear() == false || c.keepClear == false) && style != TLL) {
into.writeAttr<bool>(SUMO_ATTR_KEEP_CLEAR, false);
}
if (c.contPos != NBEdge::UNSPECIFIED_CONTPOS && style != TLL) {
into.writeAttr(SUMO_ATTR_CONTPOS, c.contPos);
}
if (style != PLAIN) {
if (includeInternal) {
into.writeAttr(SUMO_ATTR_VIA, c.getInternalLaneID());
}
// set information about the controlling tl if any
if (c.tlID != "") {
into.writeAttr(SUMO_ATTR_TLID, c.tlID);
into.writeAttr(SUMO_ATTR_TLLINKINDEX, c.tlLinkNo);
}
if (style == SUMONET) {
// write the direction information
LinkDirection dir = from.getToNode()->getDirection(&from, c.toEdge, OptionsCont::getOptions().getBool("lefthand"));
assert(dir != LINKDIR_NODIR);
into.writeAttr(SUMO_ATTR_DIR, toString(dir));
// write the state information
const LinkState linkState = from.getToNode()->getLinkState(
&from, c.toEdge, c.fromLane, c.toLane, c.mayDefinitelyPass, c.tlID);
into.writeAttr(SUMO_ATTR_STATE, linkState);
}
}
into.closeTag();
}
示例11: registerEdge
void
GNENet::insertEdge(GNEEdge* edge) {
NBEdge* nbe = edge->getNBEdge();
myNetBuilder->getEdgeCont().insert(nbe); // should we ignore pruning double edges?
// if this edge was previouls extracted from the edgeContainer we have to
// rewire the nodes
nbe->getFromNode()->addOutgoingEdge(nbe);
nbe->getToNode()->addIncomingEdge(nbe);
// Add references to this edge in additionalSets
for(std::vector<GNEAdditionalSet*>::const_iterator i = edge->getAdditionalSets().begin(); i != edge->getAdditionalSets().end(); i++) {
(*i)->addEdgeChild(edge);
}
registerEdge(edge);
}
示例12: erase
unsigned int
NBNodeCont::removeUnwishedNodes(NBDistrictCont& dc, NBEdgeCont& ec,
NBJoinedEdgesMap& je, NBTrafficLightLogicCont& tlc,
bool removeGeometryNodes) {
unsigned int no = 0;
std::vector<NBNode*> toRemove;
for (NodeCont::iterator i = myNodes.begin(); i != myNodes.end(); i++) {
NBNode* current = (*i).second;
bool remove = false;
std::vector<std::pair<NBEdge*, NBEdge*> > toJoin;
// check for completely empty nodes
if (current->getOutgoingEdges().size() == 0 && current->getIncomingEdges().size() == 0) {
// remove if empty
remove = true;
}
// check for nodes which are only geometry nodes
if (removeGeometryNodes) {
if ((current->getOutgoingEdges().size() == 1 && current->getIncomingEdges().size() == 1)
||
(current->getOutgoingEdges().size() == 2 && current->getIncomingEdges().size() == 2)) {
// ok, one in, one out or two in, two out
// -> ask the node whether to join
remove = current->checkIsRemovable();
if (remove) {
toJoin = current->getEdgesToJoin();
}
}
}
// remove the node and join the geometries when wished
if (!remove) {
continue;
}
for (std::vector<std::pair<NBEdge*, NBEdge*> >::iterator j = toJoin.begin(); j != toJoin.end(); j++) {
NBEdge* begin = (*j).first;
NBEdge* continuation = (*j).second;
begin->append(continuation);
continuation->getToNode()->replaceIncoming(continuation, begin, 0);
tlc.replaceRemoved(continuation, -1, begin, -1);
je.appended(begin->getID(), continuation->getID());
ec.erase(dc, continuation);
}
toRemove.push_back(current);
no++;
}
// erase all
for (std::vector<NBNode*>::iterator j = toRemove.begin(); j != toRemove.end(); ++j) {
erase(*j);
}
return no;
}
示例13: erase
// ----- Adapting the input
void
NBEdgeCont::removeUnwishedEdges(NBDistrictCont& dc) {
EdgeVector toRemove;
for (EdgeCont::iterator i = myEdges.begin(); i != myEdges.end(); ++i) {
NBEdge* edge = (*i).second;
if (!myEdges2Keep.count(edge->getID())) {
edge->getFromNode()->removeEdge(edge);
edge->getToNode()->removeEdge(edge);
toRemove.push_back(edge);
}
}
for (EdgeVector::iterator j = toRemove.begin(); j != toRemove.end(); ++j) {
erase(dc, *j);
}
}
示例14: switch
void
NBEdgeCont::generateStreetSigns() {
for (EdgeCont::iterator i = myEdges.begin(); i != myEdges.end(); ++i) {
NBEdge* e = i->second;
// is this a "real" junction?
// XXX nyi
//continue
const SUMOReal offset = e->getLength() - 3;
switch (e->getToNode()->getType()) {
case NODETYPE_PRIORITY:
// yield or major?
if (e->getJunctionPriority(e->getToNode()) > 0) {
e->addSign(NBSign(NBSign::SIGN_TYPE_PRIORITY, offset));
} else {
e->addSign(NBSign(NBSign::SIGN_TYPE_YIELD, offset));
}
break;
case NODETYPE_PRIORITY_STOP:
// yield or major?
if (e->getJunctionPriority(e->getToNode()) > 0) {
e->addSign(NBSign(NBSign::SIGN_TYPE_PRIORITY, offset));
} else {
e->addSign(NBSign(NBSign::SIGN_TYPE_STOP, offset));
}
break;
case NODETYPE_ALLWAY_STOP:
e->addSign(NBSign(NBSign::SIGN_TYPE_ALLWAY_STOP, offset));
break;
case NODETYPE_RIGHT_BEFORE_LEFT:
e->addSign(NBSign(NBSign::SIGN_TYPE_RIGHT_BEFORE_LEFT, offset));
break;
default:
break;
}
}
}
示例15: EdgeVector
void
NBNodeCont::joinSimilarEdges(NBDistrictCont& dc, NBEdgeCont& ec, NBTrafficLightLogicCont& tlc) {
// magic values
SUMOReal distanceThreshold = 7; // don't merge edges further apart
SUMOReal lengthThreshold = 0.05; // don't merge edges with higher relative length-difference
for (NodeCont::iterator i = myNodes.begin(); i != myNodes.end(); i++) {
// count the edges to other nodes outgoing from the current node
std::map<NBNode*, EdgeVector> connectionCount;
const EdgeVector& outgoing = (*i).second->getOutgoingEdges();
for (EdgeVector::const_iterator j = outgoing.begin(); j != outgoing.end(); j++) {
NBEdge* e = (*j);
NBNode* connected = e->getToNode();
if (connectionCount.find(connected) == connectionCount.end()) {
connectionCount[connected] = EdgeVector();
}
connectionCount[connected].push_back(e);
}
// check whether more than a single edge connect another node and join them
std::map<NBNode*, EdgeVector>::iterator k;
for (k = connectionCount.begin(); k != connectionCount.end(); k++) {
// possibly we do not have anything to join...
if ((*k).second.size() < 2) {
continue;
}
// for the edges that seem to be a single street,
// check whether the geometry is similar
const EdgeVector& ev = (*k).second;
const NBEdge* const first = ev.front();
EdgeVector::const_iterator jci; // join candidate iterator
for (jci = ev.begin() + 1; jci != ev.end(); ++jci) {
const SUMOReal relativeLengthDifference = fabs(first->getLoadedLength() - (*jci)->getLoadedLength()) / first->getLoadedLength();
if ((!first->isNearEnough2BeJoined2(*jci, distanceThreshold)) ||
(relativeLengthDifference > lengthThreshold) ||
(first->getSpeed() != (*jci)->getSpeed())
// @todo check vclass
) {
break;
}
}
// @bug If there are 3 edges of which 2 can be joined, no joining will
// take place with the current implementation
if (jci == ev.end()) {
ec.joinSameNodeConnectingEdges(dc, tlc, ev);
}
}
}
}