Commit 83519b95 authored by Kenneth Vanhoey's avatar Kenneth Vanhoey

Merge branch 'master' of cgogn:~cgogn/CGoGN

parents 88439528 fd210c16
......@@ -254,6 +254,11 @@ public:
*/
bool edgeCanBeCoarsened(Dart d);
/**
*
*/
bool faceCanBeCoarsened(Dart d);
/**
*
*/
......
......@@ -527,119 +527,119 @@ Dart subdivideVolumeGen(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& pos
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;
// Dart f2 = (*it).second;
//
//
//
// 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
// {
//
// //id pour toutes les faces interieures
// map.sewVolumes(map.phi2(f2), map.phi2(f1));
//
//
// }
//
// //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)
// {
// if(!mne.isMarked(*it))
// {
// unsigned int idedge = map.getNewEdgeId();
// map.setEdgeId(*it, idedge, EDGE);
// mne.markOrbit(EDGE,*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.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 !!!!!
// 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)
// {
// if(!mne.isMarked(*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)
// {
// 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.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))))))))))))
// )
// {
// map.sewVolumes(map.phi2(map.phi1(map.phi1(map.phi2(f1)))),
// map.phi2(map.phi3(map.phi2(map.phi3(map.phi2(map.phi3(map.phi1(map.phi1(map.phi2(f1))))))))));
// }
//
// }
//
// }
{
//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))
{
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.sewVolumes(map.phi2(f2), map.phi2(f1));
}
//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)
{
if(!mne.isMarked(*it))
{
unsigned int idedge = map.getNewEdgeId();
map.setEdgeId(*it, idedge, EDGE);
mne.markOrbit(EDGE,*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.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 !!!!!
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)
{
if(!mne.isMarked(*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)
{
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.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))))))))))))
)
{
map.sewVolumes(map.phi2(map.phi1(map.phi1(map.phi2(f1)))),
map.phi2(map.phi3(map.phi2(map.phi3(map.phi2(map.phi3(map.phi1(map.phi1(map.phi2(f1))))))))));
}
}
}
map.setCurrentLevel(cur) ;
......@@ -748,7 +748,7 @@ Dart subdivideVolume(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& positi
//test si la face est triangulaire ou non
if(map.phi1(map.phi1(map.phi1(d))) == d)
{
std::cout << "trian" << std::endl;
//std::cout << "trian" << std::endl;
Dart cf = map.phi2(map.phi1(d));
Dart e = cf;
do
......@@ -759,7 +759,7 @@ Dart subdivideVolume(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& positi
}
else
{
std::cout << "quad" << std::endl;
//std::cout << "quad" << std::endl;
Dart cf = map.phi1(d);
Dart e = cf;
do
......@@ -1457,11 +1457,13 @@ void coarsenFace(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position)
map.setCurrentLevel(cur) ;
}
// fit = d ;
// do
// {
// if(map.edgeCanBeCoarsened(fit))
// coarsenEdge<PFP>(map, fit, position) ;
//
// fit = map.phi1(fit) ;
// } while(fit != d) ;
}
......@@ -1484,7 +1486,7 @@ void coarsenVolume(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position
//Store faces that are traversed and start with the face of d
std::vector<Dart> visitedFaces;
visitedFaces.reserve(20);
visitedFaces.reserve(512);
visitedFaces.push_back(d);
mf.markOrbit(FACE, d) ;
......@@ -1519,16 +1521,15 @@ void coarsenVolume(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position
*/
for(std::vector<Dart>::iterator face = visitedFaces.begin(); face != visitedFaces.end(); ++face)
{
Dart d = *face;
Dart fit = *face;
if(map.faceIsSubdividedOnce(d))
if(map.faceCanBeCoarsened(fit))
{
std::cout << "once : " << d << std::endl;
coarsenFace<PFP>(map, d, position);
Algo::IHM::coarsenFace<PFP>(map, fit, position);
}
}
map.setCurrentLevel(cur) ;
//map.setCurrentLevel(cur) ;
/*
* simplifier les aretes
......@@ -1539,18 +1540,13 @@ void coarsenVolume(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position
do
{
if(map.edgeCanBeCoarsened(fit))
{
std::cout << "edge coarsened = " << fit << std::endl;
}
//coarsenEdge<PFP>(map, fit, position) ;
std::cout << "boucle = " << fit << std::endl;
Algo::IHM::coarsenEdge<PFP>(map, fit, position) ;
fit = map.phi1(fit) ;
} while(fit != *face) ;
}
std::cout << "end" << std::endl;
map.setCurrentLevel(cur) ;
// map.setCurrentLevel(cur) ;
}
/***********************************************************************************
......
......@@ -316,45 +316,45 @@ void EmbeddedMap2<MAP2>::sewFaces(Dart d, Dart e)
template <typename MAP2>
void EmbeddedMap2<MAP2>::unsewFaces(Dart d)
{
bool boundaryD = false ;
bool boundaryE = false ;
if (MAP2::isOrbitEmbedded(VERTEX))
{
if(MAP2::isBoundaryVertex(d))
boundaryD = true ;
if(MAP2::isBoundaryVertex(MAP2::phi1(d)))
boundaryE = true ;
}
Dart e = MAP2::phi2(d) ;
// bool boundaryD = false ;
// bool boundaryE = false ;
// if (MAP2::isOrbitEmbedded(VERTEX))
// {
// if(MAP2::isBoundaryVertex(d))
// boundaryD = true ;
// if(MAP2::isBoundaryVertex(MAP2::phi1(d)))
// boundaryE = true ;
// }
//
// Dart e = MAP2::phi2(d) ;
MAP2::unsewFaces(d) ;
if (MAP2::isOrbitEmbedded(VERTEX))
{
if(boundaryD)
{
if(e != d)
{
Dart ee = MAP2::phi1(e) ;
MAP2::embedNewCell(VERTEX, ee) ;
MAP2::copyCell(VERTEX, ee, d) ;
}
}
if(boundaryE)
{
if(e != d)
{
MAP2::embedNewCell(VERTEX, e) ;
MAP2::copyCell(VERTEX, e, MAP2::phi1(d)) ;
}
}
}
if (MAP2::isOrbitEmbedded(EDGE))
{
MAP2::embedNewCell(EDGE, e) ;
MAP2::copyCell(EDGE, e, d) ;
}
// if (MAP2::isOrbitEmbedded(VERTEX))
// {
// if(boundaryD)
// {
// if(e != d)
// {
// Dart ee = MAP2::phi1(e) ;
// MAP2::embedNewCell(VERTEX, ee) ;
// MAP2::copyCell(VERTEX, ee, d) ;
// }
// }
//
// if(boundaryE)
// {
// if(e != d)
// {
// MAP2::embedNewCell(VERTEX, e) ;
// MAP2::copyCell(VERTEX, e, MAP2::phi1(d)) ;
// }
// }
// }
// if (MAP2::isOrbitEmbedded(EDGE))
// {
// MAP2::embedNewCell(EDGE, e) ;
// MAP2::copyCell(EDGE, e, d) ;
// }
}
template <typename MAP2>
......
......@@ -68,37 +68,37 @@ void EmbeddedMap3<MAP3>::sewVolumes(Dart d, Dart e)
template <typename MAP3>
void EmbeddedMap3<MAP3>::unsewVolumes(Dart d)
{
Dart d3 = MAP3::phi3(d);
bool boundaryD = false;
bool boundaryE = false;
if(MAP3::isOrbitEmbedded(VERTEX))
{
if(MAP3::isBoundaryVertex(d))
boundaryD = true;
if(MAP3::isBoundaryVertex(MAP3::phi1(d)))
boundaryE = true;
}
// Dart d3 = MAP3::phi3(d);
//
// bool boundaryD = false;
// bool boundaryE = false;
//
// if(MAP3::isOrbitEmbedded(VERTEX))
// {
// if(MAP3::isBoundaryVertex(d))
// boundaryD = true;
// if(MAP3::isBoundaryVertex(MAP3::phi1(d)))
// boundaryE = true;
// }
//
MAP3::unsewVolumes(d);
Dart dd = d;
Dart dd3 = d3;
do
{
if(MAP3::isOrbitEmbedded(VERTEX))
MAP3::copyCell(VERTEX, dd3, MAP3::phi1(dd));
if(MAP3::isOrbitEmbedded(EDGE))
if(MAP3::isOrbitEmbedded(FACE))
dd = MAP3::phi1(dd) ;
}while( dd != d );
//
// Dart dd = d;
// Dart dd3 = d3;
//
// do
// {
// if(MAP3::isOrbitEmbedded(VERTEX))
// MAP3::copyCell(VERTEX, dd3, MAP3::phi1(dd));
//
// if(MAP3::isOrbitEmbedded(EDGE))
//
//
// if(MAP3::isOrbitEmbedded(FACE))
//
//
// dd = MAP3::phi1(dd) ;
// }while( dd != d );
}
......@@ -168,34 +168,52 @@ void EmbeddedMap3<MAP3>::splitFace(Dart d, Dart e)
template <typename MAP3>
void EmbeddedMap3<MAP3>::cutEdge(Dart d)
{
MAP3::cutEdge(d);
if(MAP3::isOrbitEmbedded(EDGE))
{
Dart nd = MAP3::phi1(d) ;
MAP3::embedNewCell(EDGE, nd) ;
MAP3::copyCell(EDGE, nd, d) ;
unsigned int vEmb = MAP3::getEmbedding(EDGE, d);
MAP3::embedOrbit(EDGE, d, vEmb) ;
}
if(MAP3::isOrbitEmbedded(FACE))
{
Dart f = d;
do
{
Dart nd = MAP3::phi1(f) ;
MAP3::copyDartEmbedding(FACE, nd, f);
Dart f2 = MAP3::phi2(nd);
if(f2!=nd)
{
Dart nd2 = MAP3::phi2(f);
MAP3::copyDartEmbedding(FACE, nd2, f2);
}
f = MAP3::alpha2(f);
} while(f != d);
}
if(MAP3::isOrbitEmbedded(VOLUME))
{
Dart demb = d;
if(MAP3::phi3(demb) == demb)
demb = MAP3::phi2(demb);
Dart f = demb;
Dart f = d;
do
{
MAP3::copyDartEmbedding(VOLUME, MAP3::phi1(f), f);
MAP3::copyDartEmbedding(VOLUME, MAP3::phi2(f), MAP3::phi2(MAP3::phi1(f)));
Dart nd = MAP3::phi1(f) ;
MAP3::copyDartEmbedding(VOLUME, nd, f);
Dart nd2 = MAP3::phi2(f);
if(f!=nd2)
MAP3::copyDartEmbedding(VOLUME, nd2, f);
f = MAP3::alpha2(f);
}
while(f != demb);
} while(f != d);
}
}
......
......@@ -236,6 +236,20 @@ public:
*/
void insertTrianglePair(Dart d, Dart v1, Dart v2) ;
/**
* Unsew opposite edges from the faces around a vertex
* \warning Darts may have
* @param d a dart from the vertex
*/
void unsewAroundVertex(Dart d) ;
/**
* Unsex the Umbrella aroud a vertex, close the hole and then
* create a symetric to construct a polyedron
* @param d a dart from the vertex
*/
void explodPolyhedron(Dart d);
//! Merge two volumes along two faces.
/*! Works only if the two faces have the same number of edges.
* The faces adjacent to the two given faces are pairwise phi2-linked
......
......@@ -230,7 +230,6 @@ public:
*/
virtual Dart cutSpike(Dart d);
//!
/*
*
......
......@@ -172,7 +172,6 @@ unsigned int ImplicitHierarchicalMap3::volumeLevel(Dart d)
{
assert(m_dartLevel[d] <= m_curLevel || !"Access to a dart introduced after current level") ;
if(m_curLevel == 0)
return 0 ;
......@@ -182,7 +181,7 @@ unsigned int ImplicitHierarchicalMap3::volumeLevel(Dart d)
DartMarkerStore mark(*this); // Lock a marker
std::vector<Dart> visitedFaces; // Faces that are traversed
visitedFaces.reserve(16);
visitedFaces.reserve(512);
visitedFaces.push_back(d); // Start with the face of d
std::vector<Dart>::iterator face;
......@@ -383,6 +382,7 @@ bool ImplicitHierarchicalMap3::faceIsSubdivided(Dart d)
if(m_dartLevel[phi1(d)] == m_curLevel && m_edgeId[phi1(d)] != m_edgeId[d])
subd = true ;
--m_curLevel ;
return subd ;
}
......@@ -403,7 +403,7 @@ bool ImplicitHierarchicalMap3::volumeIsSubdivided(Dart d)
Dart old = d ;
bool facesAreSubdivided = false;
bool facesAreSubdivided = faceIsSubdivided(d) ;
//parcours les faces du volume au niveau courant
//on cherche le brin de niveau le plus bas de la hierarchie
......@@ -419,7 +419,6 @@ bool ImplicitHierarchicalMap3::volumeIsSubdivided(Dart d)
facesAreSubdivided &= faceIsSubdivided(e) ;
do // add all face neighbours to the table
{
Dart ee = phi2(e) ;
......@@ -442,7 +441,7 @@ bool ImplicitHierarchicalMap3::volumeIsSubdivided(Dart d)
}
bool ImplicitHierarchicalMap3::edgeCanBeCoarsened(Dart d)
bool ImplicitHierarchicalMap3::edgeCanBeCoarsened(Dart d)
{
assert(m_dartLevel[d] <= m_curLevel || !"Access to a dart introduced after current level") ;
......@@ -467,6 +466,49 @@ bool ImplicitHierarchicalMap3::edgeCanBeCoarsened(Dart d)
return subd && degree2 && subdOnce ;
}
bool ImplicitHierarchicalMap3::faceCanBeCoarsened(Dart d)
{
assert(m_dartLevel[d] <= m_curLevel || !"Access to a dart introduced after current level") ;
bool subd = false;
bool subdOnce = true;
bool subdNeighborhood = false; //deux volumes voisins de la face ne sont pas subdivise
if(faceIsSubdivided(d))
{
subd = true;
Dart d3 = phi3(d);
std::cout << "d3 = " << d3 << std::endl;
std::cout << "d = " << d << std::endl;
std::cout << "curLevel = " << m_curLevel << std::endl;
std::cout << "volSubd(d3) = " << volumeIsSubdivided(d3) << std::endl;
//tester si le volume voisin est subdivise