Commit 23f8022e authored by untereiner's avatar untereiner

begin edgeCanCollapse + collapseDegeneretedVolumes + edgeCollapse

parent 156f13bd
...@@ -58,6 +58,11 @@ public: ...@@ -58,6 +58,11 @@ public:
*/ */
virtual Dart deleteEdge(Dart d); virtual Dart deleteEdge(Dart d);
/*!
*
*/
bool edgeCanCollapse(Dart d);
/*! /*!
* *
*/ */
......
...@@ -163,6 +163,14 @@ public: ...@@ -163,6 +163,14 @@ public:
*/ */
virtual void splitFace(Dart d, Dart e); 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. //! Sew two oriented volumes along their faces.
/*! The oriented faces should not be phi3-linked and have the same degree /*! The oriented faces should not be phi3-linked and have the same degree
* @param d a dart of the first volume * @param d a dart of the first volume
......
...@@ -120,6 +120,17 @@ Dart EmbeddedMap3::deleteEdge(Dart d) ...@@ -120,6 +120,17 @@ Dart EmbeddedMap3::deleteEdge(Dart d)
return v; 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) Dart EmbeddedMap3::collapseEdge(Dart d, bool delDegenerateVolumes)
{ {
unsigned int vEmb = getEmbedding(VERTEX, d) ; unsigned int vEmb = getEmbedding(VERTEX, d) ;
......
...@@ -223,55 +223,86 @@ Dart Map3::collapseEdge(Dart d, bool delDegenerateVolumes) ...@@ -223,55 +223,86 @@ Dart Map3::collapseEdge(Dart d, bool delDegenerateVolumes)
{ {
Dart resV = NIL; 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 do
{ {
tmp.push_back(e); Dart e = dit;
e = alpha2(e); dit = alpha2(dit);
} while (e != d);
//contraction de la 2 carte de chaque 2-arete //test si un seul polyedre autour de l'arete
for (std::vector<Dart>::iterator it = tmp.begin(); it != tmp.end(); ++it) if(e == dit)
{ resV == phi3(phi2(phi1(e)));
//un brin d'une face adjacente a l'arrete contracte
Dart d = phi2(phi_1(*it));
Map2::collapseEdge(*it, false);
//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 if(delDegenerateVolumes)
{ {
Dart ee = phi3(e); Map2::collapseEdge(e, true);
Dart ff = phi3(phi2(e)); //collapseDegeneretedVolume(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);
}
} }
else
Map2::collapseEdge(e, false);
if(resV == NIL)
{
}
}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; return resV;
} }
...@@ -290,6 +321,30 @@ void Map3::splitFace(Dart d, Dart e) ...@@ -290,6 +321,30 @@ void Map3::splitFace(Dart d, Dart e)
phi3sew(phi_1(e), phi_1(dd)); 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) void Map3::sewVolumes(Dart d, Dart e, bool withBoundary)
{ {
assert(faceDegree(d) == faceDegree(e)); 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