Commit 23f8022e authored by untereiner's avatar untereiner

begin edgeCanCollapse + collapseDegeneretedVolumes + edgeCollapse

parent 156f13bd
......@@ -58,6 +58,11 @@ public:
*/
virtual Dart deleteEdge(Dart d);
/*!
*
*/
bool edgeCanCollapse(Dart d);
/*!
*
*/
......
......@@ -163,6 +163,14 @@ public:
*/
virtual void splitFace(Dart d, Dart e);
//! Delete a volume if and only if it has a face with degree < 3 or only 3 vertices
/*! If the volume is sewed to two distinct adjacent volumes and if the face degree
* of the two adjacent volumes is equal then those two volumes are sewed
* @param d a dart of the face
* @return true if the collapse has been executed, false otherwise
*/
virtual bool collapseDegeneretedVolume(Dart d);
//! Sew two oriented volumes along their faces.
/*! The oriented faces should not be phi3-linked and have the same degree
* @param d a dart of the first volume
......
......@@ -120,6 +120,17 @@ Dart EmbeddedMap3::deleteEdge(Dart d)
return v;
}
bool EmbeddedMap3::edgeCanCollapse(Dart d)
{
//Criteres sur le bord
if(isBoundaryEdge(d))
{
//fusion de deux bord
//deconnection du bord
}
}
Dart EmbeddedMap3::collapseEdge(Dart d, bool delDegenerateVolumes)
{
unsigned int vEmb = getEmbedding(VERTEX, d) ;
......
......@@ -223,55 +223,86 @@ Dart Map3::collapseEdge(Dart d, bool delDegenerateVolumes)
{
Dart resV = NIL;
Dart e = d;
Dart dit = d;
//stocke un brin par volume autour de l'arete
std::vector<Dart> tmp;
tmp.reserve(32);
do
{
tmp.push_back(e);
e = alpha2(e);
} while (e != d);
Dart e = dit;
dit = alpha2(dit);
//contraction de la 2 carte de chaque 2-arete
for (std::vector<Dart>::iterator it = tmp.begin(); it != tmp.end(); ++it)
{
//un brin d'une face adjacente a l'arrete contracte
Dart d = phi2(phi_1(*it));
Map2::collapseEdge(*it, false);
//test si un seul polyedre autour de l'arete
if(e == dit)
resV == phi3(phi2(phi1(e)));
//test de la degeneresence
//impossible d'avoir un volume de moins de 4 faces sans avoir de phi2 en points fixe donc on les vire
if(delDegenerateVolumes && Map2::volumeDegree(d) < 4)
if(delDegenerateVolumes)
{
Dart e = d;
//pour tous les brins de la face adjacente
do
{
Dart ee = phi3(e);
Dart ff = phi3(phi2(e));
//si les brins ont un voisin par phi3
if(ee != e)
phi3unsew(ee);
Map2::collapseEdge(e, true);
//collapseDegeneretedVolume(e);
}
else
Map2::collapseEdge(e, false);
if(ff != phi2(e))
phi3unsew(ff);
if(resV == NIL)
{
//si les deux en ont un, il faut les coudres ensemble
if(ee != e && ff != phi2(e))
phi3sew(ee, ff);
}
//on peut supprimer les brins de cette arete
deleteDart(e);
deleteDart(phi2(e));
e = phi1(e);
} while (e != d);
}
}
}while(d != dit);
// Dart e = d;
//
// // stocke un brin par volume autour de l'arete
// std::vector<Dart> tmp;
// tmp.reserve(32);
// do
// {
// tmp.push_back(e);
// e = alpha2(e);
// } while (e != d);
//
// // contraction de la 2 carte de chaque 2-arete
// for (std::vector<Dart>::iterator it = tmp.begin(); it != tmp.end(); ++it)
// {
// // un brin d'une face adjacente a l'arrete contracte
// Dart d = phi2(phi_1(*it));
// Map2::collapseEdge(*it, true);
//
// // test de la degeneresence
// // impossible d'avoir un volume de moins de 4 faces sans avoir de phi2 en points fixe donc on les vire
// if(delDegenerateVolumes && Map2::volumeDegree(d) < 4)
// {
// Dart e = d;
// // pour tous les brins de la face adjacente
//
// do
// {
// Dart ee = phi3(e);
// Dart ff = phi3(phi2(e));
//
// // si les brins ont un voisin par phi3
// if(ee != e)
//
// phi3unsew(ee);
// if(ff != phi2(e))
// phi3unsew(ff);
//
// // si les deux en ont un, il faut les coudres ensemble
// if(ee != e && ff != phi2(e))
// phi3sew(ee, ff);
//
// // on peut supprimer les brins de cette arete
// deleteDart(e);
// deleteDart(phi2(e));
// e = phi1(e);
//
// } while (e != d);
// }
// }
return resV;
}
......@@ -290,6 +321,30 @@ void Map3::splitFace(Dart d, Dart e)
phi3sew(phi_1(e), phi_1(dd));
}
bool Map3::collapseDegeneretedVolume(Dart d)
{
Dart e1 = phi2(d);
Dart e2 = phi2(phi1(d));
//Si l'une des faces est du bord
if(isBoundaryFace(e1) || isBoundaryFace(e2))
{
//alors simple suppression du volume degenere
}
else
{
Dart e13 = e1;
Dart e23 = e2;
if(!isBoundaryFace(e1))
e13 = phi3(e1);
if(!isBoundaryFace(e2))
e23 = phi3(e2);
//if(faceDegree(e1) < faceDegree)
}
}
void Map3::sewVolumes(Dart d, Dart e, bool withBoundary)
{
assert(faceDegree(d) == faceDegree(e));
......
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