From adcec296362ccbd393e14a0a1be0fbecf2d3629d Mon Sep 17 00:00:00 2001 From: Sylvain Thery Date: Thu, 27 Oct 2011 16:31:37 +0200 Subject: [PATCH] ajout des fonctions de markage des brins du bord --- include/Topology/generic/dartmarker.h | 58 ------------------------- include/Topology/generic/functor.h | 62 +++++++++++++++++++++++++++ include/Topology/generic/genericmap.h | 36 ++++++++++++++++ src/Topology/generic/genericmap.cpp | 46 ++++++++++++++++++++ 4 files changed, 144 insertions(+), 58 deletions(-) diff --git a/include/Topology/generic/dartmarker.h b/include/Topology/generic/dartmarker.h index 5beae22e..4b5c93cb 100644 --- a/include/Topology/generic/dartmarker.h +++ b/include/Topology/generic/dartmarker.h @@ -32,64 +32,6 @@ namespace CGoGN { -// Marker Functors -/********************************************************/ - -template -class FunctorMarker : public FunctorMap -{ -protected: - Mark m_mark ; - AttributeMultiVector* m_markTable ; -public: - FunctorMarker(MAP& map, Mark m, AttributeMultiVector* mTable) : FunctorMap(map), m_mark(m), m_markTable(mTable) - {} -// Mark getMark() { return m_mark ; } -} ; - -template -class FunctorMark : public FunctorMarker -{ -public: - FunctorMark(MAP& map, Mark m, AttributeMultiVector* mTable) : FunctorMarker(map, m, mTable) - {} - bool operator()(Dart d) - { - this->m_markTable->operator[](d.index).setMark(this->m_mark) ; - return false ; - } -} ; - -template -class FunctorMarkStore : public FunctorMarker -{ -protected: - std::vector& m_markedDarts ; -public: - FunctorMarkStore(MAP& map, Mark m, AttributeMultiVector* mTable, std::vector& marked) : - FunctorMarker(map, m, mTable), - m_markedDarts(marked) - {} - bool operator()(Dart d) - { - this->m_markTable->operator[](d.index).setMark(this->m_mark) ; - m_markedDarts.push_back(d.index) ; - return false ; - } -} ; - -template -class FunctorUnmark : public FunctorMarker -{ -public: - FunctorUnmark(MAP& map, Mark m, AttributeMultiVector* mTable) : FunctorMarker(map, m, mTable) - {} - bool operator()(Dart d) - { - this->m_markTable->operator[](d.index).unsetMark(this->m_mark) ; - return false ; - } -} ; /** * generic class that allows the marking of darts diff --git a/include/Topology/generic/functor.h b/include/Topology/generic/functor.h index 9791bd6d..f33f3e04 100644 --- a/include/Topology/generic/functor.h +++ b/include/Topology/generic/functor.h @@ -27,6 +27,7 @@ #include "Topology/generic/dart.h" #include "Topology/generic/marker.h" +#include "Container/attributeMultiVector.h" #include namespace CGoGN @@ -174,6 +175,67 @@ public: } }; + +// Marker Functors +/********************************************************/ + +template +class FunctorMarker : public FunctorMap +{ +protected: + Mark m_mark ; + AttributeMultiVector* m_markTable ; +public: + FunctorMarker(MAP& map, Mark m, AttributeMultiVector* mTable) : FunctorMap(map), m_mark(m), m_markTable(mTable) + {} +// Mark getMark() { return m_mark ; } +} ; + +template +class FunctorMark : public FunctorMarker +{ +public: + FunctorMark(MAP& map, Mark m, AttributeMultiVector* mTable) : FunctorMarker(map, m, mTable) + {} + bool operator()(Dart d) + { + this->m_markTable->operator[](d.index).setMark(this->m_mark) ; + return false ; + } +} ; + +template +class FunctorMarkStore : public FunctorMarker +{ +protected: + std::vector& m_markedDarts ; +public: + FunctorMarkStore(MAP& map, Mark m, AttributeMultiVector* mTable, std::vector& marked) : + FunctorMarker(map, m, mTable), + m_markedDarts(marked) + {} + bool operator()(Dart d) + { + this->m_markTable->operator[](d.index).setMark(this->m_mark) ; + m_markedDarts.push_back(d.index) ; + return false ; + } +} ; + +template +class FunctorUnmark : public FunctorMarker +{ +public: + FunctorUnmark(MAP& map, Mark m, AttributeMultiVector* mTable) : FunctorMarker(map, m, mTable) + {} + bool operator()(Dart d) + { + this->m_markTable->operator[](d.index).unsetMark(this->m_mark) ; + return false ; + } +} ; + + } //namespace CGoGN #endif diff --git a/include/Topology/generic/genericmap.h b/include/Topology/generic/genericmap.h index b2a72017..513e6924 100644 --- a/include/Topology/generic/genericmap.h +++ b/include/Topology/generic/genericmap.h @@ -403,6 +403,42 @@ public: * print attributes name of map in std::cout (for debugging) */ void viewAttributesTables(); + + +protected: + /// boundary marker + Mark m_boundaryMarker; + + /** + * mark a dart as belonging to boundary + */ + void boundaryMark(Dart d); + + /** + * unmark a dart from the boundary + */ + void boundaryUnmark(Dart d); + + /** + * test if a dart belong to the boundary + */ + bool isBoundaryMarked(Dart d); + + /** + * mark an orbit of dart as belonging to boundary + */ + void boundaryMarkOrbit(unsigned int orbit, Dart d); + + /** + * unmark an orbit of dart from the boundary + */ + void boundaryUnmarkOrbit(unsigned int orbit, Dart d); + + /** + * clear all boundary markers + */ + void boundaryUnmarkAll(); + } ; diff --git a/src/Topology/generic/genericmap.cpp b/src/Topology/generic/genericmap.cpp index 4dae6e32..f54f52c4 100644 --- a/src/Topology/generic/genericmap.cpp +++ b/src/Topology/generic/genericmap.cpp @@ -78,10 +78,16 @@ GenericMap::GenericMap() : m_nbThreads(1) m_markTables[i][j] = NULL ; } } + + // get & lock marker for boundary + m_boundaryMarker = m_marksets[DART][0].getNewMark(); } GenericMap::~GenericMap() { + // release marker for boundary + m_marksets[DART][0].releaseMark(m_boundaryMarker); + for(unsigned int i = 0; i < NB_ORBITS; ++i) { if(isOrbitEmbedded(i)) @@ -641,4 +647,44 @@ void GenericMap::viewAttributesTables() } + +void GenericMap::boundaryMark(Dart d) +{ + m_markTables[DART][0]->operator[](d.index).setMark(m_boundaryMarker); +} + +void GenericMap::boundaryUnmark(Dart d) +{ + m_markTables[DART][0]->operator[](d.index).unsetMark(m_boundaryMarker); +} + +bool GenericMap::isBoundaryMarked(Dart d) +{ + return m_markTables[DART][0]->operator[](d.index).testMark(m_boundaryMarker); +} + + +void GenericMap::boundaryMarkOrbit(unsigned int orbit, Dart d) +{ + FunctorMark fm(*this, m_boundaryMarker, m_markTables[DART][0]) ; + foreach_dart_of_orbit(orbit, d, fm, 0) ; +} + + +void GenericMap::boundaryUnmarkOrbit(unsigned int orbit, Dart d) +{ + FunctorUnmark fm(*this, m_boundaryMarker, m_markTables[DART][0]) ; + foreach_dart_of_orbit(orbit, d, fm, 0) ; +} + + +void GenericMap::boundaryUnmarkAll() +{ + AttributeContainer& cont = getAttributeContainer(DART) ; + for (unsigned int i = cont.begin(); i != cont.end(); cont.next(i)) + m_markTables[DART][0]->operator[](i).unsetMark(m_boundaryMarker); +} + + + } // namespace CGoGN -- GitLab