Commit 22a1e9b7 authored by untereiner's avatar untereiner
Browse files

Ajout d'un algo de subdiv volumique generalise + neighborhoodLevelDiffersByOne

parent 38e72f5d
...@@ -264,6 +264,10 @@ public: ...@@ -264,6 +264,10 @@ public:
*/ */
bool volumeIsSubdividedOnce(Dart d); bool volumeIsSubdividedOnce(Dart d);
/**
*
*/
bool neighborhoodLevelDiffersByOne(Dart d);
} ; } ;
......
...@@ -53,6 +53,9 @@ Dart subdivideVolume(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& positi ...@@ -53,6 +53,9 @@ Dart subdivideVolume(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& positi
template <typename PFP> template <typename PFP>
Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position); Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position);
template <typename PFP>
Dart subdivideVolumeOld(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position);
//template <typename PFP> //template <typename PFP>
//void subdivideLoop(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position); //void subdivideLoop(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position);
......
...@@ -168,9 +168,6 @@ void subdivideFace(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position ...@@ -168,9 +168,6 @@ void subdivideFace(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position
map.setCurrentLevel(cur) ; map.setCurrentLevel(cur) ;
} }
template <typename PFP> template <typename PFP>
Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position) Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position)
{ {
...@@ -364,10 +361,6 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos ...@@ -364,10 +361,6 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos
{ {
std::cout << "pyramide" << std::endl; std::cout << "pyramide" << std::endl;
map.splitFace(dd, map.phi1(map.phi1(dd))); map.splitFace(dd, map.phi1(map.phi1(dd)));
//tester si besoin de fermer f2 (par exemple pas besoin pour hexa... mais pour tet, octa, prisme oui)
//map.closeHole(f2);
//retenir un truc pour le sew/unsew final de l'octa au milieu
} }
else else
{ {
...@@ -452,7 +445,7 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos ...@@ -452,7 +445,7 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos
// //if(Algo::Modelisation::Tetrahedron::isTetrahedron<PFP>(map,f2)) // //if(Algo::Modelisation::Tetrahedron::isTetrahedron<PFP>(map,f2))
if( (map.Map2::faceDegree(f2) == 3 && map.Map2::faceDegree(map.phi2(f2)) == 3 && if( (map.Map2::faceDegree(f2) == 3 && map.Map2::faceDegree(map.phi2(f2)) == 3 &&
map.Map2::faceDegree(map.phi2(map.phi_1(f2))) == 3) && map.Map2::vertexDegree(f2) == 3) map.Map2::faceDegree(map.phi2(map.phi_1(f2))) == 3) && map.Map2::vertexDegree(f2) == 3)
{ { //cas du tetrahedre
std::cout << "ajout d'une face" << std::endl; std::cout << "ajout d'une face" << std::endl;
...@@ -534,108 +527,119 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos ...@@ -534,108 +527,119 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos
std::cout << "2e etape finished" << std::endl; std::cout << "2e etape finished" << std::endl;
{ // {
//Third step : 3-sew internal faces // //Third step : 3-sew internal faces
for (std::vector<std::pair<Dart,Dart> >::iterator it = subdividedfacesT.begin(); it != subdividedfacesT.end(); ++it) // for (std::vector<std::pair<Dart,Dart> >::iterator it = subdividedfacesT.begin(); it != subdividedfacesT.end(); ++it)
{ // {
Dart f1 = (*it).first; // Dart f1 = (*it).first;
Dart f2 = (*it).second; // Dart f2 = (*it).second;
//
//
if(map.phi3(map.phi2(f1)) == map.phi2(f1) && map.phi3(map.phi2(f2)) == map.phi2(f2)) //
{ // if(map.phi3(map.phi2(f1)) == map.phi2(f1) && map.phi3(map.phi2(f2)) == map.phi2(f2))
//id pour toutes les faces interieures // {
map.sewVolumes(map.phi2(f2), map.phi2(f1)); // if(map.getEmbedding(VERTEX, map.phi_1(map.phi2(f2))) == map.getEmbedding(VERTEX, map.phi_1(map.phi2(f1))))
// {
//Fais a la couture !!!!! // map.Map3::sewVolumes(map.phi2(f2), map.phi2(f1));
unsigned int idface = map.getNewFaceId(); // }
map.setFaceId(map.phi2(f1),idface, FACE); // else
} // {
//
// //id pour toutes les faces interieures
//FAIS a la couture !!!!!!! // map.sewVolumes(map.phi2(f2), map.phi2(f1));
//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); //
// //Fais a la couture !!!!!
} // unsigned int idface = map.getNewFaceId();
// map.setFaceId(map.phi2(f1),idface, FACE);
//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<Dart>::iterator it = newEdges.begin() ; it != newEdges.end() ; ++it) // //FAIS a la couture !!!!!!!
{ // //id pour toutes les aretes exterieurs des faces quadrangulees
if(!mne.isMarked(*it)) // unsigned int idedge = map.getEdgeId(f1);
{ // map.setEdgeId(map.phi2(f1), idedge, DART);
unsigned int idedge = map.getNewEdgeId(); // map.setEdgeId( map.phi2(f2), idedge, DART);
map.setEdgeId(*it, idedge, EDGE); //
mne.markOrbit(EDGE,*it); // }
} //
} // //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<Dart>::iterator it = newEdges.begin() ; it != newEdges.end() ; ++it)
{ // {
//Third step : 3-sew internal faces // if(!mne.isMarked(*it))
for (std::vector<std::pair<Dart,Dart> >::iterator it = subdividedfacesQ.begin(); it != subdividedfacesQ.end(); ++it) // {
{ // unsigned int idedge = map.getNewEdgeId();
Dart f1 = (*it).first; // map.setEdgeId(*it, idedge, EDGE);
Dart f2 = (*it).second; // mne.markOrbit(EDGE,*it);
// }
if(map.phi3(map.phi2(f1)) == map.phi2(f1) && map.phi3(map.phi2(f2)) == map.phi2(f2)) // }
{ // }
//id pour toutes les faces interieures //
map.sewVolumes(map.phi2(f2), map.phi2(f1)); // {
// //Third step : 3-sew internal faces
//Fais a la couture !!!!! // for (std::vector<std::pair<Dart,Dart> >::iterator it = subdividedfacesQ.begin(); it != subdividedfacesQ.end(); ++it)
unsigned int idface = map.getNewFaceId(); // {
map.setFaceId(map.phi2(f1),idface, FACE); // Dart f1 = (*it).first;
} // Dart f2 = (*it).second;
//
//FAIS a la couture !!!!!!! // if(map.phi3(map.phi2(f1)) == map.phi2(f1) && map.phi3(map.phi2(f2)) == map.phi2(f2))
//id pour toutes les aretes exterieurs des faces quadrangulees // {
unsigned int idedge = map.getEdgeId(f1); // //id pour toutes les faces interieures
map.setEdgeId(map.phi2(f1), idedge, DART); // map.sewVolumes(map.phi2(f2), map.phi2(f1));
map.setEdgeId( map.phi2(f2), idedge, DART); //
} // //Fais a la couture !!!!!
//LA copie de L'id est a gerer avec le sewVolumes normalement !!!!!! // unsigned int idface = map.getNewFaceId();
//id pour les aretes interieurs : (i.e. 16 pour un octa) // map.setFaceId(map.phi2(f1),idface, FACE);
DartMarker mne(map); // }
for(std::vector<Dart>::iterator it = newEdges.begin() ; it != newEdges.end() ; ++it) //
{ // //FAIS a la couture !!!!!!!
if(!mne.isMarked(*it)) // //id pour toutes les aretes exterieurs des faces quadrangulees
{ // unsigned int idedge = map.getEdgeId(f1);
unsigned int idedge = map.getNewEdgeId(); // map.setEdgeId(map.phi2(f1), idedge, DART);
map.setEdgeId(*it, idedge, EDGE); // map.setEdgeId( map.phi2(f2), idedge, DART);
mne.markOrbit(EDGE,*it); // }
} // //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<Dart>::iterator it = newEdges.begin() ; it != newEdges.end() ; ++it)
// {
for (std::vector<std::pair<Dart,Dart> >::iterator it = subdividedfacesT.begin(); it != subdividedfacesT.end(); ++it) // if(!mne.isMarked(*it))
{ // {
Dart f1 = (*it).first; // unsigned int idedge = map.getNewEdgeId();
Dart f2 = (*it).second; // map.setEdgeId(*it, idedge, EDGE);
// mne.markOrbit(EDGE,*it);
if( !(map.Map2::faceDegree(f2) == 3 && map.Map2::faceDegree(map.phi2(f2)) == 3 && // }
map.Map2::faceDegree(map.phi2(map.phi1(f2))) == 3 && map.Map2::faceDegree(map.phi2(map.phi_1(f2))) == 3)) // }
{ // }
//
//
if(map.phi2(map.phi1(map.phi1(map.phi2(f1)))) == map.phi3(map.phi2(map.phi1(map.phi1(map.phi2(f1))))) && // //cas tordu pour le prisme
map.phi2(map.phi3(map.phi2(map.phi3(map.phi2(map.phi3(map.phi2(map.phi2(map.phi1(map.phi1(map.phi2(f1))))))))))) == // for (std::vector<std::pair<Dart,Dart> >::iterator it = subdividedfacesT.begin(); it != subdividedfacesT.end(); ++it)
map.phi3(map.phi2(map.phi3(map.phi2(map.phi3(map.phi2(map.phi3(map.phi2(map.phi2(map.phi1(map.phi1(map.phi2(f1)))))))))))) // {
) // Dart f1 = (*it).first;
{ // Dart f2 = (*it).second;
map.sewVolumes(map.phi2(map.phi3(map.phi2(map.phi3(map.phi2(map.phi3(map.phi1(map.phi1(map.phi2(f1))))))))), //
map.phi2(map.phi1(map.phi1(map.phi2(f1))))); // if( !(map.Map2::faceDegree(f2) == 3 && map.Map2::faceDegree(map.phi2(f2)) == 3 &&
} // map.Map2::faceDegree(map.phi2(map.phi1(f2))) == 3 && map.Map2::faceDegree(map.phi2(map.phi_1(f2))) == 3))
// {
} //
//
} // if(map.phi2(map.phi1(map.phi1(map.phi2(f1)))) == map.phi3(map.phi2(map.phi1(map.phi1(map.phi2(f1))))) &&
// map.phi2(map.phi3(map.phi2(map.phi3(map.phi2(map.phi3(map.phi2(map.phi2(map.phi1(map.phi1(map.phi2(f1))))))))))) ==
// map.phi3(map.phi2(map.phi3(map.phi2(map.phi3(map.phi2(map.phi3(map.phi2(map.phi2(map.phi1(map.phi1(map.phi2(f1))))))))))))
// )
// {
// map.sewVolumes(map.phi2(map.phi1(map.phi1(map.phi2(f1)))),
// map.phi2(map.phi3(map.phi2(map.phi3(map.phi2(map.phi3(map.phi1(map.phi1(map.phi2(f1))))))))));
// }
//
// }
//
// }
map.setCurrentLevel(cur) ; map.setCurrentLevel(cur) ;
...@@ -651,6 +655,7 @@ Dart subdivideVolume(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& positi ...@@ -651,6 +655,7 @@ Dart subdivideVolume(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& positi
{ {
assert(map.getDartLevel(d) <= map.getCurrentLevel() || !"Access to a dart introduced after current level") ; 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.volumeIsSubdivided(d) || !"Trying to subdivide an already subdivided volume") ;
assert(!map.neighborhoodLevelDiffersByOne(d) || !"Trying to subdivide a volume with neighborhood Level difference greater than 1");
unsigned int vLevel = map.volumeLevel(d); unsigned int vLevel = map.volumeLevel(d);
Dart old = map.volumeOldestDart(d); Dart old = map.volumeOldestDart(d);
...@@ -800,6 +805,7 @@ Dart subdivideVolume(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& positi ...@@ -800,6 +805,7 @@ Dart subdivideVolume(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& positi
map.closeHole(f1); map.closeHole(f1);
//fonction qui calcule le degree max des faces atour d'un sommet
unsigned int fdeg = map.faceDegree(map.phi2(f1)); unsigned int fdeg = map.faceDegree(map.phi2(f1));
...@@ -868,7 +874,7 @@ Dart subdivideVolume(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& positi ...@@ -868,7 +874,7 @@ Dart subdivideVolume(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& positi
else else
{ {
map.closeHole(f2); map.closeHole(f2);
//map.sewVolumes(map.phi2(f1),map.phi2(f2)); map.sewVolumes(map.phi2(f1),map.phi2(f2));
unsigned int idface = map.getNewFaceId(); unsigned int idface = map.getNewFaceId();
map.setFaceId(map.phi2(f1),idface, FACE); map.setFaceId(map.phi2(f1),idface, FACE);
...@@ -978,203 +984,201 @@ Dart subdivideVolume(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& positi ...@@ -978,203 +984,201 @@ Dart subdivideVolume(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& positi
} }
//template <typename PFP> template <typename PFP>
//Dart subdivideVolume(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position) Dart subdivideVolumeOld(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.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.volumeIsSubdivided(d) || !"Trying to subdivide an already subdivided volume") ;
//
// unsigned int vLevel = map.volumeLevel(d); unsigned int vLevel = map.volumeLevel(d);
// Dart old = map.volumeOldestDart(d); Dart old = map.volumeOldestDart(d);
//
// unsigned int cur = map.getCurrentLevel(); unsigned int cur = map.getCurrentLevel();
// map.setCurrentLevel(vLevel); map.setCurrentLevel(vLevel);
//
//
// /* /*
// * au niveau du volume courant i * au niveau du volume courant i
// * stockage d'un brin de chaque face de celui-ci * stockage d'un brin de chaque face de celui-ci
// * avec calcul du centroid * avec calcul du centroid
// */ */
//
// DartMarkerStore mf(map); // Lock a face marker to save one dart per face DartMarkerStore mf(map); // Lock a face marker to save one dart per face
// CellMarker mv(map, VERTEX); CellMarker mv(map, VERTEX);
//
// typename PFP::VEC3 volCenter; typename PFP::VEC3 volCenter;
// unsigned count = 0 ; unsigned count = 0 ;
//
// //Store faces that are traversed and start with the face of d //Store faces that are traversed and start with the face of d
// std::vector<Dart> visitedFaces; std::vector<Dart> visitedFaces;
// visitedFaces.reserve(20); visitedFaces.reserve(20);
// visitedFaces.push_back(old); visitedFaces.push_back(old);
//
// //Store the edges before the cutEdge //Store the edges before the cutEdge
// std::vector<Dart> oldEdges; std::vector<Dart> oldEdges;
// oldEdges.reserve(20); oldEdges.reserve(20);
//
// mf.markOrbit(FACE, old) ; mf.markOrbit(FACE, old) ;
//
// for(std::vector<Dart>::iterator face = visitedFaces.begin(); face != visitedFaces.end(); ++face) for(std::vector<Dart>::iterator face = visitedFaces.begin(); face != visitedFaces.end(); ++face)
// { {
// Dart e = *face ; Dart e = *face ;
// do do
// { {
// //add one old edge per vertex to the old edge list //add one old edge per vertex to the old edge list
// //compute volume centroid //compute volume centroid
// if(!mv.isMarked(e)) if(!mv.isMarked(e))
// { {
// mv.mark(e); mv.mark(e);
// volCenter += position[e]; volCenter += position[e];
// ++count; ++count;
// oldEdges.push_back(e); oldEdges.push_back(e);
// } }
//
// // add all face neighbours to the table // add all face neighbours to the table
// Dart ee = map.phi2(e) ; Dart ee = map.phi2(e) ;
// if(!mf.isMarked(ee)) // not already marked if(!mf.isMarked(ee)) // not already marked
// { {
// visitedFaces.push_back(ee) ; visitedFaces.push_back(ee) ;
// mf.markOrbit(FACE, ee) ; mf.markOrbit(FACE, ee) ;
// } }
//
// e = map.phi1(e) ; e = map.phi1(e) ;
// } while(e != *face) ; } while(e != *face) ;
// } }
//
// volCenter /= typename PFP::REAL(count) ; volCenter /= typename PFP::REAL(count) ;
//
// /* /*
// * Subdivision * Subdivision
// */ */
//
// //Store the darts from quadrangulated faces //Store the darts from quadrangulated faces
// std::vector<std::pair<Dart,Dart> > subdividedfaces; std::vector<std::pair<Dart,Dart> > subdividedfaces;
// subdividedfaces.reserve(25); subdividedfaces.reserve(25);
//
// //First step : subdivide edges and faces //First step : subdivide edges and faces
// //creates a i+1 edge level and i+1 face level //creates a i+1 edge level and i+1 face level
// for (std::vector<Dart>::iterator face = visitedFaces.begin(); face != visitedFaces.end(); ++face) for (std::vector<Dart>::iterator face = visitedFaces.begin(); face != visitedFaces.end(); ++face)
// { {
// Dart d = *face; Dart d = *face;
//
// //if needed subdivide face //if needed subdivide face
// if(!map.faceIsSubdivided(d)) if(!map.faceIsSubdivided(d))
// Algo::IHM::subdivideFace<PFP>(map, d, position); Algo::IHM::subdivideFace<PFP>(map, d, position);
//
// //save a dart from the subdivided face //save a dart from the subdivided face
// unsigned int cur = map.getCurrentLevel() ; 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(d) + 1; //puisque dans tous les cas, la face est subdivisee
// map.setCurrentLevel(fLevel) ; map.setCurrentLevel(fLevel) ;
//
//
// //le brin est forcement du niveau cur //le brin est forcement du niveau cur
// Dart cf = map.phi1(d); Dart cf = map.phi1(d);
// Dart e = cf; Dart e = cf;
// do do
// { {
// subdividedfaces.push_back(std::pair<Dart,Dart>(e,map.phi2(e))); subdividedfaces.push_back(std::pair<Dart,Dart>(e,map.phi2(e)));
// e = map.phi2(map.phi1(e)); e = map.phi2(map.phi1(e));
// }while (e != cf); }while (e != cf);
//
// map.setCurrentLevel(cur); map.setCurrentLevel(cur);
// } }
//
// map.setCurrentLevel(vLevel + 1) ; // go to the next level to perform volume subdivision map.setCurrentLevel(vLevel + 1) ; // go to the next level to perform volume subdivision
//
// std::vector<Dart> newEdges; //save darts from inner edges std::vector<Dart> newEdges; //save darts from inner edges
// newEdges.reserve(50); newEdges.reserve(50);
//
// //Second step : deconnect each corner, close each hole, subdivide each new face into 3 //Second step : deconnect each corner, close each hole, subdivide each new face into 3
// for (std::vector<Dart>::iterator edge = oldEdges.begin(); edge != oldEdges.end(); ++edge) for (std::vector<Dart>::iterator edge = oldEdges.begin(); edge != oldEdges.end(); ++edge)
// { {
// Dart e = *edge; Dart e = *edge;
//
// Dart f1 = map.phi1(*edge); Dart f1 = map.phi1(*edge);
//
// do do
// { {
// map.unsewFaces(map.phi1(map.phi1(e))); map.unsewFaces(map.phi1(map.phi1(e)));
//
// //TODO utile ? map.unsewFaces(map.phi1(e));
// //if(map.phi2(map.phi1(e)) != map.phi1(e))
// map.unsewFaces(map.phi1(e)); e = map.phi2(map.phi_1(e));
// }
// e = map.phi2(map.phi_1(e)); while(e != *edge);
// }
// while(e != *edge); map.closeHole(f1);
//
// map.closeHole(f1); Dart old = map.phi2(map.phi1(e));
// Dart dd = map.phi1(map.phi1(old)) ;
// Dart old = map.phi2(map.phi1(e)); map.splitFace(old,dd) ;
// Dart dd = map.phi1(map.phi1(old)) ;
// map.splitFace(old,dd) ; Dart ne = map.phi1(map.phi1(old)) ;
//
// Dart ne = map.phi1(map.phi1(old)) ; map.cutEdge(ne);
// position[map.phi1(ne)] = volCenter; //plonger a la fin de la boucle ????
// map.cutEdge(ne); newEdges.push_back(ne);
// position[map.phi1(ne)] = volCenter; //plonger a la fin de la boucle ???? newEdges.push_back(map.phi1(ne));
// newEdges.push_back(ne);
// newEdges.push_back(map.phi1(ne));
// Dart stop = map.phi2(map.phi1(ne));
// ne = map.phi2(ne);
// Dart stop = map.phi2(map.phi1(ne)); do
// ne = map.phi2(ne); {
// do dd = map.phi1(map.phi1(map.phi1(ne)));
// {
// dd = map.phi1(map.phi1(map.phi1(ne))); //A Verifier !!
// map.splitFace(ne, dd) ;
// //A Verifier !!
// map.splitFace(ne, dd) ; newEdges.push_back(map.phi1(dd));
//