void NIVissimDistrictConnection::dict_BuildDistrictNodes(NBDistrictCont& dc, NBNodeCont& nc) { for (std::map<int, std::vector<int> >::iterator k = myDistrictsConnections.begin(); k != myDistrictsConnections.end(); k++) { // get the connections const std::vector<int>& connections = (*k).second; // retrieve the current district std::string dsid = toString<int>((*k).first); NBDistrict* district = new NBDistrict(dsid); dc.insert(district); // compute the middle of the district PositionVector pos; for (std::vector<int>::const_iterator j = connections.begin(); j != connections.end(); j++) { NIVissimDistrictConnection* c = dictionary(*j); pos.push_back(c->geomPosition()); } Position distCenter = pos.getPolygonCenter(); if (connections.size() == 1) { // !!! ok, ok, maybe not the best way just to add an offset distCenter.add(10, 10); } district->setCenter(distCenter); // build the node std::string id = "District" + district->getID(); NBNode* districtNode = new NBNode(id, district->getPosition(), district); if (!nc.insert(districtNode)) { throw 1; } } }
std::pair<NBNode*, NBNode*> NIVissimEdge::resolveSameNode(NBNodeCont& nc, SUMOReal offset, NBNode* prevFrom, NBNode* prevTo) { // check whether the edge is connected to a district // use it if so NIVissimDistrictConnection* d = NIVissimDistrictConnection::dict_findForEdge(myID); if (d != 0) { Position pos = d->geomPosition(); SUMOReal position = d->getPosition(); // the district is at the begin of the edge if (myGeom.length() - position > position) { std::string nid = "ParkingPlace" + toString<int>(d->getID()); NBNode* node = nc.retrieve(nid); if (node == 0) { node = new NBNode(nid, pos, NODETYPE_NOJUNCTION); if (!nc.insert(node)) { throw 1; } } return std::pair<NBNode*, NBNode*>(node, prevTo); } // the district is at the end of the edge else { std::string nid = "ParkingPlace" + toString<int>(d->getID()); NBNode* node = nc.retrieve(nid); if (node == 0) { node = new NBNode(nid, pos, NODETYPE_NOJUNCTION); if (!nc.insert(node)) { throw 1; } } assert(node != 0); return std::pair<NBNode*, NBNode*>(prevFrom, node); } } // otherwise, check whether the edge is some kind of // a dead end... // check which end is nearer to the node centre if (myConnectionClusters.size() == 1) { NBNode* node = prevFrom; // it is the same as getToNode() NIVissimConnectionCluster* c = *(myConnectionClusters.begin()); // no end node given if (c->around(myGeom.front(), offset) && !c->around(myGeom.back(), offset)) { NBNode* end = new NBNode( toString<int>(myID) + "-End", myGeom.back(), NODETYPE_NOJUNCTION); if (!nc.insert(end)) { throw 1; } return std::pair<NBNode*, NBNode*>(node, end); } // no begin node given if (!c->around(myGeom.front(), offset) && c->around(myGeom.back(), offset)) { NBNode* beg = new NBNode( toString<int>(myID) + "-Begin", myGeom.front(), NODETYPE_NOJUNCTION); if (!nc.insert(beg)) { std::cout << "nope, NIVissimDisturbance" << std::endl; throw 1; } return std::pair<NBNode*, NBNode*>(beg, node); } // self-loop edge - both points lie within the same cluster if (c->around(myGeom.front()) && c->around(myGeom.back())) { return std::pair<NBNode*, NBNode*>(node, node); } } // what to do in other cases? // It simply is a self-looping edge.... return std::pair<NBNode*, NBNode*>(prevFrom, prevTo); }