Coupure prévue mardi 3 Août au matin pour maintenance du serveur. Nous faisons au mieux pour que celle-ci soit la plus brève possible.

Commit d69b68dc authored by pitiot's avatar pitiot
Browse files

up

parent 68c88362
...@@ -94,6 +94,8 @@ inline Dart ImplicitHierarchicalMap3::newDart() ...@@ -94,6 +94,8 @@ inline Dart ImplicitHierarchicalMap3::newDart()
inline Dart ImplicitHierarchicalMap3::phi1(Dart d) const inline Dart ImplicitHierarchicalMap3::phi1(Dart d) const
{ {
assert(m_dartLevel[d] <= m_curLevel || !"Access to a dart introduced after current level") ; assert(m_dartLevel[d] <= m_curLevel || !"Access to a dart introduced after current level") ;
bool finished = false ; bool finished = false ;
unsigned int edgeId = m_edgeId[d] ; unsigned int edgeId = m_edgeId[d] ;
......
...@@ -70,8 +70,6 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, VertexAttribute<type ...@@ -70,8 +70,6 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, VertexAttribute<type
template <typename PFP>
void subdivideFaceWrong(typename PFP::MAP& map, Dart d, AttributeHandler<typename PFP::VEC3, VERTEX, typename PFP::MAP>& position, SubdivideType sType = S_TRI);
template <typename PFP> template <typename PFP>
void subdivideEdgeWrong(typename PFP::MAP& map, Dart d, VertexAttribute<typename PFP::VEC3, typename PFP::MAP>& position) ; void subdivideEdgeWrong(typename PFP::MAP& map, Dart d, VertexAttribute<typename PFP::VEC3, typename PFP::MAP>& position) ;
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "Algo/Modelisation/extrusion.h" #include "Algo/Modelisation/extrusion.h"
#include "Topology/generic/dartmarker.h" #include "Topology/generic/dartmarker.h"
#define DEBUG_affichage
namespace CGoGN namespace CGoGN
{ {
...@@ -200,13 +201,19 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, VertexAttribute<type ...@@ -200,13 +201,19 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, VertexAttribute<type
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.isBoundaryMarked(3,d) || !"Trying to subdivide a dart marked boundary"); assert(!map.isBoundaryMarked(3,d) || !"Trying to subdivide a dart marked boundary");
#ifdef DEBUG_affichage
CGoGNout<<"debut subdivision --"<< CGoGNendl;
#endif
unsigned int vLevel = map.volumeLevel(d); unsigned int vLevel = map.volumeLevel(d);
Dart old = map.volumeOldestDart(d); Dart old = map.volumeOldestDart(d);
#ifdef DEBUG_affichage
CGoGNout<<"debut subdivision -"<< CGoGNendl;
#endif
unsigned int cur = map.getCurrentLevel(); unsigned int cur = map.getCurrentLevel();
map.setCurrentLevel(vLevel); map.setCurrentLevel(vLevel);
#ifdef DEBUG_affichage
CGoGNout<<"debut subdivision +"<< CGoGNendl;
#endif
// //one level of subdivision in the neighbordhood // //one level of subdivision in the neighbordhood
// Traversor3VW<typename PFP::MAP> trav3EW(map, old); // Traversor3VW<typename PFP::MAP> trav3EW(map, old);
// for(Dart dit = trav3EW.begin() ; dit != trav3EW.end() ; dit = trav3EW.next()) // for(Dart dit = trav3EW.begin() ; dit != trav3EW.end() ; dit = trav3EW.next())
...@@ -238,7 +245,9 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, VertexAttribute<type ...@@ -238,7 +245,9 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, VertexAttribute<type
oldEdges.reserve(20); oldEdges.reserve(20);
mf.markOrbit(Face(old)) ; mf.markOrbit(Face(old)) ;
#ifdef DEBUG_affichage
CGoGNout<<"debut subdivision ++"<< CGoGNendl;
#endif
for(unsigned int i = 0; i < visitedFaces.size(); ++i) for(unsigned int i = 0; i < visitedFaces.size(); ++i)
{ {
Dart e = visitedFaces[i] ; Dart e = visitedFaces[i] ;
...@@ -265,7 +274,9 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, VertexAttribute<type ...@@ -265,7 +274,9 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, VertexAttribute<type
e = map.phi1(e) ; e = map.phi1(e) ;
} while(e != visitedFaces[i]) ; } while(e != visitedFaces[i]) ;
} }
#ifdef DEBUG_affichage
CGoGNout<<"debut subdivision +++"<< CGoGNendl;
#endif
volCenter /= typename PFP::REAL(count) ; volCenter /= typename PFP::REAL(count) ;
/* /*
...@@ -305,7 +316,9 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, VertexAttribute<type ...@@ -305,7 +316,9 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, VertexAttribute<type
} }
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
#ifdef DEBUG_affichage
CGoGNout<<"debut subdivision ++++"<< CGoGNendl;
#endif
std::vector<Dart> newEdges; //save darts from inner edges std::vector<Dart> newEdges; //save darts from inner edges
newEdges.reserve(50); newEdges.reserve(50);
...@@ -366,7 +379,9 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, VertexAttribute<type ...@@ -366,7 +379,9 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, VertexAttribute<type
//map.computeVertexVertexFunctor(e); //map.computeVertexVertexFunctor(e);
} }
#ifdef DEBUG_affichage
CGoGNout<<"debut subdivision +++++"<< CGoGNendl;
#endif
map.deleteVolume(map.phi3(map.phi2(map.phi1(oldEdges.front())))); map.deleteVolume(map.phi3(map.phi2(map.phi1(oldEdges.front()))));
//Third step : 3-sew internal faces //Third step : 3-sew internal faces
...@@ -392,6 +407,10 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, VertexAttribute<type ...@@ -392,6 +407,10 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, VertexAttribute<type
map.setEdgeId( map.phi2(f2), idedge, DART); map.setEdgeId( map.phi2(f2), idedge, DART);
} }
#ifdef DEBUG_affichage
CGoGNout<<"debut subdivision ++++++"<< CGoGNendl;
#endif
//LA copie de L'id est a gerer avec le sewVolumes normalement !!!!!! //LA copie de L'id est a gerer avec le sewVolumes normalement !!!!!!
//id pour les aretes interieurs : (i.e. 6 pour un hexa) //id pour les aretes interieurs : (i.e. 6 pour un hexa)
DartMarkerStore<typename PFP::MAP> mne(map); DartMarkerStore<typename PFP::MAP> mne(map);
...@@ -2535,463 +2554,463 @@ Dart subdivideVolume(typename PFP::MAP& map, Dart d, VertexAttribute<typename PF ...@@ -2535,463 +2554,463 @@ Dart subdivideVolume(typename PFP::MAP& map, Dart d, VertexAttribute<typename PF
// } // }
template <typename PFP> //template <typename PFP>
Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, VertexAttribute<typename PFP::VEC3, typename PFP::MAP>& position) //Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, VertexAttribute<typename PFP::VEC3, typename PFP::MAP>& 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<typename PFP::MAP> mf(map); // Lock a face marker to save one dart per face // DartMarkerStore<typename PFP::MAP> mf(map); // Lock a face marker to save one dart per face
CellMarker<typename PFP::MAP, VERTEX> mv(map); // CellMarker<typename PFP::MAP, VERTEX> mv(map);
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(512); // visitedFaces.reserve(512);
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(512); // oldEdges.reserve(512);
mf.markOrbit<FACE>(old) ;
for(unsigned int i = 0; i < visitedFaces.size(); ++i)
{
Dart e = visitedFaces[i] ;
do
{
//add one old edge per vertex to the old edge list
//compute volume centroid
if(!mv.isMarked(e))
{
mv.mark(e);
volCenter += position[e];
++count;
oldEdges.push_back(e);
}
// add all face neighbours to the table
Dart ee = map.phi2(e) ;
if(!mf.isMarked(ee)) // not already marked
{
visitedFaces.push_back(ee) ;
mf.markOrbit<FACE>(ee) ;
}
e = map.phi1(e) ;
} while(e != visitedFaces[i]) ;
}
volCenter /= typename PFP::REAL(count) ;
/*
* Subdivision
*/
//Store the darts from quadrangulated faces
std::vector<std::pair<Dart,Dart> > subdividedfacesQ;
subdividedfacesQ.reserve(25);
std::vector<std::pair<Dart,Dart> > subdividedfacesT;
subdividedfacesT.reserve(25);
//First step : subdivide edges and faces
//creates a i+1 edge level and i+1 face level
for (std::vector<Dart>::iterator face = visitedFaces.begin(); face != visitedFaces.end(); ++face)
{
Dart d = *face;
//if needed subdivide face
if(!map.faceIsSubdivided(d))
IHM::subdivideFace<PFP>(map, d, position);
// mf.markOrbit<FACE>(old) ;
//save a dart from the subdivided face // for(unsigned int i = 0; i < visitedFaces.size(); ++i)
unsigned int cur = map.getCurrentLevel() ; // {
// Dart e = visitedFaces[i] ;
// do
// {
// //add one old edge per vertex to the old edge list
// //compute volume centroid
// if(!mv.isMarked(e))
// {
// mv.mark(e);
// volCenter += position[e];
// ++count;
// oldEdges.push_back(e);
// }
unsigned int fLevel = map.faceLevel(d) + 1; //puisque dans tous les cas, la face est subdivisee // // add all face neighbours to the table
map.setCurrentLevel(fLevel) ; // Dart ee = map.phi2(e) ;
// if(!mf.isMarked(ee)) // not already marked
// {
// visitedFaces.push_back(ee) ;
// mf.markOrbit<FACE>(ee) ;
// }
//test si la face est triangulaire ou non // e = map.phi1(e) ;
if(map.phi1(map.phi1(map.phi1(d))) == d) // } while(e != visitedFaces[i]) ;
{ // }
//std::cout << "trian" << std::endl;
Dart cf = map.phi2(map.phi1(d));
Dart e = cf;
do
{
subdividedfacesT.push_back(std::pair<Dart,Dart>(e,map.phi2(e)));
e = map.phi1(e);
}while (e != cf);
}
else
{
//std::cout << "quad" << std::endl;
Dart cf = map.phi1(d);
Dart e = cf;
do
{
subdividedfacesQ.push_back(std::pair<Dart,Dart>(e,map.phi2(e)));
e = map.phi2(map.phi1(e));
}while (e != cf);
// volCenter /= typename PFP::REAL(count) ;
} // /*
// * Subdivision
// */
// //Store the darts from quadrangulated faces
// std::vector<std::pair<Dart,Dart> > subdividedfacesQ;
// subdividedfacesQ.reserve(25);
map.setCurrentLevel(cur); // std::vector<std::pair<Dart,Dart> > subdividedfacesT;
} // subdividedfacesT.reserve(25);
map.setCurrentLevel(vLevel + 1) ; // go to the next level to perform volume subdivision
std::vector<Dart> newEdges; //save darts from inner edges // //First step : subdivide edges and faces
newEdges.reserve(50); // //creates a i+1 edge level and i+1 face level
// for (std::vector<Dart>::iterator face = visitedFaces.begin(); face != visitedFaces.end(); ++face)
// {
// Dart d = *face;
//Second step : deconnect each corner, close each hole, subdivide each new face into 3 // //if needed subdivide face
for (std::vector<Dart>::iterator edge = oldEdges.begin(); edge != oldEdges.end(); ++edge) // if(!map.faceIsSubdivided(d))
{ // IHM::subdivideFace<PFP>(map, d, position);
Dart e = *edge;
std::vector<Dart> v ;
do // //save a dart from the subdivided face
{ // unsigned int cur = map.getCurrentLevel() ;
if(map.phi1(map.phi1(map.phi1(e))) != e)
v.push_back(map.phi1(map.phi1(e))); //remplacer par une boucle qui découd toute la face et non juste une face carre (jusqu'a phi_1(e))
v.push_back(map.phi1(e)); // unsigned int fLevel = map.faceLevel(d) + 1; //puisque dans tous les cas, la face est subdivisee
// map.setCurrentLevel(fLevel) ;
e = map.phi2(map.phi_1(e)); // //test si la face est triangulaire ou non
} // if(map.phi1(map.phi1(map.phi1(d))) == d)
while(e != *edge); // {
// //std::cout << "trian" << std::endl;
// Dart cf = map.phi2(map.phi1(d));
// Dart e = cf;
// do
// {
// subdividedfacesT.push_back(std::pair<Dart,Dart>(e,map.phi2(e)));
// e = map.phi1(e);
// }while (e != cf);
// }
// else
// {
// //std::cout << "quad" << std::endl;
// Dart cf = map.phi1(d);
// Dart e = cf;
// do
// {
// subdividedfacesQ.push_back(std::pair<Dart,Dart>(e,map.phi2(e)));
// e = map.phi2(map.phi1(e));
// }while (e != cf);
map.splitVolume(v) ;
//degree du sommet exterieur // }
unsigned int cornerDegree = map.Map2::vertexDegree(*edge);
//tourner autour du sommet pour connaitre le brin d'un sommet de valence < cornerDegree // map.setCurrentLevel(cur);
bool found = false; // }
Dart stop = e;
do
{
if(map.Map2::vertexDegree(map.phi2(map.phi1(e))) < cornerDegree) // map.setCurrentLevel(vLevel + 1) ; // go to the next level to perform volume subdivision
{
stop = map.phi2(map.phi1(e));
found = true;
}
e = map.phi2(map.phi_1(e)); // std::vector<Dart> newEdges; //save darts from inner edges
} // newEdges.reserve(50);
while(!found && e != *edge);
//si il existe un sommet de degre inferieur au degree du coin // //Second step : deconnect each corner, close each hole, subdivide each new face into 3
if(found) // for (std::vector<Dart>::iterator edge = oldEdges.begin(); edge != oldEdges.end(); ++edge)
{ // {
//chercher le brin de faible degree suivant // Dart e = *edge;
bool found2 = false;
Dart dd = map.phi1(stop);
do // std::vector<Dart> v ;
{
if(map.Map2::vertexDegree(dd) < cornerDegree)
found2 = true;
else
dd = map.phi1(dd);
}
while(!found2);
//cas de la pyramide // do
if(dd == stop) // {
{ // if(map.phi1(map.phi1(map.phi1(e))) != e)
//std::cout << "pyramide" << std::endl; // v.push_back(map.phi1(map.phi1(e))); //remplacer par une boucle qui découd toute la face et non juste une face carre (jusqu'a phi_1(e))
map.splitFace(dd, map.phi1(map.phi1(dd)));
}
else
{
map.splitFace(dd, stop);
//calcul de la taille des faces de chaque cote de stop // v.push_back(map.phi1(e));
if(!( (map.Map2::faceDegree(map.phi_1(stop)) == 3 && map.Map2::faceDegree(map.phi2(map.phi_1(stop))) == 4) ||
(map.Map2::faceDegree(map.phi_1(stop)) == 4 && map.Map2::faceDegree(map.phi2(map.phi_1(stop))) == 3) ))
{
//std::cout << "octaedre ou hexaedre" << std::endl;
Dart ne = map.phi_1(stop) ;
map.cutEdge(ne);
position[map.phi1(ne)] = volCenter;
stop = map.phi2(map.phi1(ne));
bool finished = false;
Dart it = map.phi2(ne);
do
{
//chercher le brin de faible degree suivant
bool found2 = false;
Dart dd = map.phi1(it);
do
{
if(dd == stop)
finished = true;
else if(map.Map2::vertexDegree(dd) < cornerDegree)
found2 = true;
else
dd = map.phi1(dd);
}
while(!found2 & !finished);
if(found2)
{
map.splitFace(it,dd);
}
it = map.phi_1(dd);
if(it == stop)
finished = true;
}
while(!finished);
} // e = map.phi2(map.phi_1(e));
else // }
{ // while(e != *edge);
//std::cout << "prisme" << std::endl;
//tester si besoin de fermer f2 (par exemple pas besoin pour hexa... mais pour tet, octa, prisme oui)
//map.closeHole(f2);
}
} // map.splitVolume(v) ;
} // //degree du sommet exterieur
//sinon cas du tetraedre // unsigned int cornerDegree = map.Map2::vertexDegree(*edge);
else
{
//std::cout << "tetraedre" << std::endl;
//tester si besoin de fermer f2 (par exemple pas besoin pour hexa... mais pour tet, octa, prisme oui)
//map.closeHole(f2);
}
} // //tourner autour du sommet pour connaitre le brin d'un sommet de valence < cornerDegree
// bool found = false;
// Dart stop = e;
// do
// {
// if(map.Map2::vertexDegree(map.phi2(map.phi1(e))) < cornerDegree)
// {
// stop = map.phi2(map.phi1(e));
// found = true;
// }
// e = map.phi2(map.phi_1(e));
// }
// while(!found && e != *edge);
// //si il existe un sommet de degre inferieur au degree du coin
// if(found)
// {
// //chercher le brin de faible degree suivant
// bool found2 = false;
// Dart dd = map.phi1(stop);
//std::cout << "1ere etape finished" << std::endl; // do
// {
// if(map.Map2::vertexDegree(dd) < cornerDegree)
// found2 = true;
// else
// dd = map.phi1(dd);
// }
// while(!found2);
CellMarker<typename PFP::MAP, FACE> mtf(map); // //cas de la pyramide
// if(dd == stop)
// {
// //std::cout << "pyramide" << std::endl;
// map.splitFace(dd, map.phi1(map.phi1(dd)));
// }
// else
// {
// map.splitFace(dd, stop);
//Etape 2 // //calcul de la taille des faces de chaque cote de stop
for (std::vector<std::pair<Dart,Dart> >::iterator edges = subdividedfacesT.begin(); edges != subdividedfacesT.end(); ++edges) // if(!( (map.Map2::faceDegree(map.phi_1(stop)) == 3 && map.Map2::faceDegree(map.phi2(map.phi_1(stop))) == 4) ||
{ // (map.Map2::faceDegree(map.phi_1(stop)) == 4 && map.Map2::faceDegree(map.phi2(map.phi_1(stop))) == 3) ))
// Dart f1 = (*edges).first; // {
Dart f2 = (*edges).second; // //std::cout << "octaedre ou hexaedre" << std::endl;