Commit a119b8e3 authored by untereiner's avatar untereiner

changes to MRDAT import and ihm2 management (introducing CPH edge tagging)

parent e64e829b
......@@ -101,6 +101,7 @@ public:
unsigned int newEmb = vID[children[0]->indices[idx]] ;
if(oldEmb == EMBNULL)
{
//std::cout << "oldEmb == NULL"<< std::endl;
map.template setOrbitEmbedding<VERTEX>(dd, newEmb) ;
map.pushLevel() ;
for(unsigned int i = map.getCurrentLevel() + 1; i <= map.getMaxLevel(); ++i)
......@@ -111,11 +112,16 @@ public:
map.popLevel() ;
}
else
{
//std::cout << "oldEmb != NULL"<< std::endl;
assert(oldEmb == newEmb) ;
}
map.decCurrentLevel() ;
it = next ;
} while(it != d) ;
//embed the 4 children (begin with the center child)
map.incCurrentLevel() ;
Dart d0 = map.phi2(map.phi1(d)) ;
children[0]->embed<PFP>(map, d0, vID) ;
......@@ -155,6 +161,7 @@ public:
std::vector<QuadTreeNode*> roots ;
std::vector<Dart> darts ;
std::vector<unsigned int> verticesID ;
unsigned int depth;
~QuadTree()
{
......
......@@ -77,7 +77,8 @@ bool importMRDAT(typename PFP::MAP& map, const std::string& filename, std::vecto
std::stringstream oss(line) ;
std::string s ;
oss >> s ;
oss >> depth ;
oss >> qt.depth ;
depth = qt.depth;
}
std::cout << " MR depth -> " << depth << std::endl ;
......@@ -253,19 +254,6 @@ bool importMRDAT(typename PFP::MAP& map, const std::string& filename, std::vecto
return false ;
}
std::cout << "..done" << std::endl ;
std::cout << " Create finer resolution levels.." << std::flush ;
for(unsigned int i = 0; i < depth; ++i)
map.addNewLevel(false) ;
std::cout << "..done" << std::endl ;
std::cout << " Embed finer resolution levels.." << std::flush ;
map.setCurrentLevel(0) ;
qt.embed<PFP>(map) ;
map.setCurrentLevel(map.getMaxLevel()) ;
std::cout << "..done" << std::endl ;
return true ;
......
......@@ -39,8 +39,8 @@ namespace Regular
template <typename PFP>
IHM2<PFP>::IHM2(typename PFP::MAP& map) :
m_map(map),
shareVertexEmbeddings(true)
m_map(map),
shareVertexEmbeddings(true)
{
}
......@@ -49,109 +49,113 @@ IHM2<PFP>::IHM2(typename PFP::MAP& map) :
template <typename PFP>
void IHM2<PFP>::addNewLevel(bool triQuad)
{
unsigned int cur = m_map.getCurrentLevel() ; //pushLevel
unsigned int cur = m_map.getCurrentLevel() ; //pushLevel
m_map.setCurrentLevel(m_map.getMaxLevel() + 1) ;
// cut edges
TraversorE<typename PFP::MAP> travE(m_map) ;
for (Dart d = travE.begin(); d != travE.end(); d = travE.next())
{
Dart dd = m_map.phi2(d) ;
m_map.cutEdge(d) ;
unsigned int eId = m_map.getEdgeId(d) ;
m_map.setEdgeId(m_map.phi1(d), eId) ;
m_map.setEdgeId(m_map.phi1(dd), eId) ;
travE.skip(d) ;
travE.skip(m_map.phi1(d)) ;
}
// split faces
TraversorF<typename PFP::MAP> travF(m_map) ;
for (Dart d = travF.begin(); d != travF.end(); d = travF.next())
{
Dart old = d ;
if(m_map.getDartLevel(old) == m_map.getMaxLevel())
old = m_map.phi1(old) ;
m_map.decCurrentLevel();
unsigned int degree = m_map.faceDegree(old) ;
m_map.incCurrentLevel();
if((degree == 3) && triQuad) // if subdividing a triangle
{
Dart dd = m_map.phi1(old) ;
Dart e = m_map.phi1(m_map.phi1(dd)) ;
m_map.splitFace(dd, e) ; // insert a new edge
travF.skip(dd) ;
unsigned int id = m_map.getNewEdgeId() ;
m_map.setEdgeId(m_map.phi_1(dd), id) ; // set the edge id of the inserted
m_map.setEdgeId(m_map.phi_1(e), id) ; // edge to the next available id
dd = e ;
e = m_map.phi1(m_map.phi1(dd)) ;
m_map.splitFace(dd, e) ;
travF.skip(dd) ;
id = m_map.getNewEdgeId() ;
m_map.setEdgeId(m_map.phi_1(dd), id) ;
m_map.setEdgeId(m_map.phi_1(e), id) ;
dd = e ;
e = m_map.phi1(m_map.phi1(dd)) ;
m_map.splitFace(dd, e) ;
travF.skip(dd) ;
id = m_map.getNewEdgeId() ;
m_map.setEdgeId(m_map.phi_1(dd), id) ;
m_map.setEdgeId(m_map.phi_1(e), id) ;
travF.skip(e) ;
}
else // if subdividing a polygonal face
{
Dart dd = m_map.phi1(old) ;
Dart next = m_map.phi1(m_map.phi1(dd)) ;
m_map.splitFace(dd, next) ; // insert a first edge
Dart ne = m_map.phi2(m_map.phi_1(dd)) ;
Dart ne2 = m_map.phi2(ne) ;
m_map.cutEdge(ne) ; // cut the new edge to insert the central vertex
travF.skip(dd) ;
unsigned int id = m_map.getNewEdgeId() ;
m_map.setEdgeId(ne, id) ;
m_map.setEdgeId(m_map.phi2(ne), id) ; // set the edge id of the inserted
id = m_map.getNewEdgeId() ;
m_map.setEdgeId(ne2, id) ; // edges to the next available ids
m_map.setEdgeId(m_map.phi2(ne2), id) ;
dd = m_map.phi1(m_map.phi1(next)) ;
while(dd != ne) // turn around the face and insert new edges
{ // linked to the central vertex
Dart tmp = m_map.phi1(ne) ;
m_map.splitFace(tmp, dd) ;
travF.skip(tmp) ;
Dart nne = m_map.phi2(m_map.phi_1(dd)) ;
id = m_map.getNewEdgeId() ;
m_map.setEdgeId(nne, id) ;
m_map.setEdgeId(m_map.phi2(nne), id) ;
dd = m_map.phi1(m_map.phi1(dd)) ;
}
travF.skip(ne) ;
}
}
m_map.setCurrentLevel(cur) ;
// cut edges
TraversorE<typename PFP::MAP> travE(m_map) ;
for (Dart d = travE.begin(); d != travE.end(); d = travE.next())
{
Dart dd = m_map.phi2(d) ;
m_map.cutEdge(d) ;
unsigned int eId = m_map.getEdgeId(d) ;
m_map.setEdgeId(m_map.phi1(d), eId) ;
m_map.setEdgeId(m_map.phi1(dd), eId) ;
travE.skip(d) ;
travE.skip(m_map.phi1(d)) ;
}
// split faces
TraversorF<typename PFP::MAP> travF(m_map) ;
for (Dart d = travF.begin(); d != travF.end(); d = travF.next())
{
Dart old = d ;
if(m_map.getDartLevel(old) == m_map.getMaxLevel())
old = m_map.phi1(old) ;
m_map.decCurrentLevel();
unsigned int degree = m_map.faceDegree(old) ;
m_map.incCurrentLevel();
if((degree == 3) && triQuad) // if subdividing a triangle
{
Dart dd = m_map.phi1(old) ;
Dart e = m_map.phi1(m_map.phi1(dd)) ;
m_map.splitFace(dd, e) ; // insert a new edge
travF.skip(dd) ;
//unsigned int id = m_map.getNewEdgeId() ;
unsigned int id = m_map.getTriRefinementEdgeId(m_map.phi_1(dd));
m_map.setEdgeId(m_map.phi_1(dd), id) ; // set the edge id of the inserted
m_map.setEdgeId(m_map.phi_1(e), id) ; // edge to the next available id
dd = e ;
e = m_map.phi1(m_map.phi1(dd)) ;
m_map.splitFace(dd, e) ;
travF.skip(dd) ;
//id = m_map.getNewEdgeId() ;
id = m_map.getTriRefinementEdgeId(m_map.phi_1(dd));
m_map.setEdgeId(m_map.phi_1(dd), id) ;
m_map.setEdgeId(m_map.phi_1(e), id) ;
dd = e ;
e = m_map.phi1(m_map.phi1(dd)) ;
m_map.splitFace(dd, e) ;
travF.skip(dd) ;
//id = m_map.getNewEdgeId() ;
id = m_map.getTriRefinementEdgeId(m_map.phi_1(dd));
m_map.setEdgeId(m_map.phi_1(dd), id) ;
m_map.setEdgeId(m_map.phi_1(e), id) ;
travF.skip(e) ;
}
else // if subdividing a polygonal face
{
Dart dd = m_map.phi1(old) ;
Dart next = m_map.phi1(m_map.phi1(dd)) ;
m_map.splitFace(dd, next) ; // insert a first edge
Dart ne = m_map.phi2(m_map.phi_1(dd)) ;
Dart ne2 = m_map.phi2(ne) ;
m_map.cutEdge(ne) ; // cut the new edge to insert the central vertex
travF.skip(dd) ;
//unsigned int id = m_map.getNewEdgeId() ;
unsigned int id = m_map.getQuadRefinementEdgeId(m_map.phi2(ne));
m_map.setEdgeId(ne, id) ;
m_map.setEdgeId(m_map.phi2(ne), id) ; // set the edge id of the inserted
//id = m_map.getNewEdgeId() ;
id = m_map.getQuadRefinementEdgeId(ne2);
m_map.setEdgeId(ne2, id) ; // edges to the next available ids
m_map.setEdgeId(m_map.phi2(ne2), id) ;
dd = m_map.phi1(m_map.phi1(next)) ;
while(dd != ne) // turn around the face and insert new edges
{ // linked to the central vertex
Dart tmp = m_map.phi1(ne) ;
m_map.splitFace(tmp, dd) ;
travF.skip(tmp) ;
Dart nne = m_map.phi2(m_map.phi_1(dd)) ;
//id = m_map.getNewEdgeId() ;
id = m_map.getQuadRefinementEdgeId(m_map.phi2(nne));
m_map.setEdgeId(nne, id) ;
m_map.setEdgeId(m_map.phi2(nne), id) ;
dd = m_map.phi1(m_map.phi1(dd)) ;
}
travF.skip(ne) ;
}
}
m_map.setCurrentLevel(cur) ;
}
template <typename PFP>
void IHM2<PFP>::addLevelFront()
{
DartMarker md(m_map);
std::vector<Dart> visitedVertices;
visitedVertices.reserve(1024);
std::vector<Dart> irregVertices;
irregVertices.reserve(1024);
//look for an irregular vertex
......@@ -162,77 +166,154 @@ void IHM2<PFP>::addLevelFront()
if(m_map.vertexDegree(d) != 6)
{
found = true;
visitedVertices.push_back(d);
irregVertices.push_back(d);
}
}
std::cout << "d = " << visitedVertices[0] << std::endl;
//found the number of levels
bool finished = false;
Dart dit = irregVertices[0];
unsigned int nbSteps = 0;
do
{
dit = m_map.phi1(m_map.phi2(m_map.phi1(m_map.phi2(m_map.phi1(dit)))));
++nbSteps;
if(m_map.vertexDegree(m_map.phi1(dit)) != 6)
finished = true;
}while(!finished);
for(unsigned int i = 0 ; i < visitedVertices.size() ; ++i)
++nbSteps;
unsigned int nbLevel = 0;
while(nbSteps > 1)
{
Dart d = visitedVertices[i];
nbSteps /= 2 ;
++nbLevel ;
}
m_map.setMaxLevel(nbLevel);
std::cout << "nb levels = " << nbLevel+1 << std::endl;
Traversor2VE<typename PFP::MAP> tve(m_map, d);
for(Dart eit = tve.begin() ; eit != tve.end() ; eit = tve.next())
unsigned int curLevel = nbLevel;
do
{
m_map.setCurrentLevel(curLevel);
DartMarker md(m_map);
std::vector<Dart> visitedVertices(irregVertices);
std::cout << "getCurrentLevel = " << m_map.getCurrentLevel() << std::endl;
for(unsigned int i = 0 ; i < visitedVertices.size() ; ++i)
{
//coarse all faces around the vertex
if(!md.isMarked(eit))
{
unsigned int degree = m_map.faceDegree(eit);
Dart d = visitedVertices[i];
if(degree == 3)
Traversor2VE<typename PFP::MAP> tve(m_map, d);
for(Dart eit = tve.begin() ; eit != tve.end() ; eit = tve.next())
{
//coarse all faces around the vertex
if(!md.isMarked(eit))
{
Dart fit1 = m_map.phi2(m_map.phi1(eit));
Dart fit2 = m_map.phi1(fit1);
Dart fit3 = m_map.phi1(fit2);
unsigned int id = m_map.getNewEdgeId() ;
m_map.setEdgeId(fit1, id) ;
id = m_map.getNewEdgeId() ;
m_map.setEdgeId(fit2, id) ;
id = m_map.getNewEdgeId() ;
m_map.setEdgeId(fit3, id) ;
md.markOrbit<FACE>(fit1);
md.markOrbit<FACE>(m_map.phi2(fit2));
md.markOrbit<FACE>(m_map.phi2(fit3));
md.markOrbit<FACE>(eit);
visitedVertices.push_back(m_map.phi_1(m_map.phi2(fit2)));
visitedVertices.push_back(m_map.phi_1(m_map.phi2(fit3)));
m_map.setDartLevel(fit1, curLevel);
m_map.setDartLevel(m_map.phi2(fit1), curLevel);
m_map.setDartLevel(m_map.phi1(m_map.phi2(fit1)), curLevel);
m_map.setDartLevel(fit2, curLevel);
m_map.setDartLevel(m_map.phi2(fit2), curLevel);
m_map.setDartLevel(m_map.phi1(m_map.phi2(fit2)), curLevel);
m_map.setDartLevel(fit3, curLevel);
m_map.setDartLevel(m_map.phi2(fit3), curLevel);
m_map.setDartLevel(m_map.phi1(m_map.phi2(fit3)), curLevel);
if(curLevel == maxLevel)
{
unsigned int id = m_map.getTriRefinementEdgeId(m_map.phi2(fit1));
m_map.setEdgeId(m_map.phi2(fit1), id);
m_map.setEdgeId(fit1, id);
id = m_map.getTriRefinementEdgeId(m_map.phi2(fit2));
m_map.setEdgeId(m_map.phi2(fit2), id);
m_map.setEdgeId(fit2, id);
id = m_map.getTriRefinementEdgeId(m_map.phi2(fit3));
m_map.setEdgeId(m_map.phi2(fit3), id);
m_map.setEdgeId(fit3, id);
}
else
{
}
// if(curLevel == 2)
// {
// unsigned int id = m_map.getTriRefinementEdgeId(m_map.phi2(fit1));
// m_map.setEdgeId(m_map.phi2(fit1), id);
// m_map.setEdgeId(fit1, id);
//m_map.setEdgeId(fit1, id);
// /std::cout << "fit1 = " << fit1 << std::endl;
//std::cout << "m_map.phi2(fit1) = " << m_map.phi2(fit1) << std::endl;
// id = m_map.getTriRefinementEdgeId(m_map.phi2(fit2));
// m_map.setEdgeId(m_map.phi2(fit2), id);
// m_map.setEdgeId(fit2, id);
//m_map.setEdgeId(fit2, id);
//std::cout << "fit2 = " << fit2 << std::endl;
//std::cout << "m_map.phi2(fit2) = " << m_map.phi2(fit2) << std::endl;
// id = m_map.getTriRefinementEdgeId(m_map.phi2(fit3));
// m_map.setEdgeId(m_map.phi2(fit3), id);
// m_map.setEdgeId(fit3, id);
//m_map.setEdgeId(fit3, id);
//std::cout << "fit3 = " << fit3 << std::endl;
//std::cout << "m_map.phi2(fit3) = " << m_map.phi2(fit3) << std::endl;
// }
}
else
{
}
}
}
curLevel = curLevel - 1;
visitedVertices.push_back(m_map.phi1(m_map.phi1(eit)));
visitedVertices.push_back(m_map.phi_1(m_map.phi_1(eit)));
md.markOrbit<FACE>(eit);
}while(curLevel > 1);
}
}
}
m_map.setCurrentLevel(nbLevel); //m_maxLevel
}
template <typename PFP>
void IHM2<PFP>::analysis()
{
assert(m_map.getCurrentLevel() > 0 || !"analysis : called on level 0") ;
assert(m_map.getCurrentLevel() > 0 || !"analysis : called on level 0") ;
m_map.decCurrentLevel() ;
m_map.decCurrentLevel() ;
for(unsigned int i = 0; i < analysisFilters.size(); ++i)
(*analysisFilters[i])() ;
for(unsigned int i = 0; i < analysisFilters.size(); ++i)
(*analysisFilters[i])() ;
}
template <typename PFP>
void IHM2<PFP>::synthesis()
{
assert(m_map.getCurrentLevel() < m_map.getMaxLevel() || !"synthesis : called on max level") ;
assert(m_map.getCurrentLevel() < m_map.getMaxLevel() || !"synthesis : called on max level") ;
for(unsigned int i = 0; i < synthesisFilters.size(); ++i)
(*synthesisFilters[i])() ;
for(unsigned int i = 0; i < synthesisFilters.size(); ++i)
(*synthesisFilters[i])() ;
m_map.incCurrentLevel() ;
m_map.incCurrentLevel() ;
}
} // namespace Regular
......
......@@ -75,7 +75,7 @@ public:
np2 += m_position[dd] ;
dd = m_map.phi1(dd) ;
} while(dd != end) ;
it = m_map.alpha1(it) ;
it = m_map.phi2(m_map.phi_1(it)) ;
} while(it != d) ;
float beta = 3.0 / (2.0 * degree1) ;
......
......@@ -68,7 +68,7 @@ public:
~Map2MR();
//if true : tri and quad else quad
void addNewLevel(bool triQuad = true) ;
void addNewLevel(bool triQuad = true, bool embedNewVertices = false) ;
void addNewLevelSqrt3();
......@@ -84,6 +84,8 @@ public:
void synthesis() ;
void addLevelFront();
void import(Algo::Surface::Import::QuadTree& qt);
} ;
} // namespace Regular
......
......@@ -22,6 +22,8 @@
* *
*******************************************************************************/
#include "Algo/Import/importMRDAT.h"
namespace CGoGN
{
......@@ -62,7 +64,7 @@ Map2MR<PFP>::~Map2MR()
}
template <typename PFP>
void Map2MR<PFP>::addNewLevel(bool triQuad)
void Map2MR<PFP>::addNewLevel(bool triQuad, bool embedNewVertices)
{
m_map.pushLevel() ;
......@@ -74,18 +76,22 @@ void Map2MR<PFP>::addNewLevel(bool triQuad)
TraversorE<typename PFP::MAP> travE(m_map) ;
for (Dart d = travE.begin(); d != travE.end(); d = travE.next())
{
// if(!shareVertexEmbeddings)
// {
// if(m_map.template getEmbedding<VERTEX>(d) == EMBNULL)
// m_map.template setOrbitEmbeddingOnNewCell<VERTEX>(d) ;
// if(m_map.template getEmbedding<VERTEX>(m_map.phi1(d)) == EMBNULL)
// m_map.template setOrbitEmbeddingOnNewCell<VERTEX>(d) ;
// }
// if(!shareVertexEmbeddings && embedNewVertices)
// {
// if(m_map.template getEmbedding<VERTEX>(d) == EMBNULL)
// m_map.template setOrbitEmbeddingOnNewCell<VERTEX>(d) ;
// if(m_map.template getEmbedding<VERTEX>(m_map.phi1(d)) == EMBNULL)
// m_map.template setOrbitEmbeddingOnNewCell<VERTEX>(d) ;
// }
m_map.cutEdge(d) ;
travE.skip(d) ;
travE.skip(m_map.phi1(d)) ;
//std::cout << "is EMB NULL : " << ( m_map.template getEmbedding<VERTEX>(m_map.phi1(d)) == EMBNULL ? "true" : "false" ) << std::endl;
//if(embedNewVertices)
// m_map.template setOrbitEmbeddingOnNewCell<VERTEX>(m_map.phi1(d)) ;
}
// split faces
......@@ -129,6 +135,9 @@ void Map2MR<PFP>::addNewLevel(bool triQuad)
m_map.cutEdge(ne) ; // cut the new edge to insert the central vertex
travF.skip(dd) ;
//if(embedNewVertices)
// m_map.template setOrbitEmbeddingOnNewCell<VERTEX>(m_map.phi1(ne)) ;
dd = m_map.phi1(m_map.phi1(next)) ;
while(dd != ne) // turn around the face and insert new edges
{ // linked to the central vertex
......@@ -342,6 +351,24 @@ void Map2MR<PFP>::addLevelFront()
}
}
template <typename PFP>
void Map2MR<PFP>::import(Algo::Surface::Import::QuadTree& qt)
{
std::cout << " Create finer resolution levels.." << std::flush ;
for(unsigned int i = 0; i < qt.depth; ++i)
addNewLevel(true, false) ;
std::cout << "..done" << std::endl ;
std::cout << " Embed finer resolution levels.." << std::flush ;
m_map.setCurrentLevel(0) ;
qt.embed<PFP>(m_map) ;
m_map.setCurrentLevel(m_map.getMaxLevel()) ;
std::cout << "..done" << std::endl ;
}
} // namespace Regular
......
......@@ -281,7 +281,7 @@ public:
/**
* duplicate darts from level-1 to level
*/
void duplicateDarts(unsigned int level);
void duplicateDarts(unsigned int newlevel);
/**
* duplicate a dart starting from current level
......
......@@ -141,6 +141,8 @@ public:
void setDartLevel(Dart d, unsigned int i) ;
void setMaxLevel(unsigned int l);
/***************************************************
* EDGE ID MANAGEMENT *
***************************************************/
......@@ -159,6 +161,10 @@ public:
void setEdgeId(Dart d, unsigned int i) ;
unsigned int getTriRefinementEdgeId(Dart d);
unsigned int getQuadRefinementEdgeId(Dart d);
/***************************************************
* CELLS INFORMATION *
***************************************************/
......