Commit 9b062c52 authored by untereiner's avatar untereiner

qq changements dans map3

parent 1b8843c3
......@@ -64,6 +64,10 @@ template <typename PFP>
Dart subdivideVolumeClassic2(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position);
template <typename PFP>
void subdivideLoop(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position);
/***********************************************************************************
* Simplification *
***********************************************************************************/
......
......@@ -82,19 +82,22 @@ void subdivideFace(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position
unsigned int cur = map.getCurrentLevel() ;
map.setCurrentLevel(fLevel) ; // go to the level of the face to subdivide its edges
unsigned int degree = 0 ;
typename PFP::VEC3 p ;
Dart it = old ;
do
Traversor2FE<typename PFP::MAP> travE(map, old);
for(Dart it = travE.begin(); it != travE.end() ; it = travE.next())
{
++degree;
p += position[it] ;
if(!map.edgeIsSubdivided(it)) // first cut the edges (if they are not already)
Algo::IHM::subdivideEdge<PFP>(map, it, position) ; // and compute the degree of the face
it = map.phi1(it) ;
} while(it != old) ;
}
p /= typename PFP::REAL(degree) ;
map.setCurrentLevel(fLevel + 1) ; // go to the next level to perform face subdivision
Dart res;
......@@ -395,6 +398,8 @@ Dart subdivideVolumeClassic2(typename PFP::MAP& map, Dart d, typename PFP::TVEC3
*/
typename PFP::VEC3 volCenter = Algo::Geometry::volumeCentroid<PFP>(map, old, position);
Traversor3WV<typename PFP::MAP> traV(map, old);
/*
* Subdivide Faces
*/
......@@ -411,46 +416,62 @@ Dart subdivideVolumeClassic2(typename PFP::MAP& map, Dart d, typename PFP::TVEC3
//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
unsigned int fLevel = map.faceLevel(dit) + 1; //puisque dans tous les cas, la face est subdivisee
map.setCurrentLevel(fLevel) ;
//le brin est forcement du niveau cur
Dart cf = map.phi1(d);
Dart cf = map.phi2(map.phi1(dit));
Dart e = cf;
do
{
subdividedfaces.push_back(std::pair<Dart,Dart>(e,map.phi2(e)));
e = map.phi2(map.phi1(e));
e = map.phi2(map.phi_1(e));
}while (e != cf);
map.setCurrentLevel(cur);
}
unsigned int fLevel = map.faceLevel(old) + 1; //puisque dans tous les cas, la face est subdivisee
map.setCurrentLevel(fLevel) ;
for (std::vector<std::pair<Dart,Dart> >::iterator it = subdividedfaces.begin(); it != subdividedfaces.end(); ++it)
{
Dart f1 = (*it).first;
if(!map.Map2::isBoundaryEdge(f1))
{
Dart f2 = map.phi2(f1);
map.unsewFaces(f1);
map.copyDartEmbedding(VERTEX, map.phi2(f2), f1);
map.copyDartEmbedding(VERTEX, map.phi2(f1), f2);
}
}
map.setCurrentLevel(cur);
/*
* Create inside volumes
*/
std::vector<Dart> newEdges; //save darts from inner edges
newEdges.reserve(50);
Dart centralDart = NIL;
Traversor3WV<typename PFP::MAP> traV(map, old);
map.setCurrentLevel(vLevel + 1) ; // go to the next level to perform volume subdivision
for(Dart dit = traV.begin(); dit != traV.end(); dit = traV.next())
{
Dart e = dit;
std::vector<Dart> v ;
do
{
v.push_back(map.phi1(map.phi1(e)));
v.push_back(map.phi1(e));
//unsigned int degree = 0 ;
//typename PFP::VEC3 volCenter ;
e = map.phi2(map.phi_1(e));
}
while(e != dit);
map.setCurrentLevel(vLevel + 1) ; // go to the next level to perform volume subdivision
map.splitVolume(v) ;
for(Dart dit = traV.begin(); dit != traV.end(); dit = traV.next())
{
//volCenter += position[d];
//++degree;
Dart old = map.phi2(map.phi1(dit));
map.Map2::fillHole(old);
Dart dd = map.phi1(map.phi1(old)) ;
map.splitFace(old,dd) ;
......@@ -461,9 +482,9 @@ Dart subdivideVolumeClassic2(typename PFP::MAP& map, Dart d, typename PFP::TVEC3
map.cutEdge(ne);
centralDart = map.phi1(ne);
position[centralDart] = volCenter;
newEdges.push_back(ne);
newEdges.push_back(map.phi1(ne));
position[centralDart] = volCenter;
unsigned int id = map.getNewEdgeId() ;
map.setEdgeId(ne, id, EDGE) ;
......@@ -488,6 +509,20 @@ Dart subdivideVolumeClassic2(typename PFP::MAP& map, Dart d, typename PFP::TVEC3
}
for (std::vector<std::pair<Dart,Dart> >::iterator it = subdividedfaces.begin(); it != subdividedfaces.end(); ++it)
{
Dart f1 = (*it).first;
Dart f2 = (*it).second;
if(map.isBoundaryFace(map.phi2(f1)) && map.isBoundaryFace(map.phi2(f2)))
{
map.sewVolumes(map.phi2(f1), map.phi2(f2));
}
}
//volCenter /= double(degree);
// //Third step : 3-sew internal faces
// for (std::vector<std::pair<Dart,Dart> >::iterator it = subdividedfaces.begin(); it != subdividedfaces.end(); ++it)
// {
......@@ -536,6 +571,194 @@ Dart subdivideVolumeClassic2(typename PFP::MAP& map, Dart d, typename PFP::TVEC3
}
template <typename PFP>
void subdivideLoop(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.isBoundaryMarked(d) || !"Trying to subdivide a dart marked boundary");
unsigned int vLevel = map.volumeLevel(d);
Dart old = map.volumeOldestDart(d);
unsigned int cur = map.getCurrentLevel();
map.setCurrentLevel(vLevel);
/*
* Compute volume centroid
*/
typename PFP::VEC3 volCenter = Algo::Geometry::volumeCentroid<PFP>(map, old, position);
/*
* Subdivide Faces
*/
std::vector<std::pair<Dart,Dart> > subdividedfaces;
subdividedfaces.reserve(25);
Traversor3WF<typename PFP::MAP> traF(map, old);
for(Dart dit = traF.begin(); dit != traF.end(); dit = traF.next())
{
//if needed subdivide face
if(!map.faceIsSubdivided(dit))
Algo::IHM::subdivideFace<PFP>(map, dit, position, Algo::IHM::S_TRI);
//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) ;
//le brin est forcement du niveau cur
Dart cf = map.phi1(d);
Dart e = cf;
do
{
subdividedfaces.push_back(std::pair<Dart,Dart>(e,map.phi2(e)));
e = map.phi2(map.phi1(e));
}while (e != cf);
map.setCurrentLevel(cur);
}
/*
* Create inside volumes
*/
std::vector<Dart> newEdges; //save darts from inner edges
newEdges.reserve(50);
Dart centralDart = NIL;
//unsigned int degree = 0 ;
//typename PFP::VEC3 volCenter ;
Traversor3WV<typename PFP::MAP> traV(map, old);
bool isNotTet = false;
map.setCurrentLevel(vLevel + 1) ; // go to the next level to perform volume subdivision
for(Dart dit = traV.begin(); dit != traV.end(); dit = traV.next())
{
//volCenter += position[d];
//++degree;
Dart e = dit;
std::vector<Dart> v ;
do
{
v.push_back(map.phi1(e));
e = map.phi2(map.phi_1(e));
}
while(e != dit);
map.splitVolume(v) ;
//if is not a tetrahedron
unsigned int vdeg = map.vertexDegree(dit);
if(vdeg > 3)
{
isNotTet = true;
Dart old = map.phi2(map.phi1(dit));
Dart dd = map.phi1(old) ;
map.splitFace(old,dd) ;
Dart ne = map.phi1(old);
map.cutEdge(ne);
position[map.phi1(ne)] = volCenter; //plonger a la fin de la boucle ????
centralDart = map.phi1(ne);
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) ;
newEdges.push_back(map.phi1(dd));
ne = map.phi2(map.phi_1(ne));
dd = map.phi1(dd);
}
while(dd != stop);
}
// else
// {
// unsigned int idface = map.getNewFaceId();
// map.setFaceId(map.phi2(f1),idface, FACE);
// }
}
//switch inner faces
if(isNotTet)
{
unsigned int i = 0;
for(Dart dit = traV.begin(); dit != traV.end(); dit = traV.next())
{
Dart x = map.phi_1(map.phi2(map.phi1(dit)));
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))))); //future voisin par phi2
map.unsewFaces(f3);
map.unsewFaces(tmp);
map.sewFaces(f3, tmp, false);
map.copyDartEmbedding(VERTEX, map.phi2(f3), tmp);
map.copyDartEmbedding(VERTEX, map.phi2(tmp), f3);
// map.embedOrbit(VERTEX, f3, map.getEmbedding(VERTEX, f3)) ;
// map.embedOrbit(VERTEX, tmp, map.getEmbedding(VERTEX, tmp)) ;
// unsigned int idface = map.getNewFaceId();
// map.setFaceId(map.phi2(f3),idface, FACE);
f = map.phi2(map.phi_1(f));
}while(f != x);
}
}
position[centralDart] = volCenter;
// //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
// 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);
// }
// }
//
//
// map.setCurrentLevel(cur) ;
}
template <typename PFP>
Dart subdivideVolume(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position)
{
......
......@@ -284,13 +284,6 @@ public:
* @return true if the merge has been executed, false otherwise
*/
virtual bool mergeVolumes(Dart d, Dart e);
//!
/*!
*
*/
virtual void splitCC(std::vector<Dart>& vd);
//@}
/*! @name Topological Queries
......
......@@ -515,14 +515,6 @@ bool Map2::mergeVolumes(Dart d, Dart e)
return true ;
}
void Map2::splitCC(std::vector<Dart>& vd)
{
//assert(checkSimpleOrientedPath(vd)) ;
for(std::vector<Dart>::iterator it = vd.begin() ; it != vd.end() ; ++it)
Map2::unsewFaces(*it);
}
/*! @name Topological Queries
* Return or set various topological information
*************************************************************************/
......
......@@ -343,7 +343,7 @@ Dart Map3::collapseEdge(Dart d, bool delDegenerateVolumes)
void Map3::splitFace(Dart d, Dart e)
{
assert(d != e && Map2::sameOrientedFace(d, e)) ;
assert(d != e && sameOrientedFace(d, e)) ;
Dart dd = phi1(phi3(d));
Dart ee = phi1(phi3(e));
......@@ -489,26 +489,10 @@ void Map3::splitVolume(std::vector<Dart>& vd)
Map2::unsewFaces(*it);
Map2::fillHole(e) ;
Dart b = Map1::newBoundaryCycle(vd.size());
Dart fit1 = phi2(e) ;
Dart fit2 = b ;
do
{
phi3sew(fit1, fit2) ;
fit1 = phi1(fit1) ;
fit2 = phi_1(fit2) ;
} while(fit2 != b) ;
// if(isBoundaryMarked(e2))
// Map2::fillHole(e2) ;
Map2::fillHole(e2) ;
//sew the two connected components
// Map3::sewVolumes(phi2(e), phi2(e2), false);
Map3::sewVolumes(phi2(e), phi2(e2), false);
}
/*! @name Topological Queries
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment