NamedRTree* TraCIServerAPI_POI::getTree() { NamedRTree* t = new NamedRTree(); ShapeContainer& shapeCont = MSNet::getInstance()->getShapeContainer(); const std::map<std::string, PointOfInterest*>& pois = shapeCont.getPOIs().getMyMap(); for (std::map<std::string, PointOfInterest*>::const_iterator i = pois.begin(); i != pois.end(); ++i) { const float cmin[2] = {(float)(*i).second->x(), (float)(*i).second->y()}; const float cmax[2] = {(float)(*i).second->x(), (float)(*i).second->y()}; t->Insert(cmin, cmax, (*i).second); } return t; }
NamedRTree* TraCIServerAPI_Junction::getTree() { NamedRTree* t = new NamedRTree(); const std::map<std::string, MSJunction*>& junctions = MSNet::getInstance()->getJunctionControl().getMyMap(); for (std::map<std::string, MSJunction*>::const_iterator i = junctions.begin(); i != junctions.end(); ++i) { Boundary b = (*i).second->getShape().getBoxBoundary(); const float cmin[2] = {(float) b.xmin(), (float) b.ymin()}; const float cmax[2] = {(float) b.xmax(), (float) b.ymax()}; t->Insert(cmin, cmax, (*i).second); } return t; }
NamedRTree* TraCIServerAPI_Polygon::getTree() { NamedRTree* t = new NamedRTree(); ShapeContainer& shapeCont = MSNet::getInstance()->getShapeContainer(); const std::map<std::string, Polygon*>& polygons = shapeCont.getPolygons().getMyMap(); for (std::map<std::string, Polygon*>::const_iterator i = polygons.begin(); i != polygons.end(); ++i) { Boundary b = (*i).second->getShape().getBoxBoundary(); const float cmin[2] = {(float) b.xmin(), (float) b.ymin()}; const float cmax[2] = {(float) b.xmax(), (float) b.ymax()}; t->Insert(cmin, cmax, (*i).second); } return t; }
NamedRTree* TraCIServerAPI_InductionLoop::getTree() { NamedRTree* t = new NamedRTree(); const std::map<std::string, MSDetectorFileOutput*>& dets = MSNet::getInstance()->getDetectorControl().getTypedDetectors(SUMO_TAG_INDUCTION_LOOP).getMyMap(); for (std::map<std::string, MSDetectorFileOutput*>::const_iterator i = dets.begin(); i != dets.end(); ++i) { MSInductLoop* il = static_cast<MSInductLoop*>((*i).second); Position p = il->getLane()->getShape().positionAtOffset(il->getPosition()); const float cmin[2] = {(float) p.x(), (float) p.y()}; const float cmax[2] = {(float) p.x(), (float) p.y()}; t->Insert(cmin, cmax, il); } return t; }
SUMOTime MSDevice_BTreceiver::BTreceiverUpdate::execute(SUMOTime /*currentTime*/) { // build rtree with senders NamedRTree rt; for (std::map<std::string, MSDevice_BTsender::VehicleInformation*>::const_iterator i = MSDevice_BTsender::sVehicles.begin(); i != MSDevice_BTsender::sVehicles.end(); ++i) { MSDevice_BTsender::VehicleInformation* vi = (*i).second; Boundary b = vi->getBoxBoundary(); b.grow(POSITION_EPS); const float cmin[2] = {(float) b.xmin(), (float) b.ymin()}; const float cmax[2] = {(float) b.xmax(), (float) b.ymax()}; rt.Insert(cmin, cmax, vi); } // check visibility for all receivers OptionsCont& oc = OptionsCont::getOptions(); bool allRecognitions = oc.getBool("device.btreceiver.all-recognitions"); bool haveOutput = oc.isSet("bt-output"); for (std::map<std::string, MSDevice_BTreceiver::VehicleInformation*>::iterator i = MSDevice_BTreceiver::sVehicles.begin(); i != MSDevice_BTreceiver::sVehicles.end();) { // collect surrounding vehicles MSDevice_BTreceiver::VehicleInformation* vi = (*i).second; Boundary b = vi->getBoxBoundary(); b.grow(vi->range); const float cmin[2] = {(float) b.xmin(), (float) b.ymin()}; const float cmax[2] = {(float) b.xmax(), (float) b.ymax()}; std::set<std::string> surroundingVehicles; Named::StoringVisitor sv(surroundingVehicles); rt.Search(cmin, cmax, sv); // loop over surrounding vehicles, check visibility status for (std::set<std::string>::const_iterator j = surroundingVehicles.begin(); j != surroundingVehicles.end(); ++j) { if ((*i).first == *j) { // seeing oneself? skip continue; } updateVisibility(*vi, *MSDevice_BTsender::sVehicles.find(*j)->second); } if (vi->haveArrived) { // vehicle has left the simulation; remove if (haveOutput) { writeOutput((*i).first, vi->seen, allRecognitions); } delete vi; MSDevice_BTreceiver::sVehicles.erase(i++); } else { // vehicle is still in the simulation; reset state vi->updates.erase(vi->updates.begin(), vi->updates.end() - 1); ++i; } } // remove arrived senders / reset state for (std::map<std::string, MSDevice_BTsender::VehicleInformation*>::iterator i = MSDevice_BTsender::sVehicles.begin(); i != MSDevice_BTsender::sVehicles.end();) { MSDevice_BTsender::VehicleInformation* vi = (*i).second; if (vi->haveArrived) { delete vi; MSDevice_BTsender::sVehicles.erase(i++); } else { vi->updates.erase(vi->updates.begin(), vi->updates.end() - 1); ++i; } } return DELTA_T; }