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()
inline Dart ImplicitHierarchicalMap3::phi1(Dart d) const
{
assert(m_dartLevel[d] <= m_curLevel || !"Access to a dart introduced after current level") ;
bool finished = false ;
unsigned int edgeId = m_edgeId[d] ;
......
......@@ -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>
void subdivideEdgeWrong(typename PFP::MAP& map, Dart d, VertexAttribute<typename PFP::VEC3, typename PFP::MAP>& position) ;
......
......@@ -27,6 +27,7 @@
#include "Algo/Modelisation/extrusion.h"
#include "Topology/generic/dartmarker.h"
#define DEBUG_affichage
namespace CGoGN
{
......@@ -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.volumeIsSubdivided(d) || !"Trying to subdivide an already subdivided volume") ;
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);
Dart old = map.volumeOldestDart(d);
#ifdef DEBUG_affichage
CGoGNout<<"debut subdivision -"<< CGoGNendl;
#endif
unsigned int cur = map.getCurrentLevel();
map.setCurrentLevel(vLevel);
#ifdef DEBUG_affichage
CGoGNout<<"debut subdivision +"<< CGoGNendl;
#endif
// //one level of subdivision in the neighbordhood
// Traversor3VW<typename PFP::MAP> trav3EW(map, old);
// 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
oldEdges.reserve(20);
mf.markOrbit(Face(old)) ;
#ifdef DEBUG_affichage
CGoGNout<<"debut subdivision ++"<< CGoGNendl;
#endif
for(unsigned int i = 0; i < visitedFaces.size(); ++i)
{
Dart e = visitedFaces[i] ;
......@@ -265,7 +274,9 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, VertexAttribute<type
e = map.phi1(e) ;
} while(e != visitedFaces[i]) ;
}
#ifdef DEBUG_affichage
CGoGNout<<"debut subdivision +++"<< CGoGNendl;
#endif
volCenter /= typename PFP::REAL(count) ;
/*
......@@ -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
#ifdef DEBUG_affichage
CGoGNout<<"debut subdivision ++++"<< CGoGNendl;
#endif
std::vector<Dart> newEdges; //save darts from inner edges
newEdges.reserve(50);
......@@ -366,7 +379,9 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, VertexAttribute<type
//map.computeVertexVertexFunctor(e);
}
#ifdef DEBUG_affichage
CGoGNout<<"debut subdivision +++++"<< CGoGNendl;
#endif
map.deleteVolume(map.phi3(map.phi2(map.phi1(oldEdges.front()))));
//Third step : 3-sew internal faces
......@@ -392,6 +407,10 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, VertexAttribute<type
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 !!!!!!
//id pour les aretes interieurs : (i.e. 6 pour un hexa)
DartMarkerStore<typename PFP::MAP> mne(map);
......@@ -2535,463 +2554,463 @@ Dart subdivideVolume(typename PFP::MAP& map, Dart d, VertexAttribute<typename PF
// }
template <typename PFP>
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.volumeIsSubdivided(d) || !"Trying to subdivide an already subdivided volume") ;
//template <typename PFP>
//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.volumeIsSubdivided(d) || !"Trying to subdivide an already subdivided volume") ;
unsigned int vLevel = map.volumeLevel(d);
Dart old = map.volumeOldestDart(d);
unsigned int cur = map.getCurrentLevel();
map.setCurrentLevel(vLevel);
// unsigned int vLevel = map.volumeLevel(d);
// Dart old = map.volumeOldestDart(d);
/*
* au niveau du volume courant i
* stockage d'un brin de chaque face de celui-ci
* avec calcul du centroid
*/
// unsigned int cur = map.getCurrentLevel();
// map.setCurrentLevel(vLevel);
DartMarkerStore<typename PFP::MAP> mf(map); // Lock a face marker to save one dart per face
CellMarker<typename PFP::MAP, VERTEX> mv(map);
// /*
// * au niveau du volume courant i
// * stockage d'un brin de chaque face de celui-ci
// * avec calcul du centroid
// */
typename PFP::VEC3 volCenter;
unsigned count = 0 ;
// DartMarkerStore<typename PFP::MAP> mf(map); // Lock a face marker to save one dart per face
// CellMarker<typename PFP::MAP, VERTEX> mv(map);
//Store faces that are traversed and start with the face of d
std::vector<Dart> visitedFaces;
visitedFaces.reserve(512);
visitedFaces.push_back(old);
// typename PFP::VEC3 volCenter;
// unsigned count = 0 ;
//Store the edges before the cutEdge
std::vector<Dart> oldEdges;
oldEdges.reserve(512);
// //Store faces that are traversed and start with the face of d
// std::vector<Dart> visitedFaces;
// visitedFaces.reserve(512);
// visitedFaces.push_back(old);
mf.markOrbit<FACE>(old) ;
// //Store the edges before the cutEdge
// std::vector<Dart> oldEdges;
// oldEdges.reserve(512);
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);
}
// mf.markOrbit<FACE>(old) ;
// 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);
//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) ;
//test si la face est triangulaire ou non
if(map.phi1(map.phi1(map.phi1(d))) == d)
{
//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.setCurrentLevel(cur);
}
map.setCurrentLevel(vLevel + 1) ; // go to the next level to perform volume subdivision
std::vector<Dart> newEdges; //save darts from inner edges
newEdges.reserve(50);
//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)
{
Dart e = *edge;
std::vector<Dart> v ;
do
{
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));
e = map.phi2(map.phi_1(e));
}
while(e != *edge);
map.splitVolume(v) ;
// 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);
// }
//degree du sommet exterieur
unsigned int cornerDegree = map.Map2::vertexDegree(*edge);
// // 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) ;
// }
//tourner autour du sommet pour connaitre le brin d'un sommet de valence < cornerDegree
bool found = false;
Dart stop = e;
do
{
// e = map.phi1(e) ;
// } while(e != visitedFaces[i]) ;
// }
if(map.Map2::vertexDegree(map.phi2(map.phi1(e))) < cornerDegree)
{
stop = map.phi2(map.phi1(e));
found = true;
}
// volCenter /= typename PFP::REAL(count) ;
e = map.phi2(map.phi_1(e));
}
while(!found && e != *edge);
// /*
// * Subdivision
// */
// //Store the darts from quadrangulated faces
// std::vector<std::pair<Dart,Dart> > subdividedfacesQ;
// subdividedfacesQ.reserve(25);
//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::vector<std::pair<Dart,Dart> > subdividedfacesT;
// subdividedfacesT.reserve(25);
do
{
if(map.Map2::vertexDegree(dd) < cornerDegree)
found2 = true;
else
dd = map.phi1(dd);
}
while(!found2);
//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);
// //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;
//calcul de la taille des faces de chaque cote de stop
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;
// //if needed subdivide face
// if(!map.faceIsSubdivided(d))
// IHM::subdivideFace<PFP>(map, d, position);
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);
// //save a dart from the subdivided face
// unsigned int cur = map.getCurrentLevel() ;
do
{
//chercher le brin de faible degree suivant
bool found2 = false;
Dart dd = map.phi1(it);
// unsigned int fLevel = map.faceLevel(d) + 1; //puisque dans tous les cas, la face est subdivisee
// map.setCurrentLevel(fLevel) ;
do
{
if(dd == stop)
finished = true;
else if(map.Map2::vertexDegree(dd) < cornerDegree)
found2 = true;
else
dd = map.phi1(dd);
}
while(!found2 & !finished);
// //test si la face est triangulaire ou non
// if(map.phi1(map.phi1(map.phi1(d))) == d)
// {
// //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);
if(found2)
{
map.splitFace(it,dd);
}
it = map.phi_1(dd);
// }
if(it == stop)
finished = true;
// map.setCurrentLevel(cur);
// }
}
while(!finished);
// map.setCurrentLevel(vLevel + 1) ; // go to the next level to perform volume subdivision
}
else
{
//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);
}
// std::vector<Dart> newEdges; //save darts from inner edges
// newEdges.reserve(50);
}
// //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)
// {
// Dart e = *edge;
}
//sinon cas du tetraedre
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);
}
// std::vector<Dart> v ;
}
// do
// {
// 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));
// e = map.phi2(map.phi_1(e));
// }
// while(e != *edge);
// map.splitVolume(v) ;
//std::cout << "1ere etape finished" << std::endl;
// //degree du sommet exterieur
// unsigned int cornerDegree = map.Map2::vertexDegree(*edge);
CellMarker<typename PFP::MAP, FACE> mtf(map);
// //tourner autour du sommet pour connaitre le brin d'un sommet de valence < cornerDegree
// bool found = false;
// Dart stop = e;
// do
// {
//Etape 2
for (std::vector<std::pair<Dart,Dart> >::iterator edges = subdividedfacesT.begin(); edges != subdividedfacesT.end(); ++edges)
{
// Dart f1 = (*edges).first;
Dart f2 = (*edges).second;
// if(map.Map2::vertexDegree(map.phi2(map.phi1(e))) < cornerDegree)
// {
// stop = map.phi2(map.phi1(e));
// found = true;
// }
//si ce n'est pas un tetrahedre
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))
{
// e = map.phi2(map.phi_1(e));
// }
// while(!found && e != *edge);
//map.deleteVolume(map.phi3(map.phi2(map.phi1(oldEdges.front()))));
// //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);
// if(!mtf.isMarked(f1))
// do
// {
// mtf.mark(f1);
//
// map.closeHole(f1);
//
// if(map.Map2::faceDegree(map.phi2(f2)) == 3)
// if(map.Map2::vertexDegree(dd) < cornerDegree)
// found2 = true;
// else
// dd = map.phi1(dd);
// }
// while(!found2);
// //cas de la pyramide
// if(dd == stop)
// {
// //std::cout << "ajout d'un tetraedre" << std::endl;
// Dart x = Algo::Modelisation::trianguleFace<PFP>(map, map.phi2(f1));
// position[x] = volCenter;
// //std::cout << "pyramide" << std::endl;
// map.splitFace(dd, map.phi1(map.phi1(dd)));
// }
// else
// {
// //std::cout << "ajout d'un prisme" << std::endl;
// //Dart x = Algo::Modelisation::extrudeFace<PFP>(map,position,map.phi2(f1),5.0);
// Dart c = Algo::Modelisation::trianguleFace<PFP>(map, map.phi2(f1));
//
// Dart cc = c;
// // cut edges
// do
// map.splitFace(dd, stop);
// //calcul de la taille des faces de chaque cote de stop
// 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) ))
// {
//
// typename PFP::VEC3 p1 = position[cc] ;
// typename PFP::VEC3 p2 = position[map.phi1(cc)] ;
//
// map.cutEdge(cc);
//
// position[map.phi1(cc)] = (p1 + p2) * typename PFP::REAL(0.5) ;
//
// cc = map.phi2(map.phi_1(cc));
// }while (cc != c);
//
// // cut faces
// //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
// {
// Dart d1 = map.phi1(cc);
// Dart d2 = map.phi_1(cc);
// map.splitFace(d1,d2);
// cc = map.phi2(map.phi_1(cc));//map.Map2::alpha1(cc);
// }while (cc != c);
//
// //merge central faces by removing edges
// bool notFinished=true;
// //chercher le brin de faible degree suivant
// bool found2 = false;
// Dart dd = map.phi1(it);
// do
// {
// Dart d1 = map.Map2::alpha1(cc);
// if (d1 == cc) // last edge is pending edge inside of face
// notFinished = false;
// map.deleteFace(cc);
// cc = d1;
// } while (notFinished);
//
//
// map.closeHole(map.phi1(map.phi1(map.phi2(f1))));
//
// 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);
//std::cout << "2e etape finished" << std::endl;
// if(it == stop)
// finished = true;
// }