Commit f9ef10ef authored by Thomas's avatar Thomas

Merge branch 'master' of cgogn.u-strasbg.fr:~untereiner/CGoGN

parents f9dac96f 917105e2
......@@ -60,6 +60,16 @@ enum { NONE,GRID, CUBE, CYLINDER, CONE, SPHERE, TORE, COMPOSED };
// template <typename PFP>
// Dart triangleFan_topo(typename PFP::MAP& the_map, int n);
/**
* 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
*/
template <typename PFP>
void explodPolyhedron(typename PFP::MAP& map, Dart d, typename PFP::TVEC3 position);
/**
* class of geometric Polyhedron
* It alloaw the creation of:
......
......@@ -31,6 +31,92 @@ namespace Algo
namespace Modelisation
{
template <typename PFP>
void explodPolyhedron(typename PFP::MAP& map, Dart d, typename PFP::TVEC3 position)
{
map.unsewVertexUmbrella(d);
unsigned int newFaceDegree = map.closeHole(map.phi1(d));
if(newFaceDegree != 3)
{
//chercher le brin ou demarer
std::multimap<Dart, int> edges ;
typename std::multimap<Dart, int>::iterator it ;
Dart d12 = map.phi2(map.phi1(d));
Dart fit = d12;
int i;
do
{
i = map.faceDegree(map.phi2(fit));
std::cout << "edge(" << fit << "," << i << ")" << std::endl;
edges.insert(std::make_pair(fit, i));
fit = map.phi1(fit);
}
while(fit != d12);
do
{
//44 44
if(edges.find(fit)->second == 4 && edges.find(map.phi1(fit))->second == 4
&& !map.sameFace(map.phi2(fit), map.phi2(map.phi1(fit))))
{
map.splitFace(fit, map.phi1(map.phi1(fit)));
fit = map.phi2(map.phi_1(fit));
int i = map.faceDegree(fit);
edges.insert(std::make_pair(fit, i));
// Dart fit2 = map.phi2(fit) ;
// typename PFP::VEC3 p1 = position[fit] ;
// typename PFP::VEC3 p2 = position[fit2] ;
//
// map.cutEdge(fit) ;
// position[map.phi1(fit)] = typename PFP::REAL(0.5) * (p1 + p2);
std::cout << "flip cas quad quad " << std::endl;
}
//3 3
if(edges.find(fit)->second == 3 && edges.find(map.phi1(fit))->second == 3
&& !map.sameFace(map.phi2(fit), map.phi2(map.phi1(fit))))
{
map.splitFace(fit, map.phi1(fit));
fit = map.phi2(map.phi_1(fit));
int i = map.faceDegree(fit);
edges.insert(std::make_pair(fit, i));
std::cout << "flip cas tri tri" << std::endl;
}
//3 44 ou 44 3
if( ((edges.find(fit)->second == 4 && edges.find(map.phi1(fit))->second == 3)
|| (edges.find(fit)->second == 3 && edges.find(map.phi1(fit))->second == 4))
&& !map.sameFace(map.phi2(fit), map.phi2(map.phi1(fit))))
{
map.splitFace(fit, map.phi1(map.phi1(fit)));
fit = map.phi2(map.phi_1(fit));
int i = map.faceDegree(fit);
edges.insert(std::make_pair(fit, i));
std::cout << "flip cas quad tri" << std::endl;
}
fit = map.phi1(fit);
}
while(map.faceDegree(fit) > 4 && fit != d12);
}
}
template <typename PFP>
Polyhedron<PFP>::Polyhedron(const Polyhedron<PFP>& p1, const Polyhedron<PFP>& p2):
m_map(p1.m_map),
......
......@@ -117,7 +117,7 @@ public:
* insideVertices = centerDart
* insideEdges = star (edges incident to centerDart)
* insideFaces = triangles incident to centerDart
* border = vertices of 1-ring
* border = vertices of 1-ring -> link (set of adjacent vertices)
* = edges of 1-ring
*/
template <typename PFP>
......
......@@ -173,6 +173,13 @@ void EmbeddedMap3<MAP3>::cutEdge(Dart d)
{
MAP3::cutEdge(d);
if(MAP3::isOrbitEmbedded(VERTEX))
{
Dart nd = MAP3::phi1(d) ;
MAP3::embedNewCell(VERTEX, nd) ;
}
if(MAP3::isOrbitEmbedded(EDGE))
{
Dart nd = MAP3::phi1(d) ;
......@@ -218,6 +225,7 @@ void EmbeddedMap3<MAP3>::cutEdge(Dart d)
f = MAP3::alpha2(f);
} while(f != d);
}
}
......
......@@ -204,7 +204,7 @@ public:
void embedOrbit(unsigned int orbit, Dart d, unsigned int em) ;
/**
* Associate an new embedding to all darts of a vertex
* Associate an new embedding to all darts of an orbit
* @param orbit orbit to embed
* @param d a dart of the topological cell
* @return index of the attribute in table
......@@ -212,10 +212,10 @@ public:
unsigned int embedNewCell(unsigned int orbit, Dart d) ;
/**
* Copy the cell associated to a dart over an other dart
* Copy the cell associated to a dart over an other dart
* @param orbit attribute orbit to use
* @param d the dart to overwrite (dest)
* @param e the dart to copy (src)
* @param d the dart to overwrite (dest)
* @param e the dart to copy (src)
*/
void copyCell(unsigned int orbit, Dart d, Dart e) ;
......
......@@ -237,18 +237,11 @@ public:
void insertTrianglePair(Dart d, Dart v1, Dart v2) ;
/**
* Unsew opposite edges from the faces around a vertex
* Unsew the faces consisting of the umbrella of 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);
virtual void unsewVertexUmbrella(Dart d) ;
//! Merge two volumes along two faces.
/*! Works only if the two faces have the same number of edges.
......@@ -292,6 +285,12 @@ public:
*/
bool sameOrientedVertex(Dart d, Dart e) ;
//!Test if dart d and e belong to the same oriented face
/*! @param d a dart
* @param e a dart
*/
bool sameOrientedFace(Dart d, Dart e);
//! Test if dart d and e belong to the same vertex
/*! @param d a dart
* @param e a dart
......
......@@ -346,6 +346,14 @@ public:
*************************************************************************/
//@{
//! Test if dart d and e belong to the same oriented face
/*! @param d a dart
* @param e a dart
*/
bool sameFace(Dart d, Dart e);
// TODO devrait disparaitre
// pour les mêmes raisons que dans map2
virtual bool check();
......
......@@ -298,7 +298,7 @@ void Map2::insertTrianglePair(Dart d, Dart v1, Dart v2)
phi2sew(phi1(d), vv1) ;
}
void Map2::unsewAroundVertex(Dart d)
void Map2::unsewVertexUmbrella(Dart d)
{
Dart e = d;
......@@ -318,20 +318,6 @@ void Map2::unsewAroundVertex(Dart d)
while(e != d);
}
void Map2::explodPolyhedron(Dart d)
{
unsewAroundVertex(d);
closeHole(phi1(d));
//Recherche du (ou un des) sommet oppose
//tourner autour du sommet
//si quad alors sommet oppose
//
//si pas de quad alors un sommet du trian
//
}
bool Map2::mergeVolumes(Dart d, Dart e)
{
// First traversal of both faces to check the face sizes
......@@ -441,6 +427,19 @@ bool Map2::sameOrientedVertex(Dart d, Dart e)
return false; // None is equal to e => vertices are distinct
}
bool Map2::sameOrientedFace(Dart d, Dart e)
{
Dart dNext = d;
do //Foreach dart dNext of the face
{
if(dNext == e) //Test equality with e
return true;
dNext = phi1(dNext);
}
while(dNext != d);
return false; // None is equal to e => Faces are distinct
}
unsigned int Map2::vertexDegree(Dart d)
{
unsigned int count = 0 ;
......
......@@ -203,67 +203,111 @@ void Map3::uncutEdge(Dart d)
}
//besoin d'un iterator pour chaque face autour d'un sommet
bool Map3::deleteVertex(Dart d)
{
DartMarkerStore mv(*this); // Lock a marker
std::vector<Dart> darts_list; //Darts that are traversed
darts_list.reserve(512);
darts_list.push_back(d); //Start with the dart d
std::vector<Dart>::iterator darts;
mv.mark(d);
std::vector<Dart> unique_darts_list;
unique_darts_list.reserve(512);
unique_darts_list.push_back(d);
bool boundary = false;
if(isBoundaryVertex(d))
boundary = true;
for(darts = darts_list.begin(); darts != darts_list.end() ; ++darts)
//is boundary
if(phi3(d) != d)
{
Dart dc = *darts;
//add phi21 and phi23 successor if they are not marked yet
Dart d2 = phi2(dc);
Dart d21 = phi1(d2); // turn in volume
Dart d23 = phi3(d2); // change volume
if(!mv.isMarked(d21))
{
darts_list.push_back(d21);
mv.mark(d21);
}
Dart e = d;
Dart d3 = phi2(phi3(d));
if((d23!=d2) && !mv.isMarked(d23))
do
{
darts_list.push_back(d23);
unique_darts_list.push_back(d23);
mv.mark(d23);
}
}
unsewVolumes(e);
e = phi2(phi_1(e));
}while(e != d);
for(darts = unique_darts_list.begin(); darts != unique_darts_list.end() ; ++darts)
{
mergeVolumes(*darts);
Map2::deleteVertex(d3);
}
if(boundary)
{
Dart vit = d ;
do
{
Dart f = phi_1(phi2(vit)) ;
phi1sew(vit, f) ;
vit = phi2(phi_1((vit))) ;
} while(vit != d) ;
Map1::deleteFace(d) ;
}
Map2::deleteVertex(d);
return true;
// std::cout << "map3::deleteVertex" << std::endl;
//
// DartMarkerStore mv(*this); // Lock a marker
//
// std::vector<Dart> darts_list; //Darts that are traversed
// darts_list.reserve(512);
// darts_list.push_back(d); //Start with the dart d
// std::vector<Dart>::iterator darts;
//
// mv.mark(d);
//
// std::vector<Dart> unique_darts_list;
// unique_darts_list.reserve(512);
// unique_darts_list.push_back(d);
//
//
// bool boundary = false;
// if(isBoundaryVertex(d))
// boundary = true;
//
// std::cout << "isBoundary ? " << boundary << std::endl;
//
// CellMarker mvolume(*this, VOLUME);
//
// for(darts = darts_list.begin(); darts != darts_list.end() ; ++darts)
// {
// Dart dc = *darts;
//
// //add phi21 and phi23 successor if they are not marked yet
// Dart d2 = phi2(dc);
// Dart d21 = phi1(d2); // turn in volume
// Dart d23 = phi3(d2); // change volume
//
// if(!mv.isMarked(d21))
// {
// darts_list.push_back(d21);
// mv.mark(d21);
// }
//
// if((d23!=d2) && !mv.isMarked(d23))
// {
// darts_list.push_back(d23);
// //if(!mvolume.isMarked(d23))
// //{
// unique_darts_list.push_back(d23);
// // mvolume.mark(d23);
// //}
// mv.mark(d23);
// }
//
// std::cout << "save a dart" << std::endl;
// }
//
// std::cout << "unique_darts_list size = " << unique_darts_list.size() << std::endl;
//
// for(darts = unique_darts_list.begin(); darts != unique_darts_list.end() ; ++darts)
// {
// //std::cout << "merged ? " << mergeVolumes(*darts) << std::endl;
//
// //if(!mergeVolumes(*darts))
// // return false;
//
// std::cout << "mergevolumes" << std::endl;
// }
//
// std::cout << "end merging" << std::endl;
//
// if(boundary)
// {
// std::cout << "is Boundary " << std::endl;
// Dart vit = d ;
// do
// {
// Dart f = phi_1(phi2(vit)) ;
// phi1sew(vit, f) ;
// vit = phi2(phi_1((vit))) ;
// } while(vit != d) ;
// Map1::deleteFace(d) ;
// }
//
// std::cout << "return" << std::endl;
//
// return true;
}
//TODO
......@@ -1142,6 +1186,17 @@ void Map3::closeMap(DartMarker& marker)
// this->releaseMarker(DART,mf3);
//}
//
bool Map3::sameFace(Dart d, Dart e)
{
if(phi3(d) != d)
if(Map2::sameOrientedFace(phi3(d), e))
return true;
return Map2::sameOrientedFace(d,e);
}
bool Map3::check()
{
CGoGNout << "Check: topology begin" << CGoGNendl;
......
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