From 23f9b57fda3ee575906bc1799c502a59f5d02f32 Mon Sep 17 00:00:00 2001 From: Sylvain Thery Date: Thu, 30 Aug 2012 10:47:33 +0200 Subject: [PATCH] add clear function to ihm3 maps --- include/Algo/Geometry/inclusion.hpp | 95 +++++++------------- include/Algo/ImplicitHierarchicalMesh/ihm3.h | 6 ++ src/Algo/ImplicitHierarchicalMesh/ihm3.cpp | 14 +++ 3 files changed, 51 insertions(+), 64 deletions(-) diff --git a/include/Algo/Geometry/inclusion.hpp b/include/Algo/Geometry/inclusion.hpp index aefd09e0f..5631c656b 100644 --- a/include/Algo/Geometry/inclusion.hpp +++ b/include/Algo/Geometry/inclusion.hpp @@ -70,17 +70,22 @@ bool isPointInVolume(typename PFP::MAP& map, Dart d, const VertexAttribute interPrec; interPrec.reserve(16); - - Traversor3WF trav(map,d); - for (Dart e = trav.begin(); e!= trav.end(); e = trav.next()) + std::vector visitedFaces; // Faces that are traversed + visitedFaces.reserve(64); + visitedFaces.push_back(d); // Start with the face of d + DartMarkerStore mark(map); + mark.markOrbit(d) ; + for(unsigned int iface = 0; iface != visitedFaces.size(); ++iface) { + Dart e = visitedFaces[iface]; + VEC3 inter; bool interRes = Algo::Geometry::intersectionLineConvexFace(map, e, position, point, dir, inter); - if(interRes && (dir * (inter-point)) >= 0.0f) + if (interRes) { // check if already intersect on same point (a vertex certainly) bool alreadyfound = false; @@ -92,69 +97,31 @@ bool isPointInVolume(typename PFP::MAP& map, Dart d, const VertexAttribute0) + ++countInter; + if (v<0) + ++countInter2; interPrec.push_back(inter); } } + // add all face neighbours to the table + Dart currentFace = e; + do + { + Dart ee = map.phi2(e) ; + if(!mark.isMarked(ee)) // not already marked + { + visitedFaces.push_back(ee) ; + mark.markOrbit(ee) ; + } + e = map.phi1(e) ; + } while(e != currentFace) ; } + //if the point is in the volume there is an odd number of intersection with all faces with any direction - return (countInter % 2) == 1; - - - -// if(isConvex(map,d)) { -// CGoGNout << "optimize point in volume" << CGoGNendl; -// } -// -// std::list visitedFaces; // Faces that are traversed -// visitedFaces.push_back(d); // Start with the face of d -// std::list::iterator face; -// VEC3 dir(0.5f,0.5f,0.5f); -// VEC3 inter; -// std::vector interPrec; -// -// DartMarkerStore mark(map); // Lock a marker -// // For every face added to the list -// // search the number of faces intersected by a ray whose origin is the tested point -// for (face = visitedFaces.begin(); face != visitedFaces.end(); ++face) -// { -// if (!mark.isMarked(*face)) // Face has not been visited yet -// { -// bool alreadyfound = false; -// bool interRes = Algo::Geometry::intersectionLineConvexFace(map, *face, position, point, dir, inter); -// if(interRes && (dir * (inter-point)) >= 0.0f) -// { -// if(interPrec.size() > 0) -// { -// for(typename std::vector::iterator it = interPrec.begin(); !alreadyfound && it != interPrec.end(); ++it) -// { -// if (Geom::arePointsEquals(*it,inter)) -//// if((*it)[0] == inter[0]) -// alreadyfound = true; -// } -// } -// if(!alreadyfound) -// { -// ++countInter; -// interPrec.push_back(inter); -// } -// -// // add non visited adjacent faces to the list of face -// Dart dNext = *face ; -// do -// { -// mark.mark(dNext); // Mark -// Dart adj = map.phi2(dNext); // Get adjacent face -// if (adj != dNext && !mark.isMarked(adj)) -// visitedFaces.push_back(adj); // Add it -// dNext = map.phi1(dNext) ; -// } while(dNext != *face) ; -// } -// } -// } -// -// //if the point is in the volume there is an odd number of intersection with all faces with any direction -// return (countInter % 2) == 1; + return ((countInter % 2) != 0) && ((countInter2 % 2) != 0); // return (countInter % 2) == 1; + } template diff --git a/include/Algo/ImplicitHierarchicalMesh/ihm3.h b/include/Algo/ImplicitHierarchicalMesh/ihm3.h index d1754614e..dc411713c 100644 --- a/include/Algo/ImplicitHierarchicalMesh/ihm3.h +++ b/include/Algo/ImplicitHierarchicalMesh/ihm3.h @@ -78,6 +78,12 @@ public: */ void init() ; + /** + * clear the map + * @param remove attrib remove attribute (not only clear the content) + */ + void clear(bool removeAttrib); + /*! @name Attributes Management * To handles Attributes for each level of an implicit 3-map *************************************************************************/ diff --git a/src/Algo/ImplicitHierarchicalMesh/ihm3.cpp b/src/Algo/ImplicitHierarchicalMesh/ihm3.cpp index ce63e007d..39722019b 100644 --- a/src/Algo/ImplicitHierarchicalMesh/ihm3.cpp +++ b/src/Algo/ImplicitHierarchicalMesh/ihm3.cpp @@ -53,6 +53,20 @@ ImplicitHierarchicalMap3::~ImplicitHierarchicalMap3() removeAttribute(m_dartLevel) ; } +void ImplicitHierarchicalMap3::clear(bool removeAttrib) +{ + Map3::clear(removeAttrib) ; + if (removeAttrib) + { + m_dartLevel = Map3::addAttribute("dartLevel") ; + m_faceId = Map3::addAttribute("faceId") ; + m_edgeId = Map3::addAttribute("edgeId") ; + + for(unsigned int i = 0; i < NB_ORBITS; ++i) + m_nextLevelCell[i] = NULL ; + } +} + void ImplicitHierarchicalMap3::init() { initEdgeId() ; -- GitLab