Commit 749f6086 authored by untereiner's avatar untereiner

deleteEdge+collapseEdge Map3 !!

parent b70a54c5
This diff is collapsed.
......@@ -24,27 +24,43 @@
#ifndef __TUTO5_
#define __TUTO5_
#include <iostream>
#include "Topology/generic/parameters.h"
#include "Topology/map/embeddedMap3.h"
#include "Geometry/vector_gen.h"
#include "Algo/Geometry/boundingbox.h"
#include "Algo/Render/GL2/mapRender.h"
#include "Algo/Render/GL2/topo3Render.h"
#include "Utils/Shaders/shaderSimpleColor.h"
#include "Algo/Render/SVG/mapSVGRender.h"
#include "Algo/Modelisation/primitives3d.h"
#include "Algo/Modelisation/polyhedron.h"
#include "Algo/Modelisation/subdivision.h"
#include "Topology/generic/cellmarker.h"
#include "Utils/text3d.h"
#include "Utils/pointSprite.h"
#include "Utils/Shaders/shaderVectorPerVertex.h"
#include "Utils/cgognStream.h"
#include "Utils/qtSimple.h"
#include "ui_tuto5.h"
// inclure qtui.h juste après le ui_xxx.h
#include "Utils/qtui.h"
// forward definitions (minimize includes)
namespace CGoGN { namespace Algo { namespace Render { namespace GL2 { class MapRender; } } } }
namespace CGoGN { namespace Algo { namespace Render { namespace GL2 { class Topo3RenderMapD; } } } }
namespace CGoGN { namespace Utils { class VBO; } }
namespace CGoGN { namespace Utils { class ShaderSimpleColor; } }
namespace CGoGN { namespace Utils { class Strings3D; } }
namespace CGoGN { namespace Utils { class PointSprite; } }
namespace CGoGN { namespace Utils { class ShaderVectorPerVertex; } }
using namespace CGoGN ;
struct PFP: public PFP_STANDARD
{
// definition de la carte
typedef EmbeddedMap3 MAP;
};
/**
* Utilisation de designer-qt4:
* Faire un DockWiget (laisser le nom par defaut
......@@ -52,7 +68,7 @@ using namespace CGoGN ;
* Ajouter les widgets necessaires, mettre des noms clairs pour
* les utiliser dans le .cpp (pour les call back principalement)
*/
class MyQT: public Utils::QT::SimpleQT
class Tuto5: public Utils::QT::SimpleQT
{
Q_OBJECT
......@@ -75,7 +91,12 @@ class MyQT: public Utils::QT::SimpleQT
QTimer *m_timer;
public:
MyQT():
PFP::MAP m;
PFP::TVEC3 position ;
Dart dglobal;
public:
Tuto5():
render_text(true),
render_balls(true),
render_vectors(true),
......@@ -114,6 +135,11 @@ public slots:
void slider_text(int x);
void animate();
Dart embedCube();
Dart embedCube2();
Dart embedMapCollapse();
};
#endif
......@@ -282,19 +282,18 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, typename PFP::TVEC3&
{
Dart e = *edge;
Dart f1 = map.phi1(*edge);
std::vector<Dart> v ;
do
{
map.unsewFaces(map.phi1(map.phi1(e)));
map.unsewFaces(map.phi1(e));
v.push_back(map.phi1(map.phi1(e)));
v.push_back(map.phi1(e));
e = map.phi2(map.phi_1(e));
}
while(e != *edge);
map.closeHole(f1);
map.splitVolume(v) ;
Dart old = map.phi2(map.phi1(e));
Dart dd = map.phi1(map.phi1(old)) ;
......@@ -325,41 +324,66 @@ Dart subdivideVolumeClassic(typename PFP::MAP& map, Dart d, typename PFP::TVEC3&
while(dd != stop);
}
//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;
map.deleteVolume(map.phi3(map.phi2(map.phi1(oldEdges.front()))));
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(f1), map.phi2(f2));
//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);
}
// for (std::vector<Dart>::iterator edge = oldEdges.begin(); edge != oldEdges.end(); ++edge)
// {
// unsigned int newLevel = map.getCurrentLevel();
//
// map.setCurrentLevel(cur);
//
// Dart d = *edge;
// Dart e = map.phi2(d);
//
// map.setCurrentLevel(newLevel);
//
// map.sewVolumes(map.phi2(map.phi1(d)), map.phi2(map.phi_1(map.phi2(e))));
// std::cout << "first = " << map.phi2(map.phi1(d)) << std::endl;
// std::cout << "second = " << map.phi2(map.phi_1(map.phi2(e))) << std::endl;
//
//
// }
//LA copie de L'id est a gerer avec le sewVolumes normalement !!!!!!
//id pour les aretes interieurs : (i.e. 6 pour un hexa)
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 = 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.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(f1), map.phi2(f2));
//
//
//
// std::cout << "sewVolumes" << std::endl;
//
// //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. 6 pour un hexa)
// 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) ;
......
......@@ -54,6 +54,16 @@ public:
*/
virtual bool uncutEdge(Dart d);
/*!
*
*/
virtual Dart deleteEdge(Dart d);
/*!
*
*/
virtual Dart collapseEdge(Dart d, bool delDegenerateVolumes=true);
/*!
*
*/
......
......@@ -140,6 +140,19 @@ public:
*/
virtual bool uncutEdge(Dart d);
//! Delete an edge and all the faces aroud this edge
/*! @param d a dart of the edge to delete
*/
virtual Dart deleteEdge(Dart d);
//! Collapse an edge (that is deleted) possibly merging its vertices
/*! \warning This may produce two distinct vertices if the edge
* was the only link between two border faces
* @param d a dart in the deleted edge
* @return a dart of the resulting vertex
*/
virtual Dart collapseEdge(Dart d, bool delDegenerateVolumes = true);
//! Split a face inserting an edge between two vertices
/*! \pre Dart d and e should belong to the same face and be distinct
* @param d dart of first vertex
......@@ -237,7 +250,9 @@ public:
*/
bool isBoundaryVolume(Dart d);
// TODO a mettre dans algo ?
//! Check the map completeness
/*! Test if phi3 and phi2 ares involutions and if phi1 is a permutation
*/
virtual bool check();
//@}
......
......@@ -107,6 +107,36 @@ bool EmbeddedMap3::uncutEdge(Dart d)
return false ;
}
Dart EmbeddedMap3::deleteEdge(Dart d)
{
Dart v = Map3::deleteVertex(d) ;
if(v != NIL)
{
if(isOrbitEmbedded(VOLUME))
{
embedOrbit(VOLUME, v, getEmbedding(VOLUME, v)) ;
}
}
return v;
}
Dart EmbeddedMap3::collapseEdge(Dart d, bool delDegenerateVolumes)
{
unsigned int vEmb = getEmbedding(VERTEX, d) ;
Dart resV = Map3::collapseEdge(d, delDegenerateVolumes);
if(resV != NIL)
{
if(isOrbitEmbedded(VERTEX))
{
embedOrbit(VERTEX,resV,vEmb);
}
}
return resV;
}
void EmbeddedMap3::splitFace(Dart d, Dart e)
{
Dart dd = phi1(phi3(d));
......
......@@ -176,6 +176,105 @@ bool Map3::uncutEdge(Dart d)
return false;
}
Dart Map3::deleteEdge(Dart d)
{
if(isBoundaryEdge(d))
return NIL ;
//Save the darts around the edge
//(one dart per face should be enough)
std::vector<Dart> fstore;
fstore.reserve(128);
Dart dit = d;
do
{
fstore.push_back(dit);
dit = alpha2(dit);
}while(dit != d);
Dart res = NIL ;
for(std::vector<Dart>::iterator it = fstore.begin() ; it != fstore.end() ; ++it)
{
Dart fit = *it ;
Dart end = phi_1(fit) ;
fit = phi1(fit) ;
while(fit != end)
{
Dart d2 = phi2(fit) ;
Dart d3 = phi3(fit) ;
Dart d32 = phi2(d3) ;
if(res == NIL)
res = d2 ;
phi2unsew(d2) ;
phi2unsew(d32) ;
phi2sew(d2, d32) ;
phi2sew(fit, d3) ;
}
}
Map2::deleteCC(d) ;
return res ;
}
Dart Map3::collapseEdge(Dart d, bool delDegenerateVolumes)
{
Dart resV = NIL;
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,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
{
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;
}
void Map3::splitFace(Dart d, Dart e)
{
assert(d != e && sameOrientedFace(d, 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