From 6cfb06390152de2fc6b944a48498f8c4175612f3 Mon Sep 17 00:00:00 2001 From: untereiner Date: Thu, 4 Oct 2012 17:12:55 +0200 Subject: [PATCH] MR Progressive Mesh for 2maps are working ! --- include/Algo/Decimation/edgeSelector.h | 14 ++-- include/Algo/Decimation/edgeSelector.hpp | 10 +-- include/Algo/Decimation/selector.h | 2 +- .../Algo/Multiresolution/map2MR/map2MR_PM.hpp | 78 +++++++++---------- include/Topology/generic/genericmap.hpp | 18 +++-- src/Topology/map/map2.cpp | 4 +- 6 files changed, 66 insertions(+), 60 deletions(-) diff --git a/include/Algo/Decimation/edgeSelector.h b/include/Algo/Decimation/edgeSelector.h index d6be8cc1..ccf91d9d 100644 --- a/include/Algo/Decimation/edgeSelector.h +++ b/include/Algo/Decimation/edgeSelector.h @@ -66,7 +66,7 @@ public: {} void updateAfterCollapse(Dart d2, Dart dd2) ; - bool nextEdgeWithoutUpdates(Dart& d) { } + void updateWithoutCollapse() { } } ; template @@ -97,7 +97,7 @@ public: {} void updateAfterCollapse(Dart d2, Dart dd2) ; - bool nextEdgeWithoutUpdates(Dart& d) { } + void updateWithoutCollapse() { } } ; template @@ -142,7 +142,7 @@ public: void updateBeforeCollapse(Dart d) ; void updateAfterCollapse(Dart d2, Dart dd2) ; - bool nextEdgeWithoutUpdates(Dart& d) { } + void updateWithoutCollapse() { } } ; template @@ -194,7 +194,7 @@ public: void updateBeforeCollapse(Dart d) ; void updateAfterCollapse(Dart d2, Dart dd2) ; - bool nextEdgeWithoutUpdates(Dart& d); + void updateWithoutCollapse(); } ; template @@ -246,7 +246,7 @@ public: void updateBeforeCollapse(Dart d) ; void updateAfterCollapse(Dart d2, Dart dd2) ; - bool nextEdgeWithoutUpdates(Dart& d) { } + void updateWithoutCollapse() { } } ; template @@ -344,7 +344,7 @@ public: void updateBeforeCollapse(Dart d) ; void updateAfterCollapse(Dart d2, Dart dd2) ; - bool nextEdgeWithoutUpdates(Dart& d) { } + void updateWithoutCollapse() { } } ; template @@ -392,7 +392,7 @@ public: void updateBeforeCollapse(Dart d) ; void updateAfterCollapse(Dart d2, Dart dd2) ; - bool nextEdgeWithoutUpdates(Dart& d) { } + void updateWithoutCollapse() { } } ; /***************************************************************************************************************** diff --git a/include/Algo/Decimation/edgeSelector.hpp b/include/Algo/Decimation/edgeSelector.hpp index 3723f67d..b7c88c6f 100644 --- a/include/Algo/Decimation/edgeSelector.hpp +++ b/include/Algo/Decimation/edgeSelector.hpp @@ -480,19 +480,17 @@ void EdgeSelector_QEM::computeEdgeInfo(Dart d, EdgeInfo& einfo) } template -bool EdgeSelector_QEM::nextEdgeWithoutUpdates(Dart& d) +void EdgeSelector_QEM::updateWithoutCollapse() { - if(cur == edges.end() || edges.empty()) - return false ; - EdgeInfo& einfo = edgeInfo[(*cur).second] ; einfo.valid = false ; edges.erase(einfo.it) ; + + //edges.erase(cur) ; cur = edges.begin(); - d = (*cur).second ; - return true ; } + /************************************************************************************ * QUADRIC ERROR METRIC (Memoryless version) * ************************************************************************************/ diff --git a/include/Algo/Decimation/selector.h b/include/Algo/Decimation/selector.h index 73376d03..9bb143e6 100644 --- a/include/Algo/Decimation/selector.h +++ b/include/Algo/Decimation/selector.h @@ -79,7 +79,7 @@ public: virtual void updateBeforeCollapse(Dart d) = 0 ; virtual void updateAfterCollapse(Dart d2, Dart dd2) = 0 ; - virtual bool nextEdgeWithoutUpdates(Dart& d) = 0; + virtual void updateWithoutCollapse() = 0; } ; } // namespace Decimation diff --git a/include/Algo/Multiresolution/map2MR/map2MR_PM.hpp b/include/Algo/Multiresolution/map2MR/map2MR_PM.hpp index af8537be..90627e2d 100644 --- a/include/Algo/Multiresolution/map2MR/map2MR_PM.hpp +++ b/include/Algo/Multiresolution/map2MR/map2MR_PM.hpp @@ -142,8 +142,9 @@ void Map2MR_PM::addNewLevel(unsigned int percentWantedVertices) unsigned int nbWantedVertices = nbVertices * percentWantedVertices / 100 ; unsigned int nbDeletedVertex=0; - unsigned int percentWantedPerLevel = 20; - unsigned int nbWantedPerLevel = nbWantedVertices * percentWantedPerLevel / 100 ; + unsigned int percentWantedPerLevel = 50; + //unsigned int nbWantedPerLevel = nbWantedVertices * percentWantedPerLevel / 100 ; + unsigned int nbWantedPerLevel = nbVertices * percentWantedPerLevel / 100 ; CGoGNout << " initializing selector.." << CGoGNflush ; m_initOk = m_selector->init() ; @@ -158,9 +159,10 @@ void Map2MR_PM::addNewLevel(unsigned int percentWantedVertices) bool finished = false ; Dart d ; + while(!finished) { - if(!m_selector->nextEdgeWithoutUpdates(d)) + if(!m_selector->nextEdge(d)) break ; if(!me.isMarked(d)) @@ -169,19 +171,21 @@ void Map2MR_PM::addNewLevel(unsigned int percentWantedVertices) Dart dt = d; do { - Traversor2VF tf(m_map, dt) ; + Traversor2VE tf(m_map, dt) ; for(Dart it = tf.begin(); it != tf.end(); it = tf.next()) { - me.markOrbit(it); + me.markOrbit(it); + me.markOrbit(m_map.phi1(it)); } dt = m_map.phi1(dt); }while(dt != d); - Traversor2VF tf(m_map, m_map.phi_1(m_map.phi2(d))) ; + Traversor2VE tf(m_map, m_map.phi_1(m_map.phi2(d))) ; for(Dart it = tf.begin(); it != tf.end(); it = tf.next()) { - me.markOrbit(it); + me.markOrbit(it); + me.markOrbit(m_map.phi1(it)); } ++nbDeletedVertex ; @@ -189,45 +193,39 @@ void Map2MR_PM::addNewLevel(unsigned int percentWantedVertices) edges.push_back(d); } + m_selector->updateWithoutCollapse(); + if(nbDeletedVertex >= nbWantedPerLevel) finished = true ; } + std::cout << "nbDeletedVertices : " << nbDeletedVertex << std::endl; + if(!edges.empty()) + { + //create the new level + m_map.addLevelFront(); + m_map.setCurrentLevel(0); - //create the new level - m_map.addLevelFront(); - m_map.setCurrentLevel(0); + AttributeContainer& attribs = m_map.getMRAttributeContainer(); + AttributeMultiVector* attribLevel = m_map.getMRLevelAttributeVector(); + AttributeMultiVector* attribDarts = m_map.getMRDartAttributeVector(0); - AttributeContainer& attribs = m_map.getMRAttributeContainer(); - AttributeMultiVector* attribLevel = m_map.getMRLevelAttributeVector(); - AttributeMultiVector* attribDarts = m_map.getMRDartAttributeVector(0); + for(unsigned int i = attribs.begin(); i != attribs.end(); attribs.next(i)) + { + if((*attribDarts)[i] == MRNULL) + ++(*attribLevel)[i]; + } - for(unsigned int i = attribs.begin(); i != attribs.end(); attribs.next(i)) - { - if((*attribDarts)[i] == MRNULL) - ++(*attribLevel)[i]; - } + for(std::vector::iterator it = edges.begin() ; it != edges.end() ; ++it) + { +// if(*it == Dart(301459)) +// break; - for(std::vector::iterator it = edges.begin() ; it != edges.end() ; ++it) - { - collapseEdge(*it); + collapseEdge(*it); + } } - -// Dart d2 = m_map.phi2(m_map.phi_1(d)) ; -// Dart dd2 = m_map.phi2(m_map.phi_1(m_map.phi2(d))) ; -// -// m_selector->updateBeforeCollapse(d) ; // update selector -// -// collapseEdge(d); -// -// m_selector->updateAfterCollapse(d2, dd2) ; // update selector -// -// -// CGoGNout << "..done (" << nbDeletedVertex << " vertices)" << CGoGNendl ; -// -// m_map.printMR(); } @@ -244,6 +242,11 @@ void Map2MR_PM::collapseEdge(Dart d) //m_map.printMR(); + m_map.duplicateDartAtOneLevel(m_map.phi2(m_map.phi1(d)), 0); + m_map.duplicateDartAtOneLevel(m_map.phi2(m_map.phi_1(d)), 0); + m_map.duplicateDartAtOneLevel(m_map.phi2(m_map.phi1(m_map.phi2(d))), 0); + m_map.duplicateDartAtOneLevel(m_map.phi2(m_map.phi_1(m_map.phi2(d))), 0); + m_map.duplicateDartAtOneLevel(d, 0); m_map.duplicateDartAtOneLevel(m_map.phi1(d), 0); m_map.duplicateDartAtOneLevel(m_map.phi_1(d), 0); @@ -251,10 +254,7 @@ void Map2MR_PM::collapseEdge(Dart d) m_map.duplicateDartAtOneLevel(m_map.phi_1(m_map.phi2(d)), 0); m_map.duplicateDartAtOneLevel(m_map.phi1(m_map.phi2(d)), 0); - m_map.duplicateDartAtOneLevel(m_map.phi2(m_map.phi1(d)), 0); - m_map.duplicateDartAtOneLevel(m_map.phi2(m_map.phi_1(d)), 0); - m_map.duplicateDartAtOneLevel(m_map.phi2(m_map.phi1(m_map.phi2(d))), 0); - m_map.duplicateDartAtOneLevel(m_map.phi2(m_map.phi_1(m_map.phi2(d))), 0); + //m_map.printMR(); m_map.collapseEdge(d); diff --git a/include/Topology/generic/genericmap.hpp b/include/Topology/generic/genericmap.hpp index 2e8af1b3..8083a804 100644 --- a/include/Topology/generic/genericmap.hpp +++ b/include/Topology/generic/genericmap.hpp @@ -117,6 +117,14 @@ inline void GenericMap::deleteDart(Dart d) if(getDartLevel(d) > m_mrCurrentLevel) { + unsigned int di = (*m_mrDarts[m_mrCurrentLevel + 1])[d.index]; + // si le brin de niveau i pointe sur le meme brin que le niveau i-1 + if(di != index) + { + if(isDartValid(d))//index)) + deleteDartLine(index) ; + } + (*m_mrDarts[m_mrCurrentLevel])[d.index] = MRNULL ; return; } @@ -124,7 +132,7 @@ inline void GenericMap::deleteDart(Dart d) // a MRdart can only be deleted on its insertion level if(getDartLevel(d) == m_mrCurrentLevel) { - if(isDartValid(index)) + if(isDartValid(d))//index)) deleteDartLine(index) ; m_mrattribs.removeLine(d.index); @@ -132,11 +140,11 @@ inline void GenericMap::deleteDart(Dart d) } else { - unsigned int di = (*m_mrDarts[m_mrCurrentLevel - 1])[d.index]; //m_mrDarts[m_mrCurrentLevel - 1]->operator[](d.index) ; + unsigned int di = (*m_mrDarts[m_mrCurrentLevel - 1])[d.index]; // si le brin de niveau i pointe sur le meme brin que le niveau i-1 if(di != index) { - if(isDartValid(index)) + if(isDartValid(d))//index)) deleteDartLine(index) ; } @@ -155,7 +163,7 @@ inline void GenericMap::deleteDartLine(unsigned int index) m_attribs[DART].removeLine(index) ; // free the dart line for (unsigned int t = 0; t < m_nbThreads; ++t) // clear markers of - (*m_markTables[DART][t])[index].clear() ; // the removed dart + (*m_markTables[DART][t])[index].clear() ; // the removed dart for(unsigned int orbit = 0; orbit < NB_ORBITS; ++orbit) { @@ -167,7 +175,7 @@ inline void GenericMap::deleteDartLine(unsigned int index) if(m_attribs[orbit].unrefLine(emb)) // unref the pointed embedding line { for (unsigned int t = 0; t < m_nbThreads; ++t) // and clear its markers if it was - (*m_markTables[orbit][t])[emb].clear() ; // its last unref (and was thus freed) + (*m_markTables[orbit][t])[emb].clear() ; // its last unref (and was thus freed) } } } diff --git a/src/Topology/map/map2.cpp b/src/Topology/map/map2.cpp index ab9eee77..dcf34950 100644 --- a/src/Topology/map/map2.cpp +++ b/src/Topology/map/map2.cpp @@ -260,7 +260,7 @@ Dart Map2::collapseEdge(Dart d, bool delDegenerateFaces) phi2unsew(d); // Unlink the opposite edges Dart f = phi1(e) ; - Dart h = alpha1(e); + Dart h = phi2(phi_1(e)); if (h != e) resV = h; @@ -276,7 +276,7 @@ Dart Map2::collapseEdge(Dart d, bool delDegenerateFaces) f = phi1(d) ; if(resV == NIL) { - h = alpha1(d); + h = phi2(phi_1(d)); if (h != d) resV = h; } -- GitLab