Commit 9f0583a0 authored by Lionel Untereiner's avatar Lionel Untereiner

changes to computeDual functions

parent 4fadd564
...@@ -200,7 +200,7 @@ void MyQT::cb_initGL() ...@@ -200,7 +200,7 @@ void MyQT::cb_initGL()
// create the renders // create the renders
m_topo_render = new Algo::Render::GL2::Topo3Render(); m_topo_render = new Algo::Render::GL2::Topo3Render();
m_explode_render = new Algo::Render::GL2::ExplodeVolumeRender(true,true); m_explode_render = new Algo::Render::GL2::ExplodeVolumeRender(true,true,true);
SelectorDartNoBoundary<PFP::MAP> nb(myMap); SelectorDartNoBoundary<PFP::MAP> nb(myMap);
m_topo_render->updateData<PFP>(myMap, position, 0.8f, 0.8f, 0.8f, nb); m_topo_render->updateData<PFP>(myMap, position, 0.8f, 0.8f, 0.8f, nb);
......
...@@ -115,16 +115,35 @@ void TwoNPlusOneSubdivision(typename PFP::MAP& map, EMBV& attributs, const Funct ...@@ -115,16 +115,35 @@ void TwoNPlusOneSubdivision(typename PFP::MAP& map, EMBV& attributs, const Funct
template <typename PFP> template <typename PFP>
void DooSabin(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& position); void DooSabin(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& position);
//** ///**
// * Reverse the orientation of the map
// * NOW IN THE MAP
// */ // */
//template <typename PFP> //template <typename PFP>
//void Sqrt3Subdivision(typename PFP::MAP& map, typename PFP::TVEC3& position, const FunctorSelect& selected = allDarts) ; //void Sqrt3Subdivision(typename PFP::MAP& map, typename PFP::TVEC3& position, const FunctorSelect& selected = allDarts) ;
///**
// * Sqrt(3) subdivision scheme
// */
//template <typename PFP>
//void Sqrt3Subdivision(typename PFP::MAP& map, typename PFP::TVEC3& position, const FunctorSelect& selected = allDarts) ;
template <typename PFP>
void computeDual(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& position);
template <typename PFP>
void computeBoundaryConstraintDual(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& position);
template <typename PFP>
void computeBoundaryConstraintKeepingOldVerticesDual(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& position);
} // namespace Modelisation } // namespace Modelisation
} } // namespace Surface
} // namespace Algo } // namespace Algo
......
...@@ -628,7 +628,6 @@ void DooSabin(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& posit ...@@ -628,7 +628,6 @@ void DooSabin(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& posit
} }
} }
inline double sqrt3_K(unsigned int n) inline double sqrt3_K(unsigned int n)
{ {
switch(n) switch(n)
...@@ -698,11 +697,176 @@ inline double sqrt3_K(unsigned int n) ...@@ -698,11 +697,176 @@ inline double sqrt3_K(unsigned int n)
// } // }
//} //}
template <typename PFP>
void computeDual(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& position)
{
// Face Attribute -> after dual new Vertex Attribute
FaceAttribute<typename PFP::VEC3> positionF = map.template getAttribute<typename PFP::VEC3, FACE>("position") ;
if(!positionF.isValid())
positionF = map.template addAttribute<typename PFP::VEC3, FACE>("position") ;
} // namespace Modelisation // Compute Centroid for the faces
Algo::Surface::Geometry::computeCentroidFaces<PFP>(map, position, positionF) ;
// Compute the Dual mesh
map.computeDual();
position = positionF ;
}
template <typename PFP>
void computeBoundaryConstraintDual(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& position)
{
// Face Attribute -> after dual new Vertex Attribute
FaceAttribute<typename PFP::VEC3> positionF = map.template getAttribute<typename PFP::VEC3, FACE>("position") ;
if(!positionF.isValid())
positionF = map.template addAttribute<typename PFP::VEC3, FACE>("position") ;
//Triangule boundary faces & compute for each new face the centroid
std::vector<Dart> boundsDart;
DartMarkerStore mf(map);
for(Dart dit = map.begin() ; dit != map.end() ; map.next(dit))
{
if(!mf.isMarked(dit) && map.isBoundaryMarked2(dit))
{
boundsDart.push_back(dit);
Dart db = dit;
Dart d1 = map.phi1(db);
Dart dprev = map.phi_1(db);
map.splitFace(db, d1) ;
map.cutEdge(map.phi_1(db)) ;
positionF[dit] = (position[dit] + position[map.phi2(dit)]) * typename PFP::REAL(0.5);
mf.markOrbit<FACE>(dit);
Dart x = map.phi2(map.phi_1(db)) ;
Dart dd = map.phi1(map.phi1(map.phi1(x)));
while(dd != x)
{
Dart next = map.phi1(dd) ;
Dart prev = map.phi_1(dd);
map.splitFace(dd, map.phi1(x)) ;
positionF[prev] = (position[prev] + position[map.phi1(prev)]) * typename PFP::REAL(0.5);
mf.markOrbit<FACE>(prev);
dd = next ;
}
positionF[dprev] = (position[dprev] + position[map.phi1(dprev)]) * typename PFP::REAL(0.5);
mf.markOrbit<FACE>(dprev);
}
}
// Compute Centroid for the other faces
Algo::Surface::Geometry::computeCentroidFaces<PFP>(map, position, positionF) ;
// Fill the holes
for(Dart dit = map.begin() ; dit != map.end() ; map.next(dit))
{
if(mf.isMarked(dit) && map.isBoundaryMarked2(dit))
{
map.fillHole(dit);
mf.unmarkOrbit<FACE>(dit);
}
}
// Compute the Dual mesh
map.computeDual();
position = positionF ;
// Create the new border with the old boundary edges
for(std::vector<Dart>::iterator it = boundsDart.begin() ; it != boundsDart.end() ; ++it)
{
map.createHole(map.phi2(map.phi1(*it)));
}
}
template <typename PFP>
void computeBoundaryConstraintKeepingOldVerticesDual(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& position)
{
// Face Attribute -> after dual new Vertex Attribute
FaceAttribute<typename PFP::VEC3> positionF = map.template getAttribute<typename PFP::VEC3, FACE>("position") ;
if(!positionF.isValid())
positionF = map.template addAttribute<typename PFP::VEC3, FACE>("position") ;
//Triangule boundary faces & compute for each new face the centroid
std::vector<Dart> boundsDart;
DartMarkerStore mf(map);
for(Dart dit = map.begin() ; dit != map.end() ; map.next(dit))
{
if(!mf.isMarked(dit) && map.isBoundaryMarked2(dit))
{
boundsDart.push_back(dit);
Dart db = dit;
Dart d1 = map.phi1(db);
Dart dprev = map.phi_1(db);
map.splitFace(db, d1) ;
map.cutEdge(map.phi_1(db)) ;
positionF[dit] = (position[dit] + position[map.phi2(dit)]) * typename PFP::REAL(0.5);
mf.markOrbit<FACE>(dit);
Dart x = map.phi2(map.phi_1(db)) ;
Dart dd = map.phi1(map.phi1(map.phi1(x)));
while(dd != x)
{
Dart next = map.phi1(dd) ;
Dart prev = map.phi_1(dd);
map.splitFace(dd, map.phi1(x)) ;
positionF[prev] = (position[prev] + position[map.phi1(prev)]) * typename PFP::REAL(0.5);
mf.markOrbit<FACE>(prev);
dd = next ;
}
positionF[dprev] = (position[dprev] + position[map.phi1(dprev)]) * typename PFP::REAL(0.5);
mf.markOrbit<FACE>(dprev);
}
}
// Compute Centroid for the other faces
Algo::Surface::Geometry::computeCentroidFaces<PFP>(map, position, positionF) ;
// Fill the holes
for(Dart dit = map.begin() ; dit != map.end() ; map.next(dit))
{
if(mf.isMarked(dit) && map.isBoundaryMarked2(dit))
{
map.fillHole(dit);
mf.unmarkOrbit<FACE>(dit);
}
}
// Compute the Dual mesh
map.computeDual();
//Saving old position VertexAttribute to a FaceAttribute
FaceAttribute<typename PFP::VEC3> temp;
temp = position;
position = positionF ;
positionF = temp;
// Create the new border with the old boundary edges
for(std::vector<Dart>::iterator it = boundsDart.begin() ; it != boundsDart.end() ; ++it)
{
map.createHole(map.phi2(map.phi1(*it)));
}
// Manage old vertices with new FaceAttribute
for(Dart dit = map.begin() ; dit != map.end() ; map.next(dit))
{
if(!mf.isMarked(dit) && map.isBoundaryMarked2(dit))
{
Dart nd = map.cutEdge(dit);
position[nd] = positionF[map.phi2(dit)];
mf.markOrbit<EDGE>(dit);
mf.markOrbit<EDGE>(nd);
}
}
} }
} // namespace Modelisation
} // namespace Surface
} // namespace Algo } // namespace Algo
} // namespace CGoGN } // namespace CGoGN
...@@ -102,15 +102,13 @@ void catmullClarkVol(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3> ...@@ -102,15 +102,13 @@ void catmullClarkVol(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>
template <typename PFP> template <typename PFP>
void sqrt3Vol(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& position, const FunctorSelect& selected = allDarts); void sqrt3Vol(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& position, const FunctorSelect& selected = allDarts);
///** template <typename PFP>
// * Dual mesh computation void computeDual(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& position);
// */
//template <typename PFP>
//void computeDual3(typename PFP::MAP& map, const FunctorSelect& selected = allDarts) ;
} // namespace Modelisation } // namespace Modelisation
} } // namespace Volume
} // namespace Algo } // namespace Algo
......
...@@ -716,87 +716,21 @@ void sqrt3Vol(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& posit ...@@ -716,87 +716,21 @@ void sqrt3Vol(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& posit
} }
} }
//template <typename PFP> template <typename PFP>
//void reverseOrientation3(typename PFP::MAP& map) void computeDual(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& position)
//{ {
// DartAttribute<unsigned int> emb0(&map, map.template getEmbeddingAttributeVector<VERTEX>()) ; // VolumeAttribute -> after dual new VertexAttribute
// if(emb0.isValid()) VolumeAttribute<typename PFP::VEC3> positionV = map.template getAttribute<typename PFP::VEC3, VOLUME>("position") ;
// { if(!positionV.isValid())
// DartAttribute<unsigned int> new_emb0 = map.template addAttribute<unsigned int, DART>("new_EMB_0") ; positionV = map.template addAttribute<typename PFP::VEC3, VOLUME>("position") ;
// for(Dart d = map.begin(); d != map.end(); map.next(d))
// new_emb0[d] = emb0[map.phi1(d)] ; // Compute Centroid for the volumes
// map.template swapAttributes<unsigned int>(emb0, new_emb0) ; Algo::Volume::Geometry::computeCentroidVolumes<PFP>(map, position, positionV) ;
// map.removeAttribute(new_emb0) ;
// } // Compute the Dual mesh
// map.computeDual();
// DartAttribute<Dart> phi2 = map.template getAttribute<Dart, DART>("phi2") ; position = positionV ;
// DartAttribute<Dart> phi3 = map.template getAttribute<Dart, DART>("phi3") ; }
// map.template swapAttributes<Dart>(phi2, phi3) ;
//}
//
//template <typename PFP>
//void computeDual3(typename PFP::MAP& map, const FunctorSelect& selected)
//{
// DartAttribute<Dart> phi1 = map.template getAttribute<Dart, DART>("phi1") ;
// DartAttribute<Dart> phi_1 = map.template getAttribute<Dart, DART>("phi_1") ;
// DartAttribute<Dart> new_phi1 = map.template addAttribute<Dart, DART>("new_phi1") ;
// DartAttribute<Dart> new_phi_1 = map.template addAttribute<Dart, DART>("new_phi_1") ;
//
// DartAttribute<Dart> phi2 = map.template getAttribute<Dart, DART>("phi2") ;
// DartAttribute<Dart> new_phi2 = map.template addAttribute<Dart, DART>("new_phi2") ;
//
// for(Dart d = map.begin(); d != map.end(); map.next(d))
// {
// Dart dd = map.phi2(map.phi3(d)) ;
// new_phi1[d] = dd ;
// new_phi_1[dd] = d ;
//
// Dart ddd = map.phi1(map.phi3(d));
// new_phi2[d] = ddd;
// new_phi2[ddd] = d;
// }
//
// map.template swapAttributes<Dart>(phi1, new_phi1) ;
// map.template swapAttributes<Dart>(phi_1, new_phi_1) ;
// map.template swapAttributes<Dart>(phi2, new_phi2) ;
//
// map.removeAttribute(new_phi1) ;
// map.removeAttribute(new_phi_1) ;
// map.removeAttribute(new_phi2) ;
//
// map.swapEmbeddingContainers(VERTEX, VOLUME) ;
//
// for(Dart d = map.begin(); d != map.end(); map.next(d))
// {
// if(map.isBoundaryMarked(d))
// {
// map.deleteVolume(d);
//// Traversor3VW<typename PFP::MAP> tWV(map, d);
//// std::vector<Dart> v;
//// for(Dart ditW = tWV.begin() ; ditW != tWV.end() ; ditW = tWV.next())
//// {
//// v.push_back(ditW);
//// }
////
//// for(std::vector<Dart>::iterator it = v.begin() ; it != v.end() ; ++it)
//// {
//// map.deleteVolume(*it);
//// }
//
// }
// }
//
//// reverseOrientation3<PFP>(map) ;
//
// //boundary management
//// for(Dart d = map.begin(); d != map.end(); map.next(d))
//// {
//// if(map.isBoundaryMarked(d))
//// {
//// map.deleteVolume(d); //map.template boundaryMarkOrbit<VOLUME>(
//// }
//// }
//}
} //namespace Modelisation } //namespace Modelisation
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#ifndef __INCLUSION__ #ifndef __INCLUSION__
#define __INCLUSION__ #define __INCLUSION__
#include "Geometry/basic.h" #include "Geometry/basic.h"
#include "Geometry/orientation.h" #include "Geometry/orientation.h"
......
...@@ -439,8 +439,6 @@ public: ...@@ -439,8 +439,6 @@ public:
* @param fonct functor obj ref * @param fonct functor obj ref
*/ */
bool foreach_dart_of_edge1(Dart d, FunctorType& fonct, unsigned int thread = 0); bool foreach_dart_of_edge1(Dart d, FunctorType& fonct, unsigned int thread = 0);
//@} //@}
/*! @name Close map after import or creation /*! @name Close map after import or creation
...@@ -469,6 +467,17 @@ public: ...@@ -469,6 +467,17 @@ public:
*/ */
unsigned int closeMap(); unsigned int closeMap();
//@} //@}
/*! @name Compute dual
* These functions compute the dual mesh
*************************************************************************/
//@{
//! Dual mesh computation
/*!
*/
void computeDual();
//@}
}; };
} // namespace CGoGN } // namespace CGoGN
......
...@@ -378,6 +378,19 @@ public: ...@@ -378,6 +378,19 @@ public:
* @return the number of closed holes * @return the number of closed holes
*/ */
unsigned int closeMap(); unsigned int closeMap();
//@}
/*! @name Compute dual
* These functions compute the dual mesh
*************************************************************************/
//@{
//! Dual mesh computation
/*!
*/
void computeDual();
//@}
}; };
} // namespace CGoGN } // namespace CGoGN
......
...@@ -432,7 +432,6 @@ public: ...@@ -432,7 +432,6 @@ public:
* These functions must be used with care, generally only by import algorithms * These functions must be used with care, generally only by import algorithms
*************************************************************************/ *************************************************************************/
//@{ //@{
/** /**
* create a face of map1 marked as boundary * create a face of map1 marked as boundary
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <assert.h> #include <assert.h>
#include <vector> #include <vector>
#include <list>
namespace CGoGN { namespace CGoGN {
......
...@@ -947,4 +947,20 @@ unsigned int GMap2::closeMap() ...@@ -947,4 +947,20 @@ unsigned int GMap2::closeMap()
return nb ; return nb ;
} }
/*! @name Compute dual
* These functions compute the dual mesh
*************************************************************************/
void GMap2::computeDual()
{
// DartAttribute<Dart> old_beta0 = this->getAttribute<Dart, DART>("beta0");
// DartAttribute<Dart> old_beta2 = this->getAttribute<Dart, DART>("beta2") ;
//
// swapAttributes<Dart>(old_beta0, old_beta2) ;
//
// swapEmbeddingContainers(VERTEX, FACE) ;
//
// //boundary management ?
}
} // namespace CGoGN } // namespace CGoGN
...@@ -996,4 +996,24 @@ unsigned int GMap3::closeMap() ...@@ -996,4 +996,24 @@ unsigned int GMap3::closeMap()
return nb ; return nb ;
} }
/*! @name Compute dual
* These functions compute the dual mesh
*************************************************************************/
void GMap3::computeDual()
{
// DartAttribute<Dart> old_beta0 = getAttribute<Dart, DART>("beta0");
// DartAttribute<Dart> old_beta1 = getAttribute<Dart, DART>("beta1");
// DartAttribute<Dart> old_beta2 = getAttribute<Dart, DART>("beta2");
// DartAttribute<Dart> old_beta3 = getAttribute<Dart, DART>("beta3") ;
//
// swapAttributes<Dart>(old_beta0, old_beta3) ;
// swapAttributes<Dart>(old_beta1, old_beta2) ;
//
// swapEmbeddingContainers(VERTEX, FACE) ;
//
// //boundary management ?
}
} // namespace CGoGN } // namespace CGoGN
...@@ -278,8 +278,8 @@ Dart Map3::splitVertex(std::vector<Dart>& vd) ...@@ -278,8 +278,8 @@ Dart Map3::splitVertex(std::vector<Dart>& vd)
Dart Map3::deleteVertex(Dart d) Dart Map3::deleteVertex(Dart d)
{ {
if(isBoundaryVertex(d)) //if(isBoundaryVertex(d))
return NIL ; // return NIL ;
// Save the darts around the vertex // Save the darts around the vertex
// (one dart per face should be enough) // (one dart per face should be enough)
...@@ -301,27 +301,55 @@ Dart Map3::deleteVertex(Dart d) ...@@ -301,27 +301,55 @@ Dart Map3::deleteVertex(Dart d)
} }
} }
std::cout << "nb faces " << fstore.size() << std::endl;
Dart res = NIL ; Dart res = NIL ;
for(std::vector<Dart>::iterator it = fstore.begin() ; it != fstore.end() ; ++it) for(std::vector<Dart>::iterator it = fstore.begin() ; it != fstore.end() ; ++it)
{ {
Dart fit = *it ; Dart fit = *it ;
Dart end = phi_1(fit) ; Dart end = phi_1(fit) ;
fit = phi1(fit) ; fit = phi1(fit) ;
while(fit != end)
if(fit == end)
{ {
Dart d2 = phi2(fit) ; std::cout << " mmmmmmmmmmmmmmmmmmmmmerrrrrrrrrrrrrrrrrde !!!!!!!!!!!! " << std::endl;
Dart d3 = phi3(fit) ;
Dart d32 = phi2(d3) ;
if(res == NIL) // Dart d2 = phi2(fit) ;
res = d2 ; // Dart d23 = phi3(d2) ;
// Dart d3 = phi3(fit) ;
// Dart d32 = phi2(d3) ;
//
// //phi3unsew()
// phi3sew(d3,23);
//
// fit = phi_1(fit);
//
// d2 = phi2(fit) ;
// d23 = phi3(d2) ;
// d3 = phi3(fit) ;
// d32 = phi2(d3) ;
// phi3sew(d3,23);
phi2unsew(d2) ; // Map2::deleteCC(fit);
phi2unsew(d32) ; }
phi2sew(d2, d32) ; else
phi2sew(fit, d3) ; {
while(fit != end)
{
Dart d2 = phi2(fit) ;
Dart d3 = phi3(fit) ;
Dart d32 = phi2(d3) ;
fit = phi1(fit) ; if(res == NIL)
res = d2 ;
phi2unsew(d2) ;
phi2unsew(d32) ;
phi2sew(d2, d32) ;
phi2sew(fit, d3) ;
fit = phi1(fit) ;
}
} }
} }
...@@ -1270,60 +1298,86 @@ void Map3::computeDual() ...@@ -1270,60 +1298,86 @@ void Map3::computeDual()
unsigned int count = 0; unsigned int count = 0;
for(Dart d = begin(); d != end(); next(d)) std::vector<Dart> vbound;
{
if(isBoundaryMarked3(d))
boundaryUnmark<3>(d);
if(d == 1569)
{
std::cout << "d " << std::endl;
Traversor3WE<Map3> t(*this,d);
for(Dart dit = t.begin() ; dit != t.end() ; dit = t.next())
{
Dart temp = dit;
do
{
if(isBoundaryMarked3(d))
std::cout << "d boundary " << std::endl;
temp = alpha2(temp);
}while(temp != dit);
}
if(isBoundaryMarked3(d))
std::cout << "d boundary " << std::endl;
if(isBoundaryMarked3(phi1(d)))
std::cout << "phi1(d) boundary " << std::endl;
if(isBoundaryMarked3(phi_1(d)))
std::cout << "phi_1(d) boundary " << std::endl;