From 21595e5a72a50cc4de7dedc196125f9ecee4473a Mon Sep 17 00:00:00 2001 From: Sylvain Thery Date: Wed, 1 Feb 2012 15:50:03 +0100 Subject: [PATCH] finalize Traversor3 (incident & adjacent) fully operational & tested on map3 & gmap3 --- include/Topology/generic/genericmap.h | 18 +- include/Topology/generic/traversor2.h | 17 +- include/Topology/generic/traversor2.hpp | 31 --- include/Topology/generic/traversor3.h | 337 +++++++++++++++++++----- include/Topology/generic/traversor3.hpp | 226 ++++++++++++---- 5 files changed, 451 insertions(+), 178 deletions(-) diff --git a/include/Topology/generic/genericmap.h b/include/Topology/generic/genericmap.h index 2123f71b..f79cd4b5 100644 --- a/include/Topology/generic/genericmap.h +++ b/include/Topology/generic/genericmap.h @@ -42,20 +42,6 @@ namespace CGoGN { -/* -const unsigned int EMBNULL = 0xffffffff; - -const unsigned int NB_ORBITS = 6; -const unsigned int NB_THREAD = 16; - -const unsigned int VERTEX = 0; -const unsigned int EDGE = 1; -const unsigned int ORIENTED_FACE= 2; -const unsigned int FACE = 3; -const unsigned int VOLUME = 4; -const unsigned int DART = 5; -*/ - /** * Class that allows to browse a map * This is a pure virtual class that can be overloaded in: @@ -129,8 +115,8 @@ protected: AttributeContainer m_mrattribs ; - std::vector< AttributeMultiVector > m_mrDarts; - AttributeMultiVector m_mrLevels; + std::vector< AttributeMultiVector* > m_mrDarts; + AttributeMultiVector* m_mrLevels; unsigned int m_mrCurrentLevel; diff --git a/include/Topology/generic/traversor2.h b/include/Topology/generic/traversor2.h index 956d1f29..b7053fc2 100644 --- a/include/Topology/generic/traversor2.h +++ b/include/Topology/generic/traversor2.h @@ -201,23 +201,16 @@ public: Dart next() ; } ; -// Traverse the edges incident to a given face + +// Traverse the edges incident to a given face (equivalent to vertices) template -class Traversor2FE +class Traversor2FE : public Traversor2FV { -private: - MAP& m ; - Dart start ; - Dart current ; - public: - Traversor2FE(MAP& map, Dart dart) ; - - Dart begin() ; - Dart end() ; - Dart next() ; + Traversor2FE(MAP& map, Dart dart):Traversor2FV(map,dart){} } ; + // Traverse the faces adjacent to a given face through sharing a common vertex template class Traversor2FFaV diff --git a/include/Topology/generic/traversor2.hpp b/include/Topology/generic/traversor2.hpp index 0b6ddb00..9401b0d3 100644 --- a/include/Topology/generic/traversor2.hpp +++ b/include/Topology/generic/traversor2.hpp @@ -355,37 +355,6 @@ Dart Traversor2FV::next() return current ; } -// Traversor2FE - -template -Traversor2FE::Traversor2FE(MAP& map, Dart dart) : m(map), start(dart) -{} - -template -Dart Traversor2FE::begin() -{ - current = start ; - return current ; -} - -template -Dart Traversor2FE::end() -{ - return NIL ; -} - -template -Dart Traversor2FE::next() -{ - if(current != NIL) - { - current = m.phi1(current) ; - if(current == start) - current = NIL ; - } - return current ; -} - // Traversor2FFaV template diff --git a/include/Topology/generic/traversor3.h b/include/Topology/generic/traversor3.h index a2308a8d..a17f6b2c 100644 --- a/include/Topology/generic/traversor3.h +++ b/include/Topology/generic/traversor3.h @@ -26,121 +26,326 @@ #define __TRAVERSOR3_H__ #include "Topology/generic/dart.h" +#include "Topology/generic/traversorCell.h" namespace CGoGN { - -/******************************************************************************* - VERTEX CENTERED TRAVERSALS -*******************************************************************************/ - -// Traverse the edges incident to a given vertex -template -class Traversor3VE +/** + * class Marker for Traversor usefull to combine + * several TraversorXY + */ +template +class MarkerForTraversor { private: - MAP& m ; - Dart start ; - Dart current ; - + MAP& m_map ; + DartMarkerStore* m_dmark ; + CellMarkerStore* m_cmark ; public: - Traversor3VE(MAP& map, Dart dart) ; + MarkerForTraversor(MAP& map, bool forceDartMarker = false, unsigned int thread = 0) ; + ~MarkerForTraversor(); + DartMarkerStore* dmark(); + CellMarkerStore* cmark(); + void mark(Dart d); + void unmark(Dart d); + bool isMarked(Dart d); +} ; +/** + * Generic class Traversor (do not use directly) + * Traverse all Y incident to X + */ +template +class Traversor3XY +{ +private: + MAP& m_map ; + DartMarkerStore* m_dmark ; + CellMarkerStore* m_cmark ; + Dart m_current ; + TraversorDartsOfOrbit m_tradoo; + bool m_allocated; +public: + Traversor3XY(MAP& map, Dart dart, bool forceDartMarker = false, unsigned int thread = 0) ; + Traversor3XY(MAP& map, Dart dart, MarkerForTraversor& tmo, bool forceDartMarker = false, unsigned int thread = 0) ; + ~Traversor3XY(); Dart begin() ; Dart end() ; Dart next() ; } ; -// Traverse the faces incident to a given vertex -template -class Traversor3VF + +/** + * Generic class Traversor (do not use directly) + * Traverse all X adjacent to X by an Y + */ +template +class Traversor3XXaY { private: - MAP& m ; - Dart start ; - Dart current ; + MAP& m_map ; + std::vector m_vecDarts; + std::vector::iterator m_iter; +public: + Traversor3XXaY(MAP& map, Dart dart, bool forceDartMarker = false, unsigned int thread = 0); + + Dart begin(); + Dart end(); + + Dart next(); +}; + + + + +/** + * Traverse vertices incident to volume + */ +template +class Traversor3WV: public Traversor3XY +{ public: - Traversor3VF(MAP& map, Dart dart) ; + Traversor3WV(MAP& m, Dart dart, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XY(m, dart, forceDartMarker, thread) {} +}; - Dart begin() ; - Dart end() ; - Dart next() ; -} ; +/** + * Traverse edges incident to volume + */ +template +class Traversor3WE: public Traversor3XY +{ +public: + Traversor3WE(MAP& m, Dart dart, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XY(m, dart, forceDartMarker, thread) {} +}; -// Traverse the volumes incident to a given vertex +/** + * Traverse faces incident to volume + */ template -class Traversor3VW +class Traversor3WF: public Traversor3XY { -private: - MAP& m ; - Dart start ; - Dart current ; +public: + Traversor3WF(MAP& m, Dart dart, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XY(m, dart, forceDartMarker, thread) {} +}; + +/** + * Traverse vertices incident to face + */ +template +class Traversor3FV: public Traversor3XY +{ public: - Traversor3VW(MAP& map, Dart dart) ; + Traversor3FV(MAP& m, Dart dart, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XY(m, dart, forceDartMarker, thread) {} +}; - Dart begin() ; - Dart end() ; - Dart next() ; -} ; +/** + * Traverse edges incident to face + */ +template +class Traversor3FE: public Traversor3XY +{ +public: + Traversor3FE(MAP& m, Dart dart, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XY(m, dart, forceDartMarker, thread) {} +}; -/******************************************************************************* - EDGE CENTERED TRAVERSALS -*******************************************************************************/ +/** + * Traverse volumes incident to face + */ +template +class Traversor3FW: public Traversor3XY +{ +public: + Traversor3FW(MAP& m, Dart dart, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XY(m, dart, forceDartMarker, thread) {} +}; +/** + * Traverse vertices incident to edge + */ +template +class Traversor3EV: public Traversor3XY +{ +public: + Traversor3EV(MAP& m, Dart dart, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XY(m, dart, forceDartMarker, thread) {} +}; -/******************************************************************************* - FACE CENTERED TRAVERSALS -*******************************************************************************/ +/** + * Traverse faces incident to edge + */ +template +class Traversor3EF: public Traversor3XY +{ +public: + Traversor3EF(MAP& m, Dart dart, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XY(m, dart, forceDartMarker, thread) {} +}; +/** + * Traverse volumes incident to edge + */ +template +class Traversor3EW: public Traversor3XY +{ +public: + Traversor3EW(MAP& m, Dart dart, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XY(m, dart, forceDartMarker, thread) {} +}; -/******************************************************************************* - VOLUME CENTERED TRAVERSALS -*******************************************************************************/ -// Traverse the vertices incident to a given volume -template -class Traversor3WX + +/** + * Traverse edges incident to vertex + */ +template +class Traversor3VE: public Traversor3XY { -private: - MAP& m ; - Dart start ; - Dart current ; - DartMarkerStore* dmark ; - CellMarkerStore* cmark ; - TraversorDartsOfOrbit m_tradoo; +public: + Traversor3VE(MAP& m, Dart dart, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XY(m, dart, forceDartMarker, thread) {} +}; +/** + * Traverse faces incident to vertex + */ +template +class Traversor3VF: public Traversor3XY +{ public: - Traversor3WX(MAP& map, Dart dart, bool forceDartMarker = false, unsigned int thread = 0) ; - ~Traversor3WX(); + Traversor3VF(MAP& m, Dart dart, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XY(m, dart, forceDartMarker, thread) {} +}; - Dart begin() ; - Dart end() ; - Dart next() ; -} ; +/** + * Traverse volumes incident to vertex + */ +template +class Traversor3VW: public Traversor3XY +{ +public: + Traversor3VW(MAP& m, Dart dart, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XY(m, dart, forceDartMarker, thread) {} +}; + + + +/** + * Traverse vertices adjacent to a vertex by an edge + */ +template +class Traversor3VVaE: public Traversor3XXaY +{ +public: + Traversor3VVaE(MAP& m, Dart d, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XXaY(m, d, forceDartMarker, thread) {} +}; + +/** + * Traverse vertices adjacent to a vertex by a face + */ +template +class Traversor3VVaF: public Traversor3XXaY +{ +public: + Traversor3VVaF(MAP& m, Dart d, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XXaY(m, d, forceDartMarker, thread) {} +}; + +/** + * Traverse vertices adjacent to a vertex by a volume + */ +template +class Traversor3VVaW: public Traversor3XXaY +{ +public: + Traversor3VVaW(MAP& m, Dart d, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XXaY(m, d, forceDartMarker, thread) {} +}; + + +/** + * Traverse edges adjacent to an egde by a vertex + */ +template +class Traversor3EEaV: public Traversor3XXaY +{ +public: + Traversor3EEaV(MAP& m, Dart d, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XXaY(m, d, forceDartMarker, thread) {} +}; + +/** + * Traverse edges adjacent to an egde by a face + */ +template +class Traversor3EEaF: public Traversor3XXaY +{ +public: + Traversor3EEaF(MAP& m, Dart d, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XXaY(m, d, forceDartMarker, thread) {} +}; + +/** + * Traverse edges adjacent to an egde by a volume + */ +template +class Traversor3EEaW: public Traversor3XXaY +{ +public: + Traversor3EEaW(MAP& m, Dart d, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XXaY(m, d, forceDartMarker, thread) {} +}; + + +/** + * Traverse faces adjacent to a face by a vertex + */ +template +class Traversor3FFaV: public Traversor3XXaY +{ +public: + Traversor3FFaV(MAP& m, Dart d, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XXaY(m, d, forceDartMarker, thread) {} +}; + +/** + * Traverse faces adjacent to a face by an edge + */ +template +class Traversor3FFaE: public Traversor3XXaY +{ +public: + Traversor3FFaE(MAP& m, Dart d, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XXaY(m, d, forceDartMarker, thread) {} +}; + +/** + * Traverse faces adjacent to a face by a volume + */ +template +class Traversor3FFaW: public Traversor3XXaY +{ +public: + Traversor3FFaW(MAP& m, Dart d, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XXaY(m, d, forceDartMarker, thread) {} +}; +/** + * Traverse volumes adjacent to a volumee by a vertex + */ template -class Traversor3WV: public Traversor3WX +class Traversor3WWaV: public Traversor3XXaY { public: - Traversor3WV(MAP& m, Dart dart, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3WX(m, dart, forceDartMarker, thread) {} + Traversor3WWaV(MAP& m, Dart d, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XXaY(m, d, forceDartMarker, thread) {} }; +/** + * Traverse volumes adjacent to a volumee by an edge + */ template -class Traversor3WE: public Traversor3WX +class Traversor3WWaE: public Traversor3XXaY { public: - Traversor3WE(MAP& m, Dart dart, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3WX(m, dart, forceDartMarker, thread) {} + Traversor3WWaE(MAP& m, Dart d, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XXaY(m, d, forceDartMarker, thread) {} }; +/** + * Traverse volumes adjacent to a volumee by a face + */ template -class Traversor3WF: public Traversor3WX +class Traversor3WWaF: public Traversor3XXaY { public: - Traversor3WF(MAP& m, Dart dart, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3WX(m, dart, forceDartMarker, thread) {} + Traversor3WWaF(MAP& m, Dart d, bool forceDartMarker = false, unsigned int thread = 0) : Traversor3XXaY(m, d, forceDartMarker, thread) {} }; diff --git a/include/Topology/generic/traversor3.hpp b/include/Topology/generic/traversor3.hpp index 4051a30d..eb36dabf 100644 --- a/include/Topology/generic/traversor3.hpp +++ b/include/Topology/generic/traversor3.hpp @@ -21,102 +21,222 @@ * Contact information: cgogn@unistra.fr * * * *******************************************************************************/ +#include "Utils/static_assert.h" namespace CGoGN { -/******************************************************************************* - VERTEX CENTERED TRAVERSALS -*******************************************************************************/ - -// Traversor3VE - -template -Traversor3VE::Traversor3VE(MAP& map, Dart dart) : m(map), start(dart) -{} +//********************** +// Marker for traversor +//********************** -template -Dart Traversor3VE::begin() +template +MarkerForTraversor::MarkerForTraversor(MAP& map, bool forceDartMarker, unsigned int thread) : + m_map(map), + m_dmark(NULL), + m_cmark(NULL) { - current = start ; - return current ; + if(!forceDartMarker && map.isOrbitEmbedded(ORBIT)) + m_cmark = new CellMarkerStore(map, ORBIT, thread) ; + else + m_dmark = new DartMarkerStore(map, thread) ; } -template -Dart Traversor3VE::end() + +template +MarkerForTraversor::~MarkerForTraversor() { - return NIL ; + if (m_cmark) + delete m_cmark; + if (m_dmark) + delete m_dmark; } -template -Dart Traversor3VE::next() +template +void MarkerForTraversor::mark(Dart d) { - if(current != NIL) - { - current = m.alpha1(current) ; - if(current == start) - current = NIL ; - } - return current ; + if (m_cmark) + m_cmark->mark(d); + else + m_dmark->markOrbit(ORBIT,d); } template -Traversor3WX::Traversor3WX(MAP& map, Dart dart, bool forceDartMarker, unsigned int thread) : - m(map), start(dart),dmark(NULL), cmark(NULL), m_tradoo(map,VOLUME,dart,thread) +void MarkerForTraversor::unmark(Dart d) { - if(!forceDartMarker && map.isOrbitEmbedded(ORBIT)) - cmark = new CellMarkerStore(map, ORBIT, thread) ; + if (m_cmark) + m_cmark->unmark(d); else - dmark = new DartMarkerStore(map, thread) ; + m_dmark->unmarkOrbit(ORBIT,d); } template -Traversor3WX::~Traversor3WX() +bool MarkerForTraversor::isMarked(Dart d) { - if (cmark) - delete cmark; - if (dmark) - delete dmark; - + if (m_cmark) + return m_cmark->isMarked(d); + return m_dmark->isMarked(d); } template -Dart Traversor3WX::begin() +CellMarkerStore* MarkerForTraversor::cmark() { - current = m_tradoo.begin() ; - return current; + return m_cmark; } template -Dart Traversor3WX::end() +DartMarkerStore* MarkerForTraversor::dmark() +{ + return m_dmark; +} + + + +//************************************** +// Traversor cellX Y incident to cell X +//************************************** + + +template +Traversor3XY::Traversor3XY(MAP& map, Dart dart, bool forceDartMarker, unsigned int thread) : +// Traversor3MarkOnly(map, forceDartMarker, thread, true), + m_map(map), + m_dmark(NULL), + m_cmark(NULL), + m_tradoo(map,ORBIT_X,dart,thread), + m_allocated(true) +{ + if(!forceDartMarker && map.isOrbitEmbedded(ORBIT_Y)) + m_cmark = new CellMarkerStore(map, ORBIT_Y, thread) ; + else + m_dmark = new DartMarkerStore(map, thread) ; +} + +template +Traversor3XY::Traversor3XY(MAP& map, Dart dart, MarkerForTraversor& tmo, bool forceDartMarker, unsigned int thread) : + m_map(map), + m_tradoo(map,ORBIT_X,dart,thread), + m_allocated(false) +{ + m_cmark = tmo.cmark(); + m_dmark = tmo.dmark(); +} + +template +Traversor3XY::~Traversor3XY() +{ + if (m_allocated) + { + if (m_cmark) + delete m_cmark; + if (m_dmark) + delete m_dmark; + } +} + +template +Dart Traversor3XY::begin() +{ + m_current = m_tradoo.begin() ; + // for the case of beginning with a given MarkerForTraversor + if (m_cmark) + { + while ((m_current != NIL) && m_cmark->isMarked(m_current)) + m_current = m_tradoo.next(); + } + else + { + while ((m_current != NIL) && m_dmark->isMarked(m_current)) + m_current = m_tradoo.next(); + } + return m_current; +} + +template +Dart Traversor3XY::end() { return NIL ; } -template -Dart Traversor3WX::next() +template +Dart Traversor3XY::next() { - if(current != NIL) + if(m_current != NIL) { - if (cmark) + if (m_cmark) { - cmark->mark(current); - current = m_tradoo.next(); - while ((current != NIL) && cmark->isMarked(current)) - current = m_tradoo.next(); + m_cmark->mark(m_current); + m_current = m_tradoo.next(); + while ((m_current != NIL) && m_cmark->isMarked(m_current)) + m_current = m_tradoo.next(); } else { - dmark->markOrbit(ORBIT, current); - current = m_tradoo.next(); - while ((current != NIL) && dmark->isMarked(current)) - current = m_tradoo.next(); + if (ORBIT_X==VOLUME) + { + // if allocated we are in a local traversal of volume so we can mark only darts of volume + if (m_allocated) + m_dmark->markOrbit(MAP::ORBIT_IN_PARENT(ORBIT_Y), m_current); + else + m_dmark->markOrbit(ORBIT_Y, m_current); // here we need to mark all the darts + } + else + m_dmark->markOrbit(ORBIT_Y, m_current); + m_current = m_tradoo.next(); + while ((m_current != NIL) && m_dmark->isMarked(m_current)) + m_current = m_tradoo.next(); } } - return current ; + return m_current ; +} + + + +//********************************************* +// Traversor cellX to cellX adjacent by cell Y +//********************************************* + + +template +Traversor3XXaY::Traversor3XXaY(MAP& map, Dart dart, bool forceDartMarker, unsigned int thread): + m_map(map) +{ + MarkerForTraversor mk(map,forceDartMarker,thread); + mk.mark(dart); + + Traversor3XY traAdj(map, dart, forceDartMarker, thread); + for (Dart d = traAdj.begin(); d!=traAdj.end(); d=traAdj.next()) + { + Traversor3XY traInci(map, d, mk, forceDartMarker, thread); + for (Dart e = traInci.begin(); e!=traInci.end(); e=traInci.next()) + m_vecDarts.push_back(e); + } + m_vecDarts.push_back(NIL); + m_iter = m_vecDarts.begin(); + +} + +template +Dart Traversor3XXaY::begin() +{ + return *m_iter; +} + +template +Dart Traversor3XXaY::end() +{ + return NIL; } +template +Dart Traversor3XXaY::next() +{ + if (*m_iter != NIL) + m_iter++; + return *m_iter ; +} + } // namespace CGoGN -- GitLab