#ifndef ENV_MAP_H #define ENV_MAP_H //#define DEBUG_affichage //#define DEBUG #include #include #include #include #include "Topology/generic/parameters.h" #include "Algo/Modelisation/polyhedron.h" #include "Algo/Modelisation/extrusion.h" #include "Algo/Modelisation/subdivision.h" #include "Algo/Geometry/centroid.h" #include "Algo/Geometry/area.h" #include "Geometry/bounding_box.h" #include "Container/fakeAttribute.h" #include "Algo/Tiling/Volume/cubic.h" #include "Algo/Modelisation/polyhedron.h" #include "Algo/Import/import.h" #include "Algo/Geometry/volume.h" #include "Algo/Geometry/area.h" /////////////////particules #include "Algo/MovingObjects/particle_cell_3D_memo.h" using namespace CGoGN ; #include "pfp.h" #include "segment.h" #include "triangle.h" typedef CGoGN::Algo::Volume::MovingObjects::ParticleCell3D PARTICULE; typedef CGoGN::Algo::Volume::MovingObjects::ParticleCell3DMemo PARTICULEMEMO; class EnvMap { public: std::chrono::duration duration_pop, duration_subdiv, duration_push; EnvMap() ; void init(int argc, char **argv) ; bool checkPointInMap(VEC3 pos,Dart neighborhood); bool insideVolume(VEC3 pos, Dart d); REAL volumeMaxdistance(Vol volume); VEC3 normaleFromVolume(Dart volume,Dart face); void open_file(std::string filename); float mapMinX; float mapMaxX; float mapMinY; float mapMaxY; float mapMinZ; float mapMaxZ; float maxCellRay; bool subdivideVolume(Dart d , bool OneLevelDifference=true); Dart getBelongingCell(const PFP::VEC3& pos); // // void resetAgentInFace(Agent* agent) ; PFP::MAP map ; VertexAttribute position ; FaceAttribute facecenter; VolumeAttribute color ; VolumeAttribute RegisteredEdges ; VolumeAttribute RegisteredNeighborEdges ; VolumeAttribute RegisteredTriangles ; VolumeAttribute RegisteredNeighborTriangles ; Geom::BoundingBox bb; std::vector getMemoCross(const VEC3& pos, const VEC3& dest, Dart& d1); void FindNeighborCells (const std::vector& belonging_cells, std::vector * nieghbor_cells); // Enregistrement Aretes////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Dart popAndPushSegment(Segment* o); void FirstRegistrationSegment(Segment * mo); void pushAOneCellSegment(Segment * o, Dart d); void pushSegmentInSetOfCells(Segment* o, const std::vector& memo_cross); void popSegment(Segment* o); void pushSegmentInCellAsNeighbor(Segment* o, Dart d); void popSegmentInCellAsNeighbor(Segment* o, Dart d); void resetPartSubdiv(Segment* o); ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Enregistrement Surfaces void popAndPushTriangle(Triangle* o); // pop et push d'une Triangle void FirstRegistrationTriangle (Triangle* o); // premier enregistrement d'une Triangle void markNeighbors(CellMarkerMemo * memo_mark, CellMarkerMemo * OneRingMark, const std::vector& memo_cross); // marker les cellules voisines d'un ensemble de cellules retenu dans memo_cross void popTriangle(Triangle* o); void pushTriangleInCell(Triangle* o, Dart d); void popTriangleInCell(Triangle* o, Dart d); void pushTriangleInCellAsNeighbor(Triangle* cell, Dart d); void popTriangleInCellAsNeighbor(Triangle* cell, Dart d); void resetPartSubdiv(Triangle* cell); } ; //void update_registration(Segment * o); //void register_pop(Segment* o, int n); //void resetPartSubdiv(Segment* o); //void resetObstPartInFace(Segment* o, Dart d, unsigned int fLevel);// empeche de viser une dart ayant disparu //void resetObstPartInFace(Segment* o, Dart d);// empeche de viser une dart ayant disparu //void resetPart(Segment * mo, Dart d); // empeche de viser une dart ayant disparu pour les voisins /************************************** * INLINE FUNCTIONS * **************************************/ //////////////////// BASIC OPERATIONS //////////////////////////////////////////////////////////////// template inline bool addElementToVector(std::vector& a, T ag) { if (std::find(a.begin(), a.end(), ag) == a.end()) { a.push_back(ag) ; return true; } return false; } template inline bool removeElementFromVector(std::vector& a, T ag) { typedef typename std::vector::iterator iterator; iterator it = std::find(a.begin(), a.end(), ag); if (it == a.end()) { return false; } else { *it = a.back(); a.pop_back(); } return true; } /////////////////////////////////////////////////////////////////////REGISTRATIONS inline std::vector EnvMap::getMemoCross(const VEC3& pos, const VEC3& dest, Dart& d1) { typedef CGoGN::Algo::Volume::MovingObjects::ParticleCell3DMemo ParticleCell3DMemo; return ParticleCell3DMemo(map, d1, pos,position).move(dest); } inline void EnvMap::FindNeighborCells (const std::vector& belonging_cells, std::vector *neighbor_cells) { #ifdef IHMap assert(map.getCurrentLevel() == map.getMaxLevel()); #endif assert(!belonging_cells.empty()); neighbor_cells->clear(); CellMarkerMemo memo_mark(map); //marqueur des cellules "présentes" CellMarkerMemo OneRingMark(map); // marquer des cellules voisines for (std::vector::const_iterator it =belonging_cells.begin();it(d) && !memo_mark.isMarked(d) && !OneRingMark.isMarked(d) ) { OneRingMark.mark(d); (*neighbor_cells).push_back(d); } } } } inline void EnvMap::pushSegmentInCellAsNeighbor(Segment* o, Dart d) { #ifdef IHMap assert(map.getCurrentLevel() == map.getMaxLevel()); #endif addElementToVector(RegisteredNeighborEdges[d],o); } inline void EnvMap::popSegmentInCellAsNeighbor(Segment* o, Dart d) { #ifdef IHMap assert(map.getCurrentLevel() == map.getMaxLevel()); #endif removeElementFromVector(RegisteredNeighborEdges[d],o); } inline void EnvMap::pushTriangleInCellAsNeighbor(Triangle* o, Dart d) { #ifdef IHMap assert(map.getCurrentLevel() == map.getMaxLevel()); #endif addElementToVector(RegisteredNeighborTriangles[d],o); } inline void EnvMap::popTriangleInCellAsNeighbor(Triangle* o, Dart d) { #ifdef IHMap assert(map.getCurrentLevel() == map.getMaxLevel()); #endif removeElementFromVector(RegisteredNeighborTriangles[d],o); } inline void EnvMap::pushTriangleInCell(Triangle * o, Dart d) { #ifdef IHMap assert(map.getCurrentLevel() == map.getMaxLevel()); #endif addElementToVector(RegisteredTriangles[d],o); } inline void EnvMap::popTriangleInCell(Triangle* o, Dart d) { #ifdef IHMap assert(map.getCurrentLevel() == map.getMaxLevel()); #endif removeElementFromVector(RegisteredTriangles[d],o); } #endif