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: ...@@ -101,6 +101,7 @@ public:
unsigned int newEmb = vID[children[0]->indices[idx]] ; unsigned int newEmb = vID[children[0]->indices[idx]] ;
if(oldEmb == EMBNULL) if(oldEmb == EMBNULL)
{ {
//std::cout << "oldEmb == NULL"<< std::endl;
map.template setOrbitEmbedding<VERTEX>(dd, newEmb) ; map.template setOrbitEmbedding<VERTEX>(dd, newEmb) ;
map.pushLevel() ; map.pushLevel() ;
for(unsigned int i = map.getCurrentLevel() + 1; i <= map.getMaxLevel(); ++i) for(unsigned int i = map.getCurrentLevel() + 1; i <= map.getMaxLevel(); ++i)
...@@ -111,11 +112,16 @@ public: ...@@ -111,11 +112,16 @@ public:
map.popLevel() ; map.popLevel() ;
} }
else else
{
//std::cout << "oldEmb != NULL"<< std::endl;
assert(oldEmb == newEmb) ; assert(oldEmb == newEmb) ;
}
map.decCurrentLevel() ; map.decCurrentLevel() ;
it = next ; it = next ;
} while(it != d) ; } while(it != d) ;
//embed the 4 children (begin with the center child)
map.incCurrentLevel() ; map.incCurrentLevel() ;
Dart d0 = map.phi2(map.phi1(d)) ; Dart d0 = map.phi2(map.phi1(d)) ;
children[0]->embed<PFP>(map, d0, vID) ; children[0]->embed<PFP>(map, d0, vID) ;
...@@ -155,6 +161,7 @@ public: ...@@ -155,6 +161,7 @@ public:
std::vector<QuadTreeNode*> roots ; std::vector<QuadTreeNode*> roots ;
std::vector<Dart> darts ; std::vector<Dart> darts ;
std::vector<unsigned int> verticesID ; std::vector<unsigned int> verticesID ;
unsigned int depth;
~QuadTree() ~QuadTree()
{ {
......
...@@ -77,7 +77,8 @@ bool importMRDAT(typename PFP::MAP& map, const std::string& filename, std::vecto ...@@ -77,7 +77,8 @@ bool importMRDAT(typename PFP::MAP& map, const std::string& filename, std::vecto
std::stringstream oss(line) ; std::stringstream oss(line) ;
std::string s ; std::string s ;
oss >> s ; oss >> s ;
oss >> depth ; oss >> qt.depth ;
depth = qt.depth;
} }
std::cout << " MR depth -> " << depth << std::endl ; std::cout << " MR depth -> " << depth << std::endl ;
...@@ -253,19 +254,6 @@ bool importMRDAT(typename PFP::MAP& map, const std::string& filename, std::vecto ...@@ -253,19 +254,6 @@ bool importMRDAT(typename PFP::MAP& map, const std::string& filename, std::vecto
return false ; 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 ; std::cout << "..done" << std::endl ;
return true ; return true ;
......
...@@ -87,7 +87,8 @@ void IHM2<PFP>::addNewLevel(bool triQuad) ...@@ -87,7 +87,8 @@ void IHM2<PFP>::addNewLevel(bool triQuad)
Dart e = m_map.phi1(m_map.phi1(dd)) ; Dart e = m_map.phi1(m_map.phi1(dd)) ;
m_map.splitFace(dd, e) ; // insert a new edge m_map.splitFace(dd, e) ; // insert a new edge
travF.skip(dd) ; travF.skip(dd) ;
unsigned int id = m_map.getNewEdgeId() ; //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(dd), id) ; // set the edge id of the inserted
m_map.setEdgeId(m_map.phi_1(e), id) ; // edge to the next available id m_map.setEdgeId(m_map.phi_1(e), id) ; // edge to the next available id
...@@ -95,7 +96,8 @@ void IHM2<PFP>::addNewLevel(bool triQuad) ...@@ -95,7 +96,8 @@ void IHM2<PFP>::addNewLevel(bool triQuad)
e = m_map.phi1(m_map.phi1(dd)) ; e = m_map.phi1(m_map.phi1(dd)) ;
m_map.splitFace(dd, e) ; m_map.splitFace(dd, e) ;
travF.skip(dd) ; travF.skip(dd) ;
id = m_map.getNewEdgeId() ; //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(dd), id) ;
m_map.setEdgeId(m_map.phi_1(e), id) ; m_map.setEdgeId(m_map.phi_1(e), id) ;
...@@ -103,7 +105,8 @@ void IHM2<PFP>::addNewLevel(bool triQuad) ...@@ -103,7 +105,8 @@ void IHM2<PFP>::addNewLevel(bool triQuad)
e = m_map.phi1(m_map.phi1(dd)) ; e = m_map.phi1(m_map.phi1(dd)) ;
m_map.splitFace(dd, e) ; m_map.splitFace(dd, e) ;
travF.skip(dd) ; travF.skip(dd) ;
id = m_map.getNewEdgeId() ; //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(dd), id) ;
m_map.setEdgeId(m_map.phi_1(e), id) ; m_map.setEdgeId(m_map.phi_1(e), id) ;
...@@ -119,10 +122,12 @@ void IHM2<PFP>::addNewLevel(bool triQuad) ...@@ -119,10 +122,12 @@ void IHM2<PFP>::addNewLevel(bool triQuad)
Dart ne2 = m_map.phi2(ne) ; Dart ne2 = m_map.phi2(ne) ;
m_map.cutEdge(ne) ; // cut the new edge to insert the central vertex m_map.cutEdge(ne) ; // cut the new edge to insert the central vertex
travF.skip(dd) ; travF.skip(dd) ;
unsigned int id = m_map.getNewEdgeId() ; //unsigned int id = m_map.getNewEdgeId() ;
unsigned int id = m_map.getQuadRefinementEdgeId(m_map.phi2(ne));
m_map.setEdgeId(ne, id) ; m_map.setEdgeId(ne, id) ;
m_map.setEdgeId(m_map.phi2(ne), id) ; // set the edge id of the inserted m_map.setEdgeId(m_map.phi2(ne), id) ; // set the edge id of the inserted
id = m_map.getNewEdgeId() ; //id = m_map.getNewEdgeId() ;
id = m_map.getQuadRefinementEdgeId(ne2);
m_map.setEdgeId(ne2, id) ; // edges to the next available ids m_map.setEdgeId(ne2, id) ; // edges to the next available ids
m_map.setEdgeId(m_map.phi2(ne2), id) ; m_map.setEdgeId(m_map.phi2(ne2), id) ;
...@@ -133,7 +138,8 @@ void IHM2<PFP>::addNewLevel(bool triQuad) ...@@ -133,7 +138,8 @@ void IHM2<PFP>::addNewLevel(bool triQuad)
m_map.splitFace(tmp, dd) ; m_map.splitFace(tmp, dd) ;
travF.skip(tmp) ; travF.skip(tmp) ;
Dart nne = m_map.phi2(m_map.phi_1(dd)) ; Dart nne = m_map.phi2(m_map.phi_1(dd)) ;
id = m_map.getNewEdgeId() ; //id = m_map.getNewEdgeId() ;
id = m_map.getQuadRefinementEdgeId(m_map.phi2(nne));
m_map.setEdgeId(nne, id) ; m_map.setEdgeId(nne, id) ;
m_map.setEdgeId(m_map.phi2(nne), id) ; m_map.setEdgeId(m_map.phi2(nne), id) ;
dd = m_map.phi1(m_map.phi1(dd)) ; dd = m_map.phi1(m_map.phi1(dd)) ;
...@@ -148,10 +154,8 @@ void IHM2<PFP>::addNewLevel(bool triQuad) ...@@ -148,10 +154,8 @@ void IHM2<PFP>::addNewLevel(bool triQuad)
template <typename PFP> template <typename PFP>
void IHM2<PFP>::addLevelFront() void IHM2<PFP>::addLevelFront()
{ {
DartMarker md(m_map); std::vector<Dart> irregVertices;
irregVertices.reserve(1024);
std::vector<Dart> visitedVertices;
visitedVertices.reserve(1024);
//look for an irregular vertex //look for an irregular vertex
...@@ -162,11 +166,45 @@ void IHM2<PFP>::addLevelFront() ...@@ -162,11 +166,45 @@ void IHM2<PFP>::addLevelFront()
if(m_map.vertexDegree(d) != 6) if(m_map.vertexDegree(d) != 6)
{ {
found = true; found = true;
visitedVertices.push_back(d); irregVertices.push_back(d);
}
} }
//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);
++nbSteps;
unsigned int nbLevel = 0;
while(nbSteps > 1)
{
nbSteps /= 2 ;
++nbLevel ;
} }
m_map.setMaxLevel(nbLevel);
std::cout << "d = " << visitedVertices[0] << std::endl; std::cout << "nb levels = " << nbLevel+1 << std::endl;
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) for(unsigned int i = 0 ; i < visitedVertices.size() ; ++i)
{ {
...@@ -177,38 +215,81 @@ void IHM2<PFP>::addLevelFront() ...@@ -177,38 +215,81 @@ void IHM2<PFP>::addLevelFront()
{ {
//coarse all faces around the vertex //coarse all faces around the vertex
if(!md.isMarked(eit)) if(!md.isMarked(eit))
{
unsigned int degree = m_map.faceDegree(eit);
if(degree == 3)
{ {
Dart fit1 = m_map.phi2(m_map.phi1(eit)); Dart fit1 = m_map.phi2(m_map.phi1(eit));
Dart fit2 = m_map.phi1(fit1); Dart fit2 = m_map.phi1(fit1);
Dart fit3 = m_map.phi1(fit2); 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>(fit1);
md.markOrbit<FACE>(m_map.phi2(fit2)); md.markOrbit<FACE>(m_map.phi2(fit2));
md.markOrbit<FACE>(m_map.phi2(fit3)); 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 else
{ {
} }
// if(curLevel == 2)
visitedVertices.push_back(m_map.phi1(m_map.phi1(eit))); // {
visitedVertices.push_back(m_map.phi_1(m_map.phi_1(eit))); // unsigned int id = m_map.getTriRefinementEdgeId(m_map.phi2(fit1));
md.markOrbit<FACE>(eit); // 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;
// }
} }
} }
} }
curLevel = curLevel - 1;
}while(curLevel > 1);
m_map.setCurrentLevel(nbLevel); //m_maxLevel
} }
......
...@@ -75,7 +75,7 @@ public: ...@@ -75,7 +75,7 @@ public:
np2 += m_position[dd] ; np2 += m_position[dd] ;
dd = m_map.phi1(dd) ; dd = m_map.phi1(dd) ;
} while(dd != end) ; } while(dd != end) ;
it = m_map.alpha1(it) ; it = m_map.phi2(m_map.phi_1(it)) ;
} while(it != d) ; } while(it != d) ;
float beta = 3.0 / (2.0 * degree1) ; float beta = 3.0 / (2.0 * degree1) ;
......
...@@ -68,7 +68,7 @@ public: ...@@ -68,7 +68,7 @@ public:
~Map2MR(); ~Map2MR();
//if true : tri and quad else quad //if true : tri and quad else quad
void addNewLevel(bool triQuad = true) ; void addNewLevel(bool triQuad = true, bool embedNewVertices = false) ;
void addNewLevelSqrt3(); void addNewLevelSqrt3();
...@@ -84,6 +84,8 @@ public: ...@@ -84,6 +84,8 @@ public:
void synthesis() ; void synthesis() ;
void addLevelFront(); void addLevelFront();
void import(Algo::Surface::Import::QuadTree& qt);
} ; } ;
} // namespace Regular } // namespace Regular
......
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
* * * *
*******************************************************************************/ *******************************************************************************/
#include "Algo/Import/importMRDAT.h"
namespace CGoGN namespace CGoGN
{ {
...@@ -62,7 +64,7 @@ Map2MR<PFP>::~Map2MR() ...@@ -62,7 +64,7 @@ Map2MR<PFP>::~Map2MR()
} }
template <typename PFP> template <typename PFP>
void Map2MR<PFP>::addNewLevel(bool triQuad) void Map2MR<PFP>::addNewLevel(bool triQuad, bool embedNewVertices)
{ {
m_map.pushLevel() ; m_map.pushLevel() ;
...@@ -74,18 +76,22 @@ void Map2MR<PFP>::addNewLevel(bool triQuad) ...@@ -74,18 +76,22 @@ void Map2MR<PFP>::addNewLevel(bool triQuad)
TraversorE<typename PFP::MAP> travE(m_map) ; TraversorE<typename PFP::MAP> travE(m_map) ;
for (Dart d = travE.begin(); d != travE.end(); d = travE.next()) for (Dart d = travE.begin(); d != travE.end(); d = travE.next())
{ {
// if(!shareVertexEmbeddings) // if(!shareVertexEmbeddings && embedNewVertices)
// { // {
// if(m_map.template getEmbedding<VERTEX>(d) == EMBNULL) // if(m_map.template getEmbedding<VERTEX>(d) == EMBNULL)
// m_map.template setOrbitEmbeddingOnNewCell<VERTEX>(d) ; // m_map.template setOrbitEmbeddingOnNewCell<VERTEX>(d) ;
// if(m_map.template getEmbedding<VERTEX>(m_map.phi1(d)) == EMBNULL) // if(m_map.template getEmbedding<VERTEX>(m_map.phi1(d)) == EMBNULL)
// m_map.template setOrbitEmbeddingOnNewCell<VERTEX>(d) ; // m_map.template setOrbitEmbeddingOnNewCell<VERTEX>(d) ;
// } // }
m_map.cutEdge(d) ; m_map.cutEdge(d) ;
travE.skip(d) ; travE.skip(d) ;
travE.skip(m_map.phi1(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 // split faces
...@@ -129,6 +135,9 @@ void Map2MR<PFP>::addNewLevel(bool triQuad) ...@@ -129,6 +135,9 @@ void Map2MR<PFP>::addNewLevel(bool triQuad)
m_map.cutEdge(ne) ; // cut the new edge to insert the central vertex m_map.cutEdge(ne) ; // cut the new edge to insert the central vertex
travF.skip(dd) ; travF.skip(dd) ;
//if(embedNewVertices)
// m_map.template setOrbitEmbeddingOnNewCell<VERTEX>(m_map.phi1(ne)) ;
dd = m_map.phi1(m_map.phi1(next)) ; dd = m_map.phi1(m_map.phi1(next)) ;
while(dd != ne) // turn around the face and insert new edges while(dd != ne) // turn around the face and insert new edges
{ // linked to the central vertex { // linked to the central vertex
...@@ -342,6 +351,24 @@ void Map2MR<PFP>::addLevelFront() ...@@ -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 } // namespace Regular
......
...@@ -281,7 +281,7 @@ public: ...@@ -281,7 +281,7 @@ public:
/** /**
* duplicate darts from level-1 to level * duplicate darts from level-1 to level
*/ */
void duplicateDarts(unsigned int level); void duplicateDarts(unsigned int newlevel);
/** /**
* duplicate a dart starting from current level * duplicate a dart starting from current level
......
...@@ -141,6 +141,8 @@ public: ...@@ -141,6 +141,8 @@ public:
void setDartLevel(Dart d, unsigned int i) ; void setDartLevel(Dart d, unsigned int i) ;
void setMaxLevel(unsigned int l);
/*************************************************** /***************************************************
* EDGE ID MANAGEMENT * * EDGE ID MANAGEMENT *
***************************************************/ ***************************************************/
...@@ -159,6 +161,10 @@ public: ...@@ -159,6 +161,10 @@ public:
void setEdgeId(Dart d, unsigned int i) ; void setEdgeId(Dart d, unsigned int i) ;
unsigned int getTriRefinementEdgeId(Dart d);
unsigned int getQuadRefinementEdgeId(Dart d);
/*************************************************** /***************************************************
* CELLS INFORMATION * * CELLS INFORMATION *
***************************************************/ ***************************************************/
......
...@@ -314,6 +314,12 @@ inline void ImplicitHierarchicalMap2::setDartLevel(Dart d, unsigned int l) ...@@ -314,6 +314,12 @@ inline void ImplicitHierarchicalMap2::setDartLevel(Dart d, unsigned int l)
m_dartLevel[d] = l ; m_dartLevel[d] = l ;
} }
inline void ImplicitHierarchicalMap2::setMaxLevel(unsigned int l)
{
m_maxLevel = l;
}
/*************************************************** /***************************************************
* EDGE ID MANAGEMENT * * EDGE ID MANAGEMENT *
***************************************************/ ***************************************************/
...@@ -333,6 +339,42 @@ inline void ImplicitHierarchicalMap2::setEdgeId(Dart d, unsigned int i) ...@@ -333,6 +339,42 @@ inline void ImplicitHierarchicalMap2::setEdgeId(Dart d, unsigned int i)
m_edgeId[d] = i ; m_edgeId[d] = i ;
} }
inline unsigned int ImplicitHierarchicalMap2::getTriRefinementEdgeId(Dart d)
{
unsigned int dId = getEdgeId(phi_1(d));
unsigned int eId = getEdgeId(phi1(d));
unsigned int id = dId + eId;
if(id == 0)
return 1;
else if(id == 1)
return 2;
else if(id == 2)
if(dId == eId)
return 0;
else
return 1;
//else if(id == 3)
return 0;
}
inline unsigned int ImplicitHierarchicalMap2::getQuadRefinementEdgeId(Dart d)
{
unsigned int eId = getEdgeId(phi1(d));
if(eId == 0)
return 1;
//else if(eId == 1)
return 0;
}
inline void ImplicitHierarchicalMap2::setTriRefinementEdgeId(Dart d)
{
}
/*************************************************** /***************************************************
* CELLS INFORMATION * * CELLS INFORMATION *
***************************************************/ ***************************************************/
......
...@@ -244,13 +244,16 @@ void GenericMap::addLevelBack() ...@@ -244,13 +244,16 @@ void GenericMap::addLevelBack()
std::stringstream ss ; std::stringstream ss ;
ss << "MRdart_"<< newLevel ; ss << "MRdart_"<< newLevel ;