Commit abc26d95 authored by untereiner's avatar untereiner
Browse files

bug correction : mr dart duplication in container

parent ab23f706
......@@ -279,20 +279,9 @@ public:
void operator() ()
{
std::cout << "lerp edges" << std::endl;
TraversorE<typename PFP::MAP> trav(m_map) ;
std::cout << "begin = " << m_map.begin() << std::endl;
std::cout << "end = " << m_map.end() << std::endl;
std::cout << "begin = " << trav.begin() << std::endl;
std::cout << "end = " << trav.end() << std::endl;
std::cout << "next = " << trav.next() << std::endl;
for (Dart d = trav.begin(); d != trav.end(); d = trav.next())
{
std::cout << "edges" << std::endl;
typename PFP::VEC3 p = (m_position[d] + m_position[m_map.phi2(d)]) * typename PFP::REAL(0.5);
m_map.incCurrentLevel() ;
......@@ -318,7 +307,6 @@ public:
void operator() ()
{
std::cout << "lerp faces" << std::endl;
TraversorF<typename PFP::MAP> trav(m_map) ;
for (Dart d = trav.begin(); d != trav.end(); d = trav.next())
{
......@@ -349,7 +337,6 @@ public:
void operator() ()
{
std::cout << "lerp volumes" << std::endl;
TraversorW<typename PFP::MAP> trav(m_map) ;
for (Dart d = trav.begin(); d != trav.end(); d = trav.next())
{
......
......@@ -85,7 +85,7 @@ public:
//!
/*
*/
//void addNewLevelHexa(bool embedNewVertices);
void addNewLevelHexa(bool embedNewVertices);
//!
/*
......
......@@ -94,15 +94,12 @@ void Map3MR_PrimalRegular<PFP>::splitSurfaceInVolume(std::vector<Dart>& vd, bool
// embed the vertex embedded from the origin volume to the new darts
if(m_map.template isOrbitEmbedded<VERTEX>())
{
m_map.copyDartEmbedding<VERTEX>(m_map.phi2(dit), m_map.phi1(dit));
m_map.copyDartEmbedding<VERTEX>(m_map.phi2(dit2), m_map.phi1(dit2));
m_map.template copyDartEmbedding<VERTEX>(m_map.phi2(dit), m_map.phi1(dit));
m_map.template copyDartEmbedding<VERTEX>(m_map.phi2(dit2), m_map.phi1(dit2));
}
}
}
//Algo::Modelisation::Tetrahedralization::isTetrahedron<PFP>(m_map, d);
/************************************************************************
* Level creation *
************************************************************************/
......@@ -137,148 +134,147 @@ void Map3MR_PrimalRegular<PFP>::addNewLevelTetraOcta(bool embedNewVertices)
// embedNewCell<VERTEX>(d) ;
// }
std::cout << "cut edge" << std::endl;
m_map.cutEdge(d) ;
travE.skip(d) ;
travE.skip(m_map.phi1(d)) ;
// When importing MR files
if(embedNewVertices)
m_map.template embedNewCell<VERTEX>(m_map.phi1(d)) ;
// if(embedNewVertices)
// m_map.template embedNewCell<VERTEX>(m_map.phi1(d)) ;
}
// //2. split faces - triangular faces
// TraversorF<typename PFP::MAP> travF(m_map) ;
// for (Dart d = travF.begin(); d != travF.end(); d = travF.next())
// {
// Dart old = d ;
// if(m_map.getDartLevel(old) == m_map.getMaxLevel())
// old = m_map.phi1(old) ;
//
// Dart dd = m_map.phi1(old) ;
// Dart e = m_map.phi1(m_map.phi1(dd)) ;
// m_map.splitFace(dd, e) ;
// travF.skip(dd) ;
//
// dd = e ;
// e = m_map.phi1(m_map.phi1(dd)) ;
// m_map.splitFace(dd, e) ;
// travF.skip(dd) ;
//
// dd = e ;
// e = m_map.phi1(m_map.phi1(dd)) ;
// m_map.splitFace(dd, e) ;
// travF.skip(dd) ;
//
// travF.skip(e) ;
// }
//2. split faces - triangular faces
TraversorF<typename PFP::MAP> travF(m_map) ;
for (Dart d = travF.begin(); d != travF.end(); d = travF.next())
{
Dart old = d ;
if(m_map.getDartLevel(old) == m_map.getMaxLevel())
old = m_map.phi1(old) ;
Dart dd = m_map.phi1(old) ;
Dart e = m_map.phi1(m_map.phi1(dd)) ;
m_map.splitFace(dd, e) ;
travF.skip(dd) ;
dd = e ;
e = m_map.phi1(m_map.phi1(dd)) ;
m_map.splitFace(dd, e) ;
travF.skip(dd) ;
dd = e ;
e = m_map.phi1(m_map.phi1(dd)) ;
m_map.splitFace(dd, e) ;
travF.skip(dd) ;
travF.skip(e) ;
}
// //3. create inside volumes
// m_map.setCurrentLevel(m_map.getMaxLevel() - 1) ;
// TraversorW<typename PFP::MAP> traW(m_map);
// for(Dart dit = traW.begin(); dit != traW.end(); dit = traW.next())
// {
// Traversor3WV<typename PFP::MAP> traWV(m_map, dit);
//
// for(Dart ditWV = traWV.begin(); ditWV != traWV.end(); ditWV = traWV.next())
// {
// m_map.setCurrentLevel(m_map.getMaxLevel()) ;
// Dart f1 = m_map.phi1(ditWV);
// Dart e = ditWV;
// std::vector<Dart> v ;
//
// do
// {
// v.push_back(m_map.phi1(e));
// e = m_map.phi2(m_map.phi_1(e));
// }
// while(e != ditWV);
//
// m_map.splitVolume(v) ;
//
// //if is not a tetrahedron
// unsigned int fdeg = m_map.faceDegree(m_map.phi2(f1));
// if(fdeg > 3)
// {
// Dart old = m_map.phi2(m_map.phi1(ditWV));
// Dart dd = m_map.phi1(old) ;
// m_map.splitFace(old,dd) ;
//
// Dart ne = m_map.phi1(old);
//
// m_map.cutEdge(ne);
//
// Dart stop = m_map.phi2(m_map.phi1(ne));
// ne = m_map.phi2(ne);
// do
// {
// dd = m_map.phi1(m_map.phi1(ne));
//
// m_map.splitFace(ne, dd) ;
//
// ne = m_map.phi2(m_map.phi_1(ne));
// dd = m_map.phi1(dd);
// }
// while(dd != stop);
// }
//
// m_map.setCurrentLevel(m_map.getMaxLevel() - 1) ;
// }
// }
//
// m_map.setCurrentLevel(m_map.getMaxLevel() - 1) ;
// for(Dart dit = traW.begin(); dit != traW.end(); dit = traW.next())
// {
// Traversor3WV<typename PFP::MAP> traWV(m_map, dit);
//
// for(Dart ditWV = traWV.begin(); ditWV != traWV.end(); ditWV = traWV.next())
// {
// m_map.setCurrentLevel(m_map.getMaxLevel()) ;
// Dart x = m_map.phi_1(m_map.phi2(m_map.phi1(ditWV)));
//
// if(!Algo::Modelisation::Tetrahedralization::isTetrahedron<PFP>(m_map,x))
// {
// DartMarkerStore me(m_map);
//
// Dart f = x;
//
// do
// {
// Dart f3 = m_map.phi3(f);
//
// if(!me.isMarked(f3))
// {
// Dart tmp = m_map.phi_1(m_map.phi2(m_map.phi_1(m_map.phi2(m_map.phi_1(f3))))); //future voisin par phi2
//
// Dart f32 = m_map.phi2(f3);
// swapEdges(f3, tmp);
//
// me.markOrbit<EDGE>(f3);
// me.markOrbit<EDGE>(f32);
// }
//
// f = m_map.phi2(m_map.phi_1(f));
// }while(f != x);
//
// // When importing MR files
// if(embedNewVertices)
// m_map.template embedNewCell<VERTEX>(x) ;
// }
// m_map.setCurrentLevel(m_map.getMaxLevel() - 1) ;
// }
// }
//3. create inside volumes
m_map.setCurrentLevel(m_map.getMaxLevel() - 1) ;
TraversorW<typename PFP::MAP> traW(m_map);
for(Dart dit = traW.begin(); dit != traW.end(); dit = traW.next())
{
Traversor3WV<typename PFP::MAP> traWV(m_map, dit);
for(Dart ditWV = traWV.begin(); ditWV != traWV.end(); ditWV = traWV.next())
{
m_map.setCurrentLevel(m_map.getMaxLevel()) ;
Dart f1 = m_map.phi1(ditWV);
Dart e = ditWV;
std::vector<Dart> v ;
do
{
v.push_back(m_map.phi1(e));
e = m_map.phi2(m_map.phi_1(e));
}
while(e != ditWV);
m_map.splitVolume(v) ;
//if is not a tetrahedron
unsigned int fdeg = m_map.faceDegree(m_map.phi2(f1));
if(fdeg > 3)
{
Dart old = m_map.phi2(m_map.phi1(ditWV));
Dart dd = m_map.phi1(old) ;
m_map.splitFace(old,dd) ;
Dart ne = m_map.phi1(old);
m_map.cutEdge(ne);
Dart stop = m_map.phi2(m_map.phi1(ne));
ne = m_map.phi2(ne);
do
{
dd = m_map.phi1(m_map.phi1(ne));
m_map.splitFace(ne, dd) ;
ne = m_map.phi2(m_map.phi_1(ne));
dd = m_map.phi1(dd);
}
while(dd != stop);
}
m_map.setCurrentLevel(m_map.getMaxLevel() - 1) ;
}
}
m_map.setCurrentLevel(m_map.getMaxLevel() - 1) ;
for(Dart dit = traW.begin(); dit != traW.end(); dit = traW.next())
{
Traversor3WV<typename PFP::MAP> traWV(m_map, dit);
for(Dart ditWV = traWV.begin(); ditWV != traWV.end(); ditWV = traWV.next())
{
m_map.setCurrentLevel(m_map.getMaxLevel()) ;
Dart x = m_map.phi_1(m_map.phi2(m_map.phi1(ditWV)));
if(!Algo::Modelisation::Tetrahedralization::isTetrahedron<PFP>(m_map,x))
{
DartMarkerStore me(m_map);
Dart f = x;
do
{
Dart f3 = m_map.phi3(f);
if(!me.isMarked(f3))
{
Dart tmp = m_map.phi_1(m_map.phi2(m_map.phi_1(m_map.phi2(m_map.phi_1(f3))))); //future voisin par phi2
Dart f32 = m_map.phi2(f3);
swapEdges(f3, tmp);
me.markOrbit<EDGE>(f3);
me.markOrbit<EDGE>(f32);
}
f = m_map.phi2(m_map.phi_1(f));
}while(f != x);
// When importing MR files
//if(embedNewVertices)
// m_map.template embedNewCell<VERTEX>(x) ;
}
m_map.setCurrentLevel(m_map.getMaxLevel() - 1) ;
}
}
m_map.popLevel() ;
}
//void Map3MR_PrimalRegular::addNewLevelHexa(bool embedNewVertices)
//{
// pushLevel();
//
// addLevel();
// setCurrentLevel(getMaxLevel());
//
template <typename PFP>
void Map3MR_PrimalRegular<PFP>::addNewLevelHexa(bool embedNewVertices)
{
m_map.pushLevel();
m_map.addLevel();
m_map.setCurrentLevel(m_map.getMaxLevel());
// if(!shareVertexEmbeddings)
// {
// //create the new level with the old one
......@@ -288,12 +284,12 @@ void Map3MR_PrimalRegular<PFP>::addNewLevelTetraOcta(bool embedNewVertices)
// (*m_embeddings[VERTEX])[index] = EMBNULL ; // set vertex embedding to EMBNULL if no sharing
// }
// }
//
// //subdivision
// //1. cut edges
// TraversorE<Map3MR_PrimalRegular> travE(*this);
// for (Dart d = travE.begin(); d != travE.end(); d = travE.next())
// {
//subdivision
//1. cut edges
TraversorE<typename PFP::MAP> travE(m_map);
for (Dart d = travE.begin(); d != travE.end(); d = travE.next())
{
// if(!shareVertexEmbeddings)
// {
// if(getEmbedding<VERTEX>(d) == EMBNULL)
......@@ -301,140 +297,140 @@ void Map3MR_PrimalRegular<PFP>::addNewLevelTetraOcta(bool embedNewVertices)
// if(getEmbedding<VERTEX>(phi1(d)) == EMBNULL)
// embedNewCell<VERTEX>(phi1(d)) ;
// }
//
// cutEdge(d) ;
// travE.skip(d) ;
// travE.skip(phi1(d)) ;
//
//// When importing MR files : activated for DEBUG
m_map.cutEdge(d) ;
travE.skip(d) ;
travE.skip(m_map.phi1(d)) ;
// When importing MR files : activated for DEBUG
// if(embedNewVertices)
// embedNewCell<VERTEX>(phi1(d)) ;
// }
//
//// //2. split faces - quadrangule faces
//// TraversorF<Map3MR_PrimalRegular> travF(*this) ;
//// for (Dart d = travF.begin(); d != travF.end(); d = travF.next())
//// {
//// Dart old = d;
//// if(getDartLevel(old) == getMaxLevel())
//// old = phi1(old) ;
////
//// Dart dd = phi1(old) ;
//// Dart next = phi1(phi1(dd)) ;
//// splitFace(dd, next) ; // insert a first edge
////
//// Dart ne = phi2(phi_1(dd)) ;
//// cutEdge(ne) ; // cut the new edge to insert the central vertex
//// travF.skip(dd) ;
////
////// When importing MR files : activated for DEBUG
//// if(embedNewVertices)
//// embedNewCell<VERTEX>(phi1(ne)) ;
////
//// dd = phi1(phi1(next)) ;
//// while(dd != ne) // turn around the face and insert new edges
//// { // linked to the central vertex
//// Dart tmp = phi1(ne) ;
//// splitFace(tmp, dd) ;
//// travF.skip(tmp) ;
//// dd = phi1(phi1(dd)) ;
//// }
//// travF.skip(ne) ;
//// }
//
//// //3. create inside volumes
//// setCurrentLevel(getMaxLevel() - 1) ;
//// TraversorW<Map3MR_PrimalRegular> traW(*this);
//// for(Dart dit = traW.begin(); dit != traW.end(); dit = traW.next())
//// {
//// std::vector<std::pair<Dart, Dart> > subdividedFaces;
//// subdividedFaces.reserve(64);
//// Dart centralDart = NIL;
////
//// Traversor3WV<Map3MR_PrimalRegular> traWV(*this, dit);
//// for(Dart ditWV = traWV.begin(); ditWV != traWV.end(); ditWV = traWV.next())
//// {
//// setCurrentLevel(getMaxLevel()) ; //Utile ?
////
//// Dart e = ditWV;
//// std::vector<Dart> v ;
////
//// do
//// {
//// v.push_back(phi1(e));
//// v.push_back(phi1(phi1(e)));
////
//// if(!Map2::isBoundaryEdge(phi1(e)))
//// subdividedFaces.push_back(std::pair<Dart,Dart>(phi1(e),phi2(phi1(e))));
////
//// if(!Map2::isBoundaryEdge(phi1(phi1(e))))
//// subdividedFaces.push_back(std::pair<Dart,Dart>(phi1(phi1(e)),phi2(phi1(phi1(e)))));
////
//// e = phi2(phi_1(e));
//// }
//// while(e != ditWV);
////
//// splitSurfaceInVolume(v);
////
//// Dart dd = phi2(phi1(ditWV));
//// Dart next = phi1(phi1(dd)) ;
//// Map2::splitFace(dd, next) ;
////
//// Dart ne = phi2(phi_1(dd));
//// Map2::cutEdge(ne) ;
//// centralDart = phi1(ne);
////
//// dd = phi1(phi1(next)) ;
//// while(dd != ne)
//// {
//// Dart tmp = phi1(ne) ;
//// Map2::splitFace(tmp, dd) ;
//// dd = phi1(phi1(dd)) ;
//// }
////
//// setCurrentLevel(getMaxLevel() - 1) ; //Utile ?
//// }
////
//// setCurrentLevel(getMaxLevel()) ;
//// //4 couture des relations precedemment sauvegarde
//// for (std::vector<std::pair<Dart,Dart> >::iterator it = subdividedFaces.begin(); it != subdividedFaces.end(); ++it)
//// {
//// Dart f1 = phi2((*it).first);
//// Dart f2 = phi2((*it).second);
////
//// //if(isBoundaryFace(f1) && isBoundaryFace(f2))
//// if(phi3(f1) == f1 && phi3(f2) == f2)
//// sewVolumes(f1, f2, false);
//// }
//// embedOrbit<VERTEX>(centralDart, getEmbedding<VERTEX>(centralDart));
////
//// setCurrentLevel(getMaxLevel() - 1) ;
//// }
//
//// //A optimiser
//// setCurrentLevel(getMaxLevel()-1) ;
//// TraversorE<Map3MR_PrimalRegular> travE2(*this);
//// for (Dart d = travE2.begin(); d != travE2.end(); d = travE2.next())
//// {
//// setCurrentLevel(getMaxLevel()) ;
//// embedOrbit<VERTEX>(phi1(d), getEmbedding<VERTEX>(phi1(d)));
//// setCurrentLevel(getMaxLevel()-1) ;
//// }
//// setCurrentLevel(getMaxLevel()) ;
////
//// setCurrentLevel(getMaxLevel()-1) ;
//// TraversorF<Map3MR_PrimalRegular> travF2(*this) ;
//// for (Dart d = travF2.begin(); d != travF2.end(); d = travF2.next())
//// {
//// setCurrentLevel(getMaxLevel()) ;
//// embedOrbit<VERTEX>(phi2(phi1(d)), getEmbedding<VERTEX>(phi2(phi1(d))));
//// setCurrentLevel(getMaxLevel()-1) ;
//// }
//// setCurrentLevel(getMaxLevel()) ;
//
// popLevel() ;
//}
//
}
//2. split faces - quadrangule faces
TraversorF<typename PFP::MAP> travF(m_map) ;
for (Dart d = travF.begin(); d != travF.end(); d = travF.next())
{
Dart old = d;
if(m_map.getDartLevel(old) == m_map.getMaxLevel())
old = m_map.phi1(old) ;
Dart dd = m_map.phi1(old) ;
Dart next = m_map.phi1(m_map.phi1(dd)) ;
m_map.splitFace(dd, next) ; // insert a first edge
Dart ne = m_map.phi2(m_map.phi_1(dd)) ;
m_map.cutEdge(ne) ; // cut the new edge to insert the central vertex
travF.skip(dd) ;
// When importing MR files : activated for DEBUG
// if(embedNewVertices)
// embedNewCell<VERTEX>(phi1(ne)) ;
dd = m_map.phi1(m_map.phi1(next)) ;
while(dd != ne) // turn around the face and insert new edges
{ // linked to the central vertex
Dart tmp = m_map.phi1(ne) ;
m_map.splitFace(tmp, dd) ;
travF.skip(tmp) ;
dd = m_map.phi1(m_map.phi1(dd)) ;
}
travF.skip(ne) ;
}
//3. create inside volumes
m_map.setCurrentLevel(m_map.getMaxLevel() - 1) ;
TraversorW<typename PFP::MAP> traW(m_map);
for(Dart dit = traW.begin(); dit != traW.end(); dit = traW.next())
{
std::vector<std::pair<Dart, Dart> > subdividedFaces;
subdividedFaces.reserve(64);
Dart centralDart = NIL;
Traversor3WV<typename PFP::MAP> traWV(m_map, dit);
for(Dart ditWV = traWV.begin(); ditWV != traWV.end(); ditWV = traWV.next())
{
m_map.setCurrentLevel(m_map.getMaxLevel()) ; //Utile ?
Dart e = ditWV;
std::vector<Dart> v ;
do
{
v.push_back(m_map.phi1(e));
v.push_back(m_map.phi1(m_map.phi1(e)));
if(!m_map.PFP::MAP::ParentMap::isBoundaryEdge(m_map.phi1(e)))
subdividedFaces.push_back(std::pair<Dart,Dart>(m_map.phi1(e),m_map.phi2(m_map.phi1(e))));
if(!m_map.PFP::MAP::ParentMap::isBoundaryEdge(m_map.phi1(m_map.phi1(e))))
subdividedFaces.push_back(std::pair<Dart,Dart>(m_map.phi1(m_map.phi1(e)),m_map.phi2(m_map.phi1(m_map.phi1(e)))));
e = m_map.phi2(m_map.phi_1(e));
}
while(e != ditWV);
splitSurfaceInVolume(v);
Dart dd = m_map.phi2(m_map.phi1(ditWV));
Dart next = m_map.phi1(m_map.phi1(dd)) ;
m_map.PFP::MAP::ParentMap::splitFace(dd, next) ;
Dart ne = m_map.phi2(m_map.phi_1(dd));
m_map.PFP::MAP::ParentMap::cutEdge(ne) ;
centralDart = m_map.phi1(ne);
dd = m_map.phi1(m_map.phi1(next)) ;
while(dd != ne)
{
Dart tmp = m_map.phi1(ne) ;
m_map.PFP::MAP::ParentMap::splitFace(tmp, dd) ;
dd = m_map.phi1(m_map.phi1(dd)) ;
}