Commit 2cb734d8 authored by untereiner's avatar untereiner

new Polyhedra creation functions (createPrism, createPyramid, createDiamond)

parent 26eef763
......@@ -31,7 +31,7 @@ SimpleGMap2::SimpleGMap2()
{
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[myMap.phi1(d)] = VEC3(10,0,15);
position[myMap.phi_1(d)] = VEC3(10,20,15);
......
......@@ -123,7 +123,7 @@ void MyQT::traverseMap()
void MyQT::createMap()
{
Dart d1 = Algo::Modelisation::Polyhedron<PFP>::createTetra(myMap);
Dart d1 = Algo::Modelisation::createTetrahedron<PFP>(myMap);
Dart d2 = d1;
......
......@@ -126,7 +126,7 @@ void MyQT::traverseMap()
void MyQT::createMap()
{
Dart d1 = Algo::Modelisation::Polyhedron<PFP>::createHexa(myMap);
Dart d1 = Algo::Modelisation::createHexahedron<PFP>(myMap);
Dart d2 = d1;
......
......@@ -59,6 +59,8 @@ public:
~ImplicitHierarchicalMap3() ;
void update_topo_shortcuts();
//!
/*!
*
......
......@@ -63,6 +63,16 @@ AttributeHandler_IHM<T> ImplicitHierarchicalMap3::getAttribute(unsigned int orbi
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 *
***************************************************/
......
......@@ -279,39 +279,12 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, typename PFP::TVEC3&
std::vector<Dart> newEdges; //save darts from inner edges
newEdges.reserve(50);
// DartMarker mSplitted(map);
//
// int i = 0;
//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)
{
// 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;
std::vector<Dart> v ;
do
......@@ -323,11 +296,6 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, typename PFP::TVEC3&
}
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) ;
Dart old = map.phi2(map.phi1(*edge));
......@@ -410,10 +378,11 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, typename PFP::TVEC3&
}
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.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);
Dart old = map.volumeOldestDart(d);
......@@ -440,7 +409,7 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos
//Store the edges before the cutEdge
std::vector<Dart> oldEdges;
oldEdges.reserve(512);
oldEdges.reserve(20);
mf.markOrbit(FACE, old) ;
......@@ -476,13 +445,9 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos
/*
* 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);
//type 'q' : quad et plus
//type 't' : tri
std::vector<std::pair<char, std::pair<Dart,Dart> > > subdividedfaces;
//First step : subdivide edges and faces
//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
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)
{
......@@ -511,7 +474,8 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos
Dart e = cf;
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);
}while (e != cf);
}
......@@ -522,7 +486,8 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos
Dart e = cf;
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));
}while (e != cf);
......@@ -530,6 +495,7 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos
}
map.setCurrentLevel(cur);
}
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
std::vector<Dart> newEdges; //save darts from inner edges
newEdges.reserve(50);
bool istet = true;
bool ishex = false;
//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 ;
Dart f1 = map.phi1(*edge);
//Dart f2 = map.phi2(f1);
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(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
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))
// {
// 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));
// //fonction qui calcule le degree max des faces atour d'un sommet
// unsigned int fdeg = map.faceDegree(map.phi2(f1));
//
// Dart cc = c;
// // cut edges
// do
// {
// if(fdeg > 4)
// {
// std::cout << "> 4" << std::endl;
//
// typename PFP::VEC3 p1 = position[cc] ;
// typename PFP::VEC3 p2 = position[map.phi1(cc)] ;
// ishex = true;
//
// 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));
// }while (cc != c);
// map.cutEdge(ne);
// 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
// bool notFinished=true;
// 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);
// Dart stop = map.phi2(map.phi1(ne));
// ne = map.phi2(ne);
// do
// {
// dd = map.phi1(map.phi1(map.phi1(ne)));
//
// //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));
// }
}
}
//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)
// while(dd != stop);
// }
// else if(fdeg > 3)
// {
// Dart f1 = (*it).first;
// Dart f2 = (*it).second;
// std::cout << "> 3" << std::endl;
//
// //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))
// {
// 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
// {
// Dart ne = map.phi1(old);
//
// //id pour toutes les faces interieures
// map.sewVolumes(map.phi2(f2), map.phi2(f1));
// map.cutEdge(ne);
// 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 !!!!!
// unsigned int idface = map.getNewFaceId();
// map.setFaceId(map.phi2(f1),idface, FACE);
// newEdges.push_back(map.phi1(dd));
//
// 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 !!!!!!!
// //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
// 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
// for (std::vector<std::pair<Dart,Dart> >::iterator it = subdividedfacesQ.begin(); it != subdividedfacesQ.end(); ++it)
// {
// Dart f1 = (*it).first;
// Dart f2 = (*it).second;
// //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;
// Dart f2 = (*it).second;
//
// 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));
// //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);
//
// //Fais a la couture !!!!!
// unsigned int idface = map.getNewFaceId();
// map.setFaceId(map.phi2(f1),idface, FACE);
// }
// }
//
// //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<Dart>::iterator it = newEdges.begin() ; it != newEdges.end() ; ++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)
// {
// if(!mne.isMarked(*it))
// {
// if(!mne.isMarked(*it))
// {
// unsigned int idedge = map.getNewEdgeId();
// map.setEdgeId(*it, idedge, EDGE);
// mne.markOrbit(EDGE, *it);
// }
// unsigned int idedge = map.getNewEdgeId();
// map.setEdgeId(*it, idedge, EDGE);
// mne.markOrbit(EDGE, *it);
// }
// }
// }
//
// //cas tordu pour le prisme
// for (std::vector<std::pair<Dart,Dart> >::iterator it = subdividedfacesT.begin(); it != subdividedfacesT.end(); ++it)
// {
// //Third step : 3-sew internal faces
// for (std::vector<std::pair<Dart,Dart> >::iterator it = subdividedfacesQ.begin(); it != subdividedfacesQ.end(); ++it)
// {
// Dart f1 = (*it).first;
// Dart f2 = (*it).second;
//
// 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.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(f1), map.phi2(f2));
//
// //Fais a la couture !!!!!
// unsigned int idface = map.getNewFaceId();
// map.setFaceId(map.phi2(f1),idface, FACE);
// }
//
// 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))))))))))))