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

changes to computeDual functions

parent 4fadd564
......@@ -200,7 +200,7 @@ void MyQT::cb_initGL()
// create the renders
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);
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
template <typename PFP>
void DooSabin(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& position);
//**
///**
// * Reverse the orientation of the map
// * NOW IN THE MAP
// */
//template <typename PFP>
//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 Surface
} // namespace Algo
......
......@@ -628,7 +628,6 @@ void DooSabin(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& posit
}
}
inline double sqrt3_K(unsigned int n)
{
switch(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 CGoGN
......@@ -102,15 +102,13 @@ void catmullClarkVol(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>
template <typename PFP>
void sqrt3Vol(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& position, const FunctorSelect& selected = allDarts);
///**
// * Dual mesh computation
// */
//template <typename PFP>
//void computeDual3(typename PFP::MAP& map, const FunctorSelect& selected = allDarts) ;
template <typename PFP>
void computeDual(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& position);
} // namespace Modelisation
}
} // namespace Volume
} // namespace Algo
......
......@@ -716,87 +716,21 @@ void sqrt3Vol(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& posit
}
}
//template <typename PFP>
//void reverseOrientation3(typename PFP::MAP& map)
//{
// DartAttribute<unsigned int> emb0(&map, map.template getEmbeddingAttributeVector<VERTEX>()) ;
// if(emb0.isValid())
// {
// DartAttribute<unsigned int> new_emb0 = map.template addAttribute<unsigned int, DART>("new_EMB_0") ;
// for(Dart d = map.begin(); d != map.end(); map.next(d))
// new_emb0[d] = emb0[map.phi1(d)] ;
// map.template swapAttributes<unsigned int>(emb0, new_emb0) ;
// map.removeAttribute(new_emb0) ;
// }
//
// DartAttribute<Dart> phi2 = map.template getAttribute<Dart, DART>("phi2") ;
// 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>(
//// }
//// }
//}
template <typename PFP>
void computeDual(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& position)
{
// VolumeAttribute -> after dual new VertexAttribute
VolumeAttribute<typename PFP::VEC3> positionV = map.template getAttribute<typename PFP::VEC3, VOLUME>("position") ;
if(!positionV.isValid())
positionV = map.template addAttribute<typename PFP::VEC3, VOLUME>("position") ;
// Compute Centroid for the volumes
Algo::Volume::Geometry::computeCentroidVolumes<PFP>(map, position, positionV) ;
// Compute the Dual mesh
map.computeDual();
position = positionV ;
}
} //namespace Modelisation
......
......@@ -25,6 +25,7 @@
#ifndef __INCLUSION__
#define __INCLUSION__
#include "Geometry/basic.h"
#include "Geometry/orientation.h"
......
......@@ -439,8 +439,6 @@ public:
* @param fonct functor obj ref
*/
bool foreach_dart_of_edge1(Dart d, FunctorType& fonct, unsigned int thread = 0);
//@}
/*! @name Close map after import or creation
......@@ -469,6 +467,17 @@ public:
*/
unsigned int closeMap();
//@}
/*! @name Compute dual
* These functions compute the dual mesh
*************************************************************************/
//@{
//! Dual mesh computation
/*!
*/
void computeDual();
//@}
};
} // namespace CGoGN
......
......@@ -378,6 +378,19 @@ public:
* @return the number of closed holes
*/
unsigned int closeMap();
//@}
/*! @name Compute dual
* These functions compute the dual mesh
*************************************************************************/
//@{
//! Dual mesh computation
/*!
*/
void computeDual();
//@}
};
} // namespace CGoGN
......
......@@ -432,7 +432,6 @@ public:
* These functions must be used with care, generally only by import algorithms
*************************************************************************/
//@{
/**
* create a face of map1 marked as boundary
......
......@@ -27,6 +27,7 @@
#include <assert.h>
#include <vector>
#include <list>
namespace CGoGN {
......
......@@ -947,4 +947,20 @@ unsigned int GMap2::closeMap()
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
......@@ -996,4 +996,24 @@ unsigned int GMap3::closeMap()
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
......@@ -278,8 +278,8 @@ Dart Map3::splitVertex(std::vector<Dart>& vd)
Dart Map3::deleteVertex(Dart d)
{
if(isBoundaryVertex(d))
return NIL ;
//if(isBoundaryVertex(d))
// return NIL ;
// Save the darts around the vertex
// (one dart per face should be enough)
......@@ -301,27 +301,55 @@ Dart Map3::deleteVertex(Dart d)
}
}
std::cout << "nb faces " << fstore.size() << std::endl;
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)
if(fit == end)
{
Dart d2 = phi2(fit) ;
Dart d3 = phi3(fit) ;
Dart d32 = phi2(d3) ;
std::cout << " mmmmmmmmmmmmmmmmmmmmmerrrrrrrrrrrrrrrrrde !!!!!!!!!!!! " << std::endl;
if(res == NIL)
res = d2 ;
// Dart d2 = phi2(fit) ;
// 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) ;
phi2unsew(d32) ;
phi2sew(d2, d32) ;
phi2sew(fit, d3) ;
// Map2::deleteCC(fit);
}
else
{
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()
unsigned int count = 0;
for(Dart d = begin(); d != end(); next(d))
{
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;
if(isBoundaryMarked3(phi2(d)))
std::cout << "phi2(d) boundary " << std::endl;
if(isBoundaryMarked3(phi3(d)))
std::cout << "phi3(d) boundary " << std::endl;
if(isBoundaryMarked3(phi2(phi3(d))))
std::cout << "phi2(phi3(d)) boundary " << std::endl;
if(isBoundaryMarked3(phi3(phi2(d))))
std::cout << "phi3(phi2(d)) boundary " << std::endl;
if(isBoundaryMarked3(phi1(phi3(d))))
std::cout << "phi1(phi3(d)) boundary " << std::endl;
if(isBoundaryMarked3(phi3(phi1(d))))
std::cout << "phi3(phi1(d)) boundary " << std::endl;
}
if(isBoundaryMarked3(d))
{
std::vector<Dart> vbound;
// for(Dart d = begin(); d != end(); next(d))
// {
// if(isBoundaryMarked3(d) && !isBoundaryMarked3(phi3(d)))
// {
// vbound.push_back(d);
// }
// }
//
// std::cout << "vbound size = " << vbound.size() << std::endl;
//
// for(std::vector<Dart>::iterator it = vbound.begin() ; it != vbound.end() ; ++it)
// {
// Dart d = *it;
// //Dart d3 = phi3(d);
// phi3unsew(d);
// //phi3unsew(d3);
// }
//
// //std::cout << "nb faces : " << closeMap() << std::endl;
//