Commit 2cb734d8 authored by untereiner's avatar untereiner

new Polyhedra creation functions (createPrism, createPyramid, createDiamond)

parent 26eef763
...@@ -31,7 +31,7 @@ SimpleGMap2::SimpleGMap2() ...@@ -31,7 +31,7 @@ SimpleGMap2::SimpleGMap2()
{ {
position = myMap.addAttribute<PFP::VEC3>(VERTEX, "position"); position = myMap.addAttribute<PFP::VEC3>(VERTEX, "position");
Dart d = Algo::Modelisation::Polyhedron<PFP>::createTetra(myMap); Dart d = Algo::Modelisation::createTetrahedron<PFP>(myMap);
position[d] = VEC3(0,0,0); position[d] = VEC3(0,0,0);
position[myMap.phi1(d)] = VEC3(10,0,15); position[myMap.phi1(d)] = VEC3(10,0,15);
position[myMap.phi_1(d)] = VEC3(10,20,15); position[myMap.phi_1(d)] = VEC3(10,20,15);
......
...@@ -123,7 +123,7 @@ void MyQT::traverseMap() ...@@ -123,7 +123,7 @@ void MyQT::traverseMap()
void MyQT::createMap() void MyQT::createMap()
{ {
Dart d1 = Algo::Modelisation::Polyhedron<PFP>::createTetra(myMap); Dart d1 = Algo::Modelisation::createTetrahedron<PFP>(myMap);
Dart d2 = d1; Dart d2 = d1;
......
...@@ -126,7 +126,7 @@ void MyQT::traverseMap() ...@@ -126,7 +126,7 @@ void MyQT::traverseMap()
void MyQT::createMap() void MyQT::createMap()
{ {
Dart d1 = Algo::Modelisation::Polyhedron<PFP>::createHexa(myMap); Dart d1 = Algo::Modelisation::createHexahedron<PFP>(myMap);
Dart d2 = d1; Dart d2 = d1;
......
...@@ -59,6 +59,8 @@ public: ...@@ -59,6 +59,8 @@ public:
~ImplicitHierarchicalMap3() ; ~ImplicitHierarchicalMap3() ;
void update_topo_shortcuts();
//! //!
/*! /*!
* *
......
...@@ -63,6 +63,16 @@ AttributeHandler_IHM<T> ImplicitHierarchicalMap3::getAttribute(unsigned int orbi ...@@ -63,6 +63,16 @@ AttributeHandler_IHM<T> ImplicitHierarchicalMap3::getAttribute(unsigned int orbi
return AttributeHandler_IHM<T>(this, h.getDataVector()) ; return AttributeHandler_IHM<T>(this, h.getDataVector()) ;
} }
inline void ImplicitHierarchicalMap3::update_topo_shortcuts()
{
Map3::update_topo_shortcuts();
m_dartLevel = Map3::getAttribute<unsigned int>(DART, "dartLevel") ;
m_faceId = Map3::getAttribute<unsigned int>(DART, "faceId") ;
m_edgeId = Map3::getAttribute<unsigned int>(DART, "edgeId") ;
}
/*************************************************** /***************************************************
* MAP TRAVERSAL * * MAP TRAVERSAL *
***************************************************/ ***************************************************/
......
...@@ -279,39 +279,12 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& ...@@ -279,39 +279,12 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, typename PFP::TVEC3&
std::vector<Dart> newEdges; //save darts from inner edges std::vector<Dart> newEdges; //save darts from inner edges
newEdges.reserve(50); newEdges.reserve(50);
// DartMarker mSplitted(map);
//
// int i = 0;
//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)
{ {
// std::vector<Dart> v ;
// Dart e = map.beginSplittingPath(*edge, mSplitted);
//
// std::cout << "e = " << e << "plop" << std::endl;
//
// //Tous les brins ont deja ete decousus, il n'y a pas de chemin d'arete a construire
// if(e == NIL)
// {
// return NIL;
// }
// else
// {
// map.constructSplittingPath(e, v, mSplitted);
// }
//
// std::cout << std::endl;
// for(std::vector<Dart>::iterator it = v.begin() ; it != v.end() ; ++it)
// std::cout << *it << std::endl;
// std::cout << std::endl;
//
// i++;
// if(i == 2)
// return NIL;
Dart e = *edge; Dart e = *edge;
std::vector<Dart> v ; std::vector<Dart> v ;
do do
...@@ -323,11 +296,6 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& ...@@ -323,11 +296,6 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, typename PFP::TVEC3&
} }
while(e != *edge); while(e != *edge);
// std::cout << "begin" << std::endl;
// for(std::vector<Dart>::iterator it = v.begin() ; it != v.end() ; ++it)
// std::cout << *it << std::endl;
// std::cout << "finished" << std::endl;
map.splitVolume(v) ; map.splitVolume(v) ;
Dart old = map.phi2(map.phi1(*edge)); Dart old = map.phi2(map.phi1(*edge));
...@@ -410,10 +378,11 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& ...@@ -410,10 +378,11 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, typename PFP::TVEC3&
} }
template <typename PFP> template <typename PFP>
Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position) Dart subdivideVolume(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") ;
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);
...@@ -440,7 +409,7 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos ...@@ -440,7 +409,7 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos
//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(20);
mf.markOrbit(FACE, old) ; mf.markOrbit(FACE, old) ;
...@@ -476,13 +445,9 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos ...@@ -476,13 +445,9 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos
/* /*
* Subdivision * Subdivision
*/ */
//Store the darts from quadrangulated faces //type 'q' : quad et plus
std::vector<std::pair<Dart,Dart> > subdividedfacesQ; //type 't' : tri
subdividedfacesQ.reserve(25); std::vector<std::pair<char, std::pair<Dart,Dart> > > subdividedfaces;
std::vector<std::pair<Dart,Dart> > subdividedfacesT;
subdividedfacesT.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
...@@ -501,8 +466,6 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos ...@@ -501,8 +466,6 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos
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) ;
//test si la face est triangulaire ou non //test si la face est triangulaire ou non
if(map.phi1(map.phi1(map.phi1(d))) == d) if(map.phi1(map.phi1(map.phi1(d))) == d)
{ {
...@@ -511,7 +474,8 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos ...@@ -511,7 +474,8 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos
Dart e = cf; Dart e = cf;
do do
{ {
subdividedfacesT.push_back(std::pair<Dart,Dart>(e,map.phi2(e))); std::pair<Dart,Dart> pd(e,map.phi2(e));
subdividedfaces.push_back(std::pair<char, std::pair<Dart,Dart> > ('t',pd));
e = map.phi1(e); e = map.phi1(e);
}while (e != cf); }while (e != cf);
} }
...@@ -522,7 +486,8 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos ...@@ -522,7 +486,8 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos
Dart e = cf; Dart e = cf;
do do
{ {
subdividedfacesQ.push_back(std::pair<Dart,Dart>(e,map.phi2(e))); std::pair<Dart,Dart> pd(e,map.phi2(e));
subdividedfaces.push_back(std::pair<char, std::pair<Dart,Dart> >('q',pd));
e = map.phi2(map.phi1(e)); e = map.phi2(map.phi1(e));
}while (e != cf); }while (e != cf);
...@@ -530,6 +495,7 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos ...@@ -530,6 +495,7 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos
} }
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
...@@ -537,17 +503,22 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos ...@@ -537,17 +503,22 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos
std::vector<Dart> newEdges; //save darts from inner edges std::vector<Dart> newEdges; //save darts from inner edges
newEdges.reserve(50); newEdges.reserve(50);
bool istet = true;
bool ishex = false;
//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;
std::vector<Dart> v ; std::vector<Dart> v ;
Dart f1 = map.phi1(*edge);
//Dart f2 = map.phi2(f1);
do do
{ {
if(map.phi1(map.phi1(map.phi1(e))) != e) 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(map.phi1(e)));
v.push_back(map.phi1(e)); v.push_back(map.phi1(e));
...@@ -557,230 +528,98 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos ...@@ -557,230 +528,98 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos
map.splitVolume(v) ; 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
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);
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);
//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;
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);
}
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);
}
}
}
//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::cout << "1ere etape finished" << std::endl;
CellMarker mtf(map, FACE);
//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;
//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))
{
//map.deleteVolume(map.phi3(map.phi2(map.phi1(oldEdges.front()))));
// if(!mtf.isMarked(f1)) // //fonction qui calcule le degree max des faces atour d'un sommet
// { // unsigned int fdeg = map.faceDegree(map.phi2(f1));
// mtf.mark(f1);
//
// map.closeHole(f1);
//
// if(map.Map2::faceDegree(map.phi2(f2)) == 3)
// {
// //std::cout << "ajout d'un tetraedre" << std::endl;
// Dart x = Algo::Modelisation::trianguleFace<PFP>(map, map.phi2(f1));
// position[x] = volCenter;
// }
// 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; // if(fdeg > 4)
// // cut edges // {
// do // std::cout << "> 4" << std::endl;
// {
// //
// typename PFP::VEC3 p1 = position[cc] ; // ishex = true;
// typename PFP::VEC3 p2 = position[map.phi1(cc)] ;
// //
// map.cutEdge(cc); // Dart old = map.phi2(map.phi1(e));
// Dart dd = map.phi1(map.phi1(old)) ;
// map.splitFace(old,dd) ;
// //
// position[map.phi1(cc)] = (p1 + p2) * typename PFP::REAL(0.5) ; // Dart ne = map.phi1(map.phi1(old)) ;
// //
// cc = map.phi2(map.phi_1(cc)); // map.cutEdge(ne);
// }while (cc != c); // position[map.phi1(ne)] = volCenter; //plonger a la fin de la boucle ????
// newEdges.push_back(ne);
// newEdges.push_back(map.phi1(ne));
// //
// // cut faces
// 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 // Dart stop = map.phi2(map.phi1(ne));
// bool notFinished=true; // ne = map.phi2(ne);
// do // do
// { // {
// Dart d1 = map.Map2::alpha1(cc); // dd = map.phi1(map.phi1(map.phi1(ne)));
// if (d1 == cc) // last edge is pending edge inside of face
// notFinished = false;
// map.deleteFace(cc);
// cc = d1;
// } while (notFinished);
// //
// //A Verifier !!
// map.splitFace(ne, dd) ;
// //
// map.closeHole(map.phi1(map.phi1(map.phi2(f1)))); // newEdges.push_back(map.phi1(dd));
// //
// } // ne = map.phi2(map.phi_1(ne));
// dd = map.phi1(map.phi1(dd));
// } // }
// while(dd != stop);
} // }
} // else if(fdeg > 3)
//std::cout << "2e etape finished" << std::endl;
// {
// //Third step : 3-sew internal faces
// for (std::vector<std::pair<Dart,Dart> >::iterator it = subdividedfacesT.begin(); it != subdividedfacesT.end(); ++it)
// { // {
// Dart f1 = (*it).first; // std::cout << "> 3" << std::endl;
// Dart f2 = (*it).second;
// //
// //map.closeHole(f2);
// //map.sewVolumes(map.phi2(f1),map.phi2(f2));
// istet = false;
// //
// Dart old = map.phi2(map.phi1(*edge));
// Dart dd = map.phi1(old) ;
// map.splitFace(old,dd) ;
// //
// if(map.phi3(map.phi2(f1)) == map.phi2(f1) && map.phi3(map.phi2(f2)) == map.phi2(f2)) // Dart ne = map.phi1(old);
// {
// if(map.getEmbedding(VERTEX, map.phi_1(map.phi2(f2))) == map.getEmbedding(VERTEX, map.phi_1(map.phi2(f1))))
// {
// map.Map3::sewVolumes(map.phi2(f2), map.phi2(f1));
// }
// else
// {
// //
// //id pour toutes les faces interieures // map.cutEdge(ne);
// map.sewVolumes(map.phi2(f2), map.phi2(f1)); // position[map.phi1(ne)] = volCenter; //plonger a la fin de la boucle ????
// 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) ;
// //
// //Fais a la couture !!!!! // newEdges.push_back(map.phi1(dd));
// unsigned int idface = map.getNewFaceId(); //
// map.setFaceId(map.phi2(f1),idface, FACE); // ne = map.phi2(map.phi_1(ne));
// dd = map.phi1(dd);
// } // }
// while(dd != stop);
// }
// else
// {
// //map.closeHole(f2);
// //map.sewVolumes(map.phi2(f1),map.phi2(f2));
//
// unsigned int idface = map.getNewFaceId();
// map.setFaceId(map.phi2(f1),idface, FACE);
// }
}
if(ishex)
{
map.deleteVolume(map.phi3(map.phi2(map.phi1(oldEdges.front()))));
// //
// //Third step : 3-sew internal faces
// for (std::vector<std::pair<Dart,Dart> >::iterator it = subdividedfaces.begin(); it != subdividedfaces.end(); ++it)
// {
// Dart f1 = (*it).first;
// Dart f2 = (*it).second;
// //
// //FAIS a la couture !!!!!!! // //FAIS a la couture !!!!!!!
// //id pour toutes les aretes exterieurs des faces quadrangulees // //id pour toutes les aretes exterieurs des faces quadrangulees
...@@ -802,81 +641,121 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos ...@@ -802,81 +641,121 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos
// mne.markOrbit(EDGE, *it); // mne.markOrbit(EDGE, *it);
// } // }
// } // }
// }
// }
if(!istet)
{
for (std::vector<Dart>::iterator edge = oldEdges.begin(); edge != oldEdges.end(); ++edge)
{
//Dart e = *edge;
Dart x = map.phi_1(map.phi2(map.phi1(*edge)));
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)))));
map.unsewFaces(f3);
map.unsewFaces(tmp);
map.sewFaces(f3, tmp);
unsigned int idface = map.getNewFaceId();
map.setFaceId(map.phi2(f3),idface, FACE);
f = map.phi2(map.phi_1(f));
}while(f != x);
}
}
// { // {
// //Third step : 3-sew internal faces // //Third step : 3-sew internal faces
// for (std::vector<std::pair<Dart,Dart> >::iterator it = subdividedfacesQ.begin(); it != subdividedfacesQ.end(); ++it) // for (std::vector<std::pair<Dart,Dart> >::iterator it = subdividedfacesT.begin(); it != subdividedfacesT.end(); ++it)
// {