Création d'un compte pour un collaborateur extérieur au laboratoire depuis l'intranet ICube : https://intranet.icube.unistra.fr/fr/labs/member/profile

Commit 9b062c52 by untereiner

### qq changements dans map3

parent 1b8843c3
 ... ... @@ -64,6 +64,10 @@ template Dart subdivideVolumeClassic2(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position); template void subdivideLoop(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position); /*********************************************************************************** * Simplification * ***********************************************************************************/ ... ...
 ... ... @@ -82,19 +82,22 @@ void subdivideFace(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position unsigned int cur = map.getCurrentLevel() ; map.setCurrentLevel(fLevel) ; // go to the level of the face to subdivide its edges unsigned int degree = 0 ; typename PFP::VEC3 p ; Dart it = old ; do Traversor2FE travE(map, old); for(Dart it = travE.begin(); it != travE.end() ; it = travE.next()) { ++degree; p += position[it] ; if(!map.edgeIsSubdivided(it)) // first cut the edges (if they are not already) Algo::IHM::subdivideEdge(map, it, position) ; // and compute the degree of the face it = map.phi1(it) ; } while(it != old) ; } p /= typename PFP::REAL(degree) ; map.setCurrentLevel(fLevel + 1) ; // go to the next level to perform face subdivision Dart res; ... ... @@ -395,6 +398,8 @@ Dart subdivideVolumeClassic2(typename PFP::MAP& map, Dart d, typename PFP::TVEC3 */ typename PFP::VEC3 volCenter = Algo::Geometry::volumeCentroid(map, old, position); Traversor3WV traV(map, old); /* * Subdivide Faces */ ... ... @@ -411,46 +416,62 @@ Dart subdivideVolumeClassic2(typename PFP::MAP& map, Dart d, typename PFP::TVEC3 //save a dart from the subdivided face unsigned int cur = map.getCurrentLevel() ; unsigned int fLevel = map.faceLevel(d) + 1; //puisque dans tous les cas, la face est subdivisee unsigned int fLevel = map.faceLevel(dit) + 1; //puisque dans tous les cas, la face est subdivisee map.setCurrentLevel(fLevel) ; //le brin est forcement du niveau cur Dart cf = map.phi1(d); Dart cf = map.phi2(map.phi1(dit)); Dart e = cf; do { subdividedfaces.push_back(std::pair(e,map.phi2(e))); e = map.phi2(map.phi1(e)); e = map.phi2(map.phi_1(e)); }while (e != cf); map.setCurrentLevel(cur); } unsigned int fLevel = map.faceLevel(old) + 1; //puisque dans tous les cas, la face est subdivisee map.setCurrentLevel(fLevel) ; for (std::vector >::iterator it = subdividedfaces.begin(); it != subdividedfaces.end(); ++it) { Dart f1 = (*it).first; if(!map.Map2::isBoundaryEdge(f1)) { Dart f2 = map.phi2(f1); map.unsewFaces(f1); map.copyDartEmbedding(VERTEX, map.phi2(f2), f1); map.copyDartEmbedding(VERTEX, map.phi2(f1), f2); } } map.setCurrentLevel(cur); /* * Create inside volumes */ std::vector newEdges; //save darts from inner edges newEdges.reserve(50); Dart centralDart = NIL; Traversor3WV traV(map, old); map.setCurrentLevel(vLevel + 1) ; // go to the next level to perform volume subdivision for(Dart dit = traV.begin(); dit != traV.end(); dit = traV.next()) { Dart e = dit; std::vector v ; do { v.push_back(map.phi1(map.phi1(e))); v.push_back(map.phi1(e)); //unsigned int degree = 0 ; //typename PFP::VEC3 volCenter ; e = map.phi2(map.phi_1(e)); } while(e != dit); map.setCurrentLevel(vLevel + 1) ; // go to the next level to perform volume subdivision map.splitVolume(v) ; for(Dart dit = traV.begin(); dit != traV.end(); dit = traV.next()) { //volCenter += position[d]; //++degree; Dart old = map.phi2(map.phi1(dit)); map.Map2::fillHole(old); Dart dd = map.phi1(map.phi1(old)) ; map.splitFace(old,dd) ; ... ... @@ -461,9 +482,9 @@ Dart subdivideVolumeClassic2(typename PFP::MAP& map, Dart d, typename PFP::TVEC3 map.cutEdge(ne); centralDart = map.phi1(ne); position[centralDart] = volCenter; newEdges.push_back(ne); newEdges.push_back(map.phi1(ne)); position[centralDart] = volCenter; unsigned int id = map.getNewEdgeId() ; map.setEdgeId(ne, id, EDGE) ; ... ... @@ -488,6 +509,20 @@ Dart subdivideVolumeClassic2(typename PFP::MAP& map, Dart d, typename PFP::TVEC3 } for (std::vector >::iterator it = subdividedfaces.begin(); it != subdividedfaces.end(); ++it) { Dart f1 = (*it).first; Dart f2 = (*it).second; if(map.isBoundaryFace(map.phi2(f1)) && map.isBoundaryFace(map.phi2(f2))) { map.sewVolumes(map.phi2(f1), map.phi2(f2)); } } //volCenter /= double(degree); // //Third step : 3-sew internal faces // for (std::vector >::iterator it = subdividedfaces.begin(); it != subdividedfaces.end(); ++it) // { ... ... @@ -536,6 +571,194 @@ Dart subdivideVolumeClassic2(typename PFP::MAP& map, Dart d, typename PFP::TVEC3 } template void subdivideLoop(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position) { assert(map.getDartLevel(d) <= map.getCurrentLevel() || !"Access to a dart introduced after current level") ; assert(!map.volumeIsSubdivided(d) || !"Trying to subdivide an already subdivided volume") ; assert(!map.isBoundaryMarked(d) || !"Trying to subdivide a dart marked boundary"); unsigned int vLevel = map.volumeLevel(d); Dart old = map.volumeOldestDart(d); unsigned int cur = map.getCurrentLevel(); map.setCurrentLevel(vLevel); /* * Compute volume centroid */ typename PFP::VEC3 volCenter = Algo::Geometry::volumeCentroid(map, old, position); /* * Subdivide Faces */ std::vector > subdividedfaces; subdividedfaces.reserve(25); Traversor3WF traF(map, old); for(Dart dit = traF.begin(); dit != traF.end(); dit = traF.next()) { //if needed subdivide face if(!map.faceIsSubdivided(dit)) Algo::IHM::subdivideFace(map, dit, position, Algo::IHM::S_TRI); //save a dart from the subdivided face unsigned int cur = map.getCurrentLevel() ; unsigned int fLevel = map.faceLevel(d) + 1; //puisque dans tous les cas, la face est subdivisee map.setCurrentLevel(fLevel) ; //le brin est forcement du niveau cur Dart cf = map.phi1(d); Dart e = cf; do { subdividedfaces.push_back(std::pair(e,map.phi2(e))); e = map.phi2(map.phi1(e)); }while (e != cf); map.setCurrentLevel(cur); } /* * Create inside volumes */ std::vector newEdges; //save darts from inner edges newEdges.reserve(50); Dart centralDart = NIL; //unsigned int degree = 0 ; //typename PFP::VEC3 volCenter ; Traversor3WV traV(map, old); bool isNotTet = false; map.setCurrentLevel(vLevel + 1) ; // go to the next level to perform volume subdivision for(Dart dit = traV.begin(); dit != traV.end(); dit = traV.next()) { //volCenter += position[d]; //++degree; Dart e = dit; std::vector v ; do { v.push_back(map.phi1(e)); e = map.phi2(map.phi_1(e)); } while(e != dit); map.splitVolume(v) ; //if is not a tetrahedron unsigned int vdeg = map.vertexDegree(dit); if(vdeg > 3) { isNotTet = true; Dart old = map.phi2(map.phi1(dit)); Dart dd = map.phi1(old) ; map.splitFace(old,dd) ; Dart ne = map.phi1(old); map.cutEdge(ne); position[map.phi1(ne)] = volCenter; //plonger a la fin de la boucle ???? centralDart = map.phi1(ne); newEdges.push_back(ne); newEdges.push_back(map.phi1(ne)); Dart stop = map.phi2(map.phi1(ne)); ne = map.phi2(ne); do { dd = map.phi1(map.phi1(ne)); map.splitFace(ne, dd) ; newEdges.push_back(map.phi1(dd)); ne = map.phi2(map.phi_1(ne)); dd = map.phi1(dd); } while(dd != stop); } // else // { // unsigned int idface = map.getNewFaceId(); // map.setFaceId(map.phi2(f1),idface, FACE); // } } //switch inner faces if(isNotTet) { unsigned int i = 0; for(Dart dit = traV.begin(); dit != traV.end(); dit = traV.next()) { Dart x = map.phi_1(map.phi2(map.phi1(dit))); Dart f = x; do { Dart f3 = map.phi3(f); Dart tmp = map.phi_1(map.phi2(map.phi_1(map.phi2(map.phi_1(f3))))); //future voisin par phi2 map.unsewFaces(f3); map.unsewFaces(tmp); map.sewFaces(f3, tmp, false); map.copyDartEmbedding(VERTEX, map.phi2(f3), tmp); map.copyDartEmbedding(VERTEX, map.phi2(tmp), f3); // map.embedOrbit(VERTEX, f3, map.getEmbedding(VERTEX, f3)) ; // map.embedOrbit(VERTEX, tmp, map.getEmbedding(VERTEX, tmp)) ; // unsigned int idface = map.getNewFaceId(); // map.setFaceId(map.phi2(f3),idface, FACE); f = map.phi2(map.phi_1(f)); }while(f != x); } } position[centralDart] = volCenter; // //Third step : 3-sew internal faces // for (std::vector >::iterator it = subdividedfaces.begin(); it != subdividedfaces.end(); ++it) // { // Dart f1 = (*it).first; // Dart f2 = (*it).second; // // //FAIS a la couture !!!!!!! // //id pour toutes les aretes exterieurs des faces quadrangulees // unsigned int idedge = map.getEdgeId(f1); // map.setEdgeId(map.phi2(f1), idedge, DART); // map.setEdgeId( map.phi2(f2), idedge, DART); // // } // // //LA copie de L'id est a gerer avec le sewVolumes normalement !!!!!! // //id pour les aretes interieurs : (i.e. 16 pour un octa) // DartMarker mne(map); // for(std::vector::iterator it = newEdges.begin() ; it != newEdges.end() ; ++it) // { // if(!mne.isMarked(*it)) // { // unsigned int idedge = map.getNewEdgeId(); // map.setEdgeId(*it, idedge, EDGE); // mne.markOrbit(EDGE,*it); // } // } // // // map.setCurrentLevel(cur) ; } template Dart subdivideVolume(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position) { ... ...
 ... ... @@ -284,13 +284,6 @@ public: * @return true if the merge has been executed, false otherwise */ virtual bool mergeVolumes(Dart d, Dart e); //! /*! * */ virtual void splitCC(std::vector& vd); //@} /*! @name Topological Queries ... ...
 ... ... @@ -515,14 +515,6 @@ bool Map2::mergeVolumes(Dart d, Dart e) return true ; } void Map2::splitCC(std::vector& vd) { //assert(checkSimpleOrientedPath(vd)) ; for(std::vector::iterator it = vd.begin() ; it != vd.end() ; ++it) Map2::unsewFaces(*it); } /*! @name Topological Queries * Return or set various topological information *************************************************************************/ ... ...
 ... ... @@ -343,7 +343,7 @@ Dart Map3::collapseEdge(Dart d, bool delDegenerateVolumes) void Map3::splitFace(Dart d, Dart e) { assert(d != e && Map2::sameOrientedFace(d, e)) ; assert(d != e && sameOrientedFace(d, e)) ; Dart dd = phi1(phi3(d)); Dart ee = phi1(phi3(e)); ... ... @@ -489,26 +489,10 @@ void Map3::splitVolume(std::vector& vd) Map2::unsewFaces(*it); Map2::fillHole(e) ; Dart b = Map1::newBoundaryCycle(vd.size()); Dart fit1 = phi2(e) ; Dart fit2 = b ; do { phi3sew(fit1, fit2) ; fit1 = phi1(fit1) ; fit2 = phi_1(fit2) ; } while(fit2 != b) ; // if(isBoundaryMarked(e2)) // Map2::fillHole(e2) ; Map2::fillHole(e2) ; //sew the two connected components // Map3::sewVolumes(phi2(e), phi2(e2), false); Map3::sewVolumes(phi2(e), phi2(e2), false); } /*! @name Topological Queries ... ...
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!