From d65740a534bf75f378246c21e3f90bce74f44613 Mon Sep 17 00:00:00 2001 From: Arne Graf <ar.graf.cst@gmail.com> Date: Mon, 24 Jul 2017 17:17:28 +0200 Subject: [PATCH] refac: useWallAvoid -> useWallDistances --- routing/DirectionStrategy.cpp | 32 +++++++------------- routing/ff_router/UnivFFviaFM.cpp | 49 ++++++++++++++++++++----------- routing/ff_router/UnivFFviaFM.h | 15 ++++++---- routing/ff_router/ffRouter.cpp | 2 +- 4 files changed, 52 insertions(+), 46 deletions(-) diff --git a/routing/DirectionStrategy.cpp b/routing/DirectionStrategy.cpp index 348664d9..96cee01f 100644 --- a/routing/DirectionStrategy.cpp +++ b/routing/DirectionStrategy.cpp @@ -314,28 +314,16 @@ double DirectionFloorfield::GetDistance2Wall(Pedestrian* ped) const void DirectionFloorfield::Init(Building* building, double stepsize, double threshold, bool useDistancMap) { - //implement mechanic, that can read-in an existing floorfield (from a previous run) - string s = building->GetGeometryFilename(); - Log->Write("INFO: \tGeometryFilename <" + s + ">"); - s.erase(s.find_last_of(".", string::npos)); // delete ending - if (s.find_last_of("/") != string::npos) { - s.erase(0, s.find_last_of("/")+1); // delete directories before filename (espacially "..") - } - string FF_filename = (building->GetProjectRootDir() + "FF_" + s + "_" + std::to_string(threshold) + ".vtk").c_str(); - std::ifstream test(FF_filename); - if (test.good()) { - Log->Write("INFO: \tRead Floorfield from file <" + FF_filename + ">"); - _ffviafm = new FloorfieldViaFM(FF_filename); - } else { - std::chrono::time_point<std::chrono::system_clock> start, end; - start = std::chrono::system_clock::now(); - Log->Write("INFO: \tCalling Construtor of FloorfieldViaFM"); - _ffviafm = new FloorfieldViaFM(building, stepsize, stepsize, threshold, - useDistancMap, false); - end = std::chrono::system_clock::now(); - std::chrono::duration<double> elapsed_seconds = end-start; - Log->Write("INFO: \tTaken time: " + std::to_string(elapsed_seconds.count())); - } + + std::chrono::time_point<std::chrono::system_clock> start, end; + start = std::chrono::system_clock::now(); + Log->Write("INFO: \tCalling Construtor of FloorfieldViaFM"); + _ffviafm = new FloorfieldViaFM(building, stepsize, stepsize, threshold, + useDistancMap, false); + end = std::chrono::system_clock::now(); + std::chrono::duration<double> elapsed_seconds = end-start; + Log->Write("INFO: \tTaken time: " + std::to_string(elapsed_seconds.count())); + _initDone = true; } diff --git a/routing/ff_router/UnivFFviaFM.cpp b/routing/ff_router/UnivFFviaFM.cpp index ae5caa9f..c30d3079 100644 --- a/routing/ff_router/UnivFFviaFM.cpp +++ b/routing/ff_router/UnivFFviaFM.cpp @@ -35,21 +35,21 @@ UnivFFviaFM::~UnivFFviaFM() { } } -UnivFFviaFM::UnivFFviaFM(Room* r, Building* b, double hx, double wallAvoid, bool useWallAvoid) - : UnivFFviaFM(r, b->GetConfig(), hx, wallAvoid, useWallAvoid) { +UnivFFviaFM::UnivFFviaFM(Room* r, Building* b, double hx, double wallAvoid, bool useWallDistances) + : UnivFFviaFM(r, b->GetConfig(), hx, wallAvoid, useWallDistances) { _building = b; } -UnivFFviaFM::UnivFFviaFM(SubRoom* sr, Building* b, double hx, double wallAvoid, bool useWallAvoid) - : UnivFFviaFM(sr, b->GetConfig(), hx, wallAvoid, useWallAvoid) { +UnivFFviaFM::UnivFFviaFM(SubRoom* sr, Building* b, double hx, double wallAvoid, bool useWallDistances) + : UnivFFviaFM(sr, b->GetConfig(), hx, wallAvoid, useWallDistances) { _building = b; } -UnivFFviaFM::UnivFFviaFM(Room* r, Configuration* const conf, double hx, double wallAvoid, bool useWallAvoid) - : UnivFFviaFM(r, conf, hx, wallAvoid, useWallAvoid, std::vector<int>()){ +UnivFFviaFM::UnivFFviaFM(Room* r, Configuration* const conf, double hx, double wallAvoid, bool useWallDistances) + : UnivFFviaFM(r, conf, hx, wallAvoid, useWallDistances, std::vector<int>()){ } -UnivFFviaFM::UnivFFviaFM(Room* roomArg, Configuration* const confArg, double hx, double wallAvoid, bool useWallAvoid, std::vector<int> wantedDoors) { +UnivFFviaFM::UnivFFviaFM(Room* roomArg, Configuration* const confArg, double hx, double wallAvoid, bool useWallDistances, std::vector<int> wantedDoors) { //build the vector with walls(wall or obstacle), the map with <UID, Door(Cross or Trans)>, the vector with targets(UIDs) //then call other constructor including the mode @@ -92,15 +92,15 @@ UnivFFviaFM::UnivFFviaFM(Room* roomArg, Configuration* const confArg, double hx, } } - create(lines, tmpDoors, wantedDoors, FF_HOMO_SPEED, hx, wallAvoid, useWallAvoid); - //create(lines, tmpDoors, wantedDoors, FF_WALL_AVOID, hx, wallAvoid, useWallAvoid); + create(lines, tmpDoors, wantedDoors, FF_HOMO_SPEED, hx, wallAvoid, useWallDistances); + //create(lines, tmpDoors, wantedDoors, FF_WALL_AVOID, hx, wallAvoid, useWallDistances); } -UnivFFviaFM::UnivFFviaFM(SubRoom* sr, Configuration* const conf, double hx, double wallAvoid, bool useWallAvoid) - : UnivFFviaFM(sr, conf, hx, wallAvoid, useWallAvoid, std::vector<int>()){ +UnivFFviaFM::UnivFFviaFM(SubRoom* sr, Configuration* const conf, double hx, double wallAvoid, bool useWallDistances) + : UnivFFviaFM(sr, conf, hx, wallAvoid, useWallDistances, std::vector<int>()){ } -UnivFFviaFM::UnivFFviaFM(SubRoom* subRoomArg, Configuration* const confArg, double hx, double wallAvoid, bool useWallAvoid, std::vector<int> wantedDoors) { +UnivFFviaFM::UnivFFviaFM(SubRoom* subRoomArg, Configuration* const confArg, double hx, double wallAvoid, bool useWallDistances, std::vector<int> wantedDoors) { //build the vector with walls(wall or obstacle), the map with <UID, Door(Cross or Trans)>, the vector with targets(UIDs) //then call other constructor including the mode _configuration = confArg; @@ -135,14 +135,14 @@ UnivFFviaFM::UnivFFviaFM(SubRoom* subRoomArg, Configuration* const confArg, doub tmpDoors.emplace(std::make_pair(uidNotConst, (Line) *trans)); } - create(lines, tmpDoors, wantedDoors, FF_HOMO_SPEED, hx, wallAvoid, useWallAvoid); + create(lines, tmpDoors, wantedDoors, FF_HOMO_SPEED, hx, wallAvoid, useWallDistances); } void UnivFFviaFM::create(std::vector<Line>& walls, std::map<int, Line>& doors, std::vector<int> targetUIDs, int mode, - double spacing, double wallAvoid, bool useWallAvoid) { + double spacing, double wallAvoid, bool useWallDistances) { _wallAvoidDistance = wallAvoid; - _useWallAvoidance = useWallAvoid; + _useWallDistances = useWallDistances; _speedmode = mode; //find circumscribing rectangle (x_min/max, y_min/max) //create RectGrid @@ -156,7 +156,7 @@ void UnivFFviaFM::create(std::vector<Line>& walls, std::map<int, Line>& doors, s std::fill(_speedFieldSelector[INITIAL_SPEED], _speedFieldSelector[INITIAL_SPEED]+_nPoints, 1.0); //allocate _initalSpeed and maybe _modifiedSpeed - if (mode == FF_WALL_AVOID) { + if ((mode == FF_WALL_AVOID) || (useWallDistances)) { double* cost_alias_walldistance = new double[_nPoints]; _costFieldWithKey[0] = cost_alias_walldistance; Point* gradient_alias_walldirection = new Point[_nPoints]; @@ -995,7 +995,7 @@ void UnivFFviaFM::addTarget(const int uid, double* costarrayDBL, Point* gradarra if (_mode == CENTERPOINT) { newArrayDBL[_grid->getKeyAtPoint(tempCenterPoint)] = magicnum(TARGET_REGION); } - //the following condition is not clean: we have _speedmode and _useWallAvoidance which are redundant + //the following condition is not clean: we have _speedmode and _useWallDistances which are redundant if (_speedmode == FF_WALL_AVOID) { calcFF(newArrayDBL, newArrayPt, _speedFieldSelector[REDU_WALL_SPEED]); } else if (_speedmode == FF_HOMO_SPEED) { @@ -1288,6 +1288,21 @@ void UnivFFviaFM::getDirectionToUID(int destID, const long int key, Point& direc return; } +double UnivFFviaFM::getDistance2WallAt(const Point &pos) { + if (_useWallDistances || (_speedmode == FF_WALL_AVOID)) { + return _costFieldWithKey[0][_grid->getKeyAtPoint(pos)]; + } + return DBL_MAX; +} + +void UnivFFviaFM::getDir2WallAt(const Point &pos, Point &p) { + if (_useWallDistances || (_speedmode == FF_WALL_AVOID)) { + p = _directionFieldWithKey[0][_grid->getKeyAtPoint(pos)]; + } else { + p = Point(0.0, 0.0); + } +} + /* Log: * todo: * - implement error treatment: extend fctns to throw errors and handle them diff --git a/routing/ff_router/UnivFFviaFM.h b/routing/ff_router/UnivFFviaFM.h index b7a0e514..917eff46 100644 --- a/routing/ff_router/UnivFFviaFM.h +++ b/routing/ff_router/UnivFFviaFM.h @@ -81,12 +81,12 @@ class UnivFFviaFM { public: UnivFFviaFM(Room* a, Building* b, double c, double e, bool f); UnivFFviaFM(SubRoom* a, Building* b, double c, double e, bool f); - UnivFFviaFM(Room* a, Configuration* const b, double hx, double wallAvoid, bool useWallAvoid); - UnivFFviaFM(Room* a, Configuration* const b, double hx, double wallAvoid, bool useWallAvoid, std::vector<int> wantedDoors); - UnivFFviaFM(SubRoom* sr, Configuration* const conf, double hx, double wallAvoid, bool useWallAvoid); - UnivFFviaFM(SubRoom* subRoomArg, Configuration* const confArg, double hx, double wallAvoid, bool useWallAvoid, std::vector<int> wantedDoors); + UnivFFviaFM(Room* a, Configuration* const b, double hx, double wallAvoid, bool useWallDistances); + UnivFFviaFM(Room* a, Configuration* const b, double hx, double wallAvoid, bool useWallDistances, std::vector<int> wantedDoors); + UnivFFviaFM(SubRoom* sr, Configuration* const conf, double hx, double wallAvoid, bool useWallDistances); + UnivFFviaFM(SubRoom* subRoomArg, Configuration* const confArg, double hx, double wallAvoid, bool useWallDistances, std::vector<int> wantedDoors); void create(std::vector<Line>& walls, std::map<int, Line>& doors, std::vector<int> targetUIDs, int mode, - double spacing, double wallAvoidDist, bool useWallAvoid); + double spacing, double wallAvoidDist, bool useWallDistances); UnivFFviaFM() {}; UnivFFviaFM(UnivFFviaFM&){}; virtual ~UnivFFviaFM(); @@ -106,6 +106,9 @@ public: RectGrid* getGrid(); virtual void getDirectionToUID(int destID, const long int key, Point& direction, int mode); void getDirectionToUID(int destID, const long int key, Point& direction); + double getDistance2WallAt(const Point& pos); + void getDir2WallAt(const Point& pos, Point& p); + void writeFF(const std::string&, std::vector<int> targetID); void createRectGrid(std::vector<Line>& walls, std::map<int, Line>& doors, double spacing); @@ -147,7 +150,7 @@ private: SubRoom* * _subrooms = nullptr; // this is an array (first asterisk) of pointers (second asterisk) double _wallAvoidDistance = 0.; - bool _useWallAvoidance = false; + bool _useWallDistances = false; //the following maps are responsible for dealloc the arrays std::map<int, double*> _costFieldWithKey; diff --git a/routing/ff_router/ffRouter.cpp b/routing/ff_router/ffRouter.cpp index 6dbfdc1c..6da682a0 100644 --- a/routing/ff_router/ffRouter.cpp +++ b/routing/ff_router/ffRouter.cpp @@ -517,7 +517,7 @@ int FFRouter::FindExit(Pedestrian* p) #pragma omp critical(finalDoors) _finalDoors.emplace(std::make_pair(p->GetID(), bestFinalDoor)); - + if (_CroTrByUID.count(bestDoor)) { p->SetExitIndex(bestDoor); p->SetExitLine(_CroTrByUID.at(bestDoor)); -- GitLab