void TrajectoriesJPSV05::WriteFrame(int frameNr, Building* building) { string data; char tmp[CLENGTH] = ""; double RAD2DEG = 180.0 / M_PI; sprintf(tmp, "<frame ID=\"%d\">\n", frameNr); data.append(tmp); const vector< Pedestrian* >& allPeds = building->GetAllPedestrians(); for(unsigned int p=0;p<allPeds.size();p++) { Pedestrian* ped = allPeds[p]; Room* r = building->GetRoom(ped->GetRoomID()); string caption = r->GetCaption(); char s[CLENGTH] = ""; int color=ped->GetColor(); double a = ped->GetLargerAxis(); double b = ped->GetSmallerAxis(); double phi = atan2(ped->GetEllipse().GetSinPhi(), ped->GetEllipse().GetCosPhi()); sprintf(s, "<agent ID=\"%d\"\t" "x=\"%.6f\"\ty=\"%.6f\"\t" "z=\"%.6f\"\t" "rA=\"%.2f\"\trB=\"%.2f\"\t" "eO=\"%.2f\" eC=\"%d\"/>\n", ped->GetID(), (ped->GetPos()._x) * FAKTOR, (ped->GetPos()._y) * FAKTOR,(ped->GetElevation()) * FAKTOR ,a * FAKTOR, b * FAKTOR, phi * RAD2DEG, color); data.append(s); } data.append("</frame>\n"); _outputHandler->Write(data); }
void TrajectoriesJPSV04::WriteFrame(int frameNr, Building* building) { string data; char tmp[CLENGTH] = ""; vector<string> rooms_to_plot; if( building->GetAllPedestrians().size() == 0) return; sprintf(tmp, "<frame ID=\"%d\">\n", frameNr); data.append(tmp); const vector< Pedestrian* >& allPeds = building->GetAllPedestrians(); for(unsigned int p=0;p<allPeds.size();p++) { Pedestrian* ped = allPeds[p]; Room* r = building->GetRoom(ped->GetRoomID()); string caption = r->GetCaption(); if ((rooms_to_plot.empty() == false) && (IsElementInVector(rooms_to_plot, caption) == false)) { continue; } data.append(WritePed(ped)); } data.append("</frame>\n"); Write(data); }
void TrajectoriesJPSV06::WriteFrame(int frameNr, Building* building) { string data; char tmp[CLENGTH] = ""; double RAD2DEG = 180.0 / M_PI; vector<string> rooms_to_plot; sprintf(tmp, "<frame ID=\"%d\">\n", frameNr); data.append(tmp); const vector< Pedestrian* >& allPeds = building->GetAllPedestrians(); for(unsigned int p=0;p<allPeds.size();++p) { Pedestrian* ped = allPeds[p]; Room* r = building->GetRoom(ped->GetRoomID()); string caption = r->GetCaption(); if (!IsElementInVector(rooms_to_plot, caption)) { if (!rooms_to_plot.empty()) { continue; } } char tmp1[CLENGTH] = ""; int color=ped->GetColor(); double a = ped->GetLargerAxis(); double b = ped->GetSmallerAxis(); double phi = atan2(ped->GetEllipse().GetSinPhi(), ped->GetEllipse().GetCosPhi()); sprintf(tmp1, "<agent ID=\"%d\"\t" "x=\"%.6f\"\ty=\"%.6f\"\t" "z=\"%.6f\"\t" "rA=\"%.2f\"\trB=\"%.2f\"\t" "eO=\"%.2f\" eC=\"%d\"/>\n", ped->GetID(), (ped->GetPos()._x) * FAKTOR, (ped->GetPos()._y) * FAKTOR,(ped->GetElevation()) * FAKTOR ,a * FAKTOR, b * FAKTOR, phi * RAD2DEG, color); data.append(tmp1); } data.append("</frame>\n"); Write(data); }
void Simulation::UpdateRoutesAndLocations() { //pedestrians to be deleted //you should better create this in the constructor and allocate it once. set<Pedestrian*> pedsToRemove; // pedsToRemove.reserve(500); //just reserve some space // collect all pedestrians in the simulation. const vector<Pedestrian*>& allPeds = _building->GetAllPedestrians(); const map<int, Goal*>& goals = _building->GetAllGoals(); auto allRooms = _building->GetAllRooms(); #pragma omp parallel for shared(pedsToRemove, allRooms) for (signed int p = 0; p < allPeds.size(); ++p) { auto ped = allPeds[p]; Room* room = _building->GetRoom(ped->GetRoomID()); SubRoom* sub0 = room->GetSubRoom(ped->GetSubRoomID()); //set the new room if needed if ((ped->GetFinalDestination() == FINAL_DEST_OUT) && (room->GetCaption() == "outside")) { #pragma omp critical(Simulation_Update_pedsToRemove) pedsToRemove.insert(ped); } else if ((ped->GetFinalDestination() != FINAL_DEST_OUT) && (goals.at(ped->GetFinalDestination())->Contains( ped->GetPos()))) { #pragma omp critical(Simulation_Update_pedsToRemove) pedsToRemove.insert(ped); } // reposition in the case the pedestrians "accidently left the room" not via the intended exit. // That may happen if the forces are too high for instance // the ped is removed from the simulation, if it could not be reassigned else if (!sub0->IsInSubRoom(ped)) { bool assigned = false; std::function<void(const Pedestrian&)> f = std::bind(&Simulation::UpdateFlowAtDoors, this, std::placeholders::_1); assigned = ped->Relocate(f); //this will delete agents, that are pushed outside (maybe even if inside obstacles??) if (!assigned) { #pragma omp critical(Simulation_Update_pedsToRemove) pedsToRemove.insert(ped); //the agent left the old room //actualize the eggress time for that room #pragma omp critical(SetEgressTime) allRooms.at(ped->GetRoomID())->SetEgressTime(ped->GetGlobalTime()); } } //finally actualize the route if ( !_gotSources && ped->FindRoute() == -1) { //a destination could not be found for that pedestrian Log->Write("ERROR: \tCould not find a route for pedestrian %d",ped->GetID()); //ped->FindRoute(); //debug only, plz remove std::function<void(const Pedestrian&)> f = std::bind(&Simulation::UpdateFlowAtDoors, this, std::placeholders::_1); ped->Relocate(f); //exit(EXIT_FAILURE); #pragma omp critical(Simulation_Update_pedsToRemove) { pedsToRemove.insert(ped); Log->incrementDeletedAgents(); } } } #ifdef _USE_PROTOCOL_BUFFER if (_hybridSimManager) { AgentsQueueOut::Add(pedsToRemove); //this should be critical region (and it is) } else #endif { // remove the pedestrians that have left the building for (auto p : pedsToRemove){ UpdateFlowAtDoors(*p); _building->DeletePedestrian(p); } pedsToRemove.clear(); } // temporary fix for the safest path router // if (dynamic_cast<SafestPathRouter*>(_routingEngine->GetRouter(1))) // { // SafestPathRouter* spr = dynamic_cast<SafestPathRouter*>(_routingEngine->GetRouter(1)); // spr->ComputeAndUpdateDestinations(_allPedestians); // } }