diff --git a/include/Algo/Geometry/curvature.hpp b/include/Algo/Geometry/curvature.hpp index e27323cebaa6fccf18700b3b984a326fb228c5f5..611629a752af4f5fc3a40662928ee571c24bf4db 100644 --- a/include/Algo/Geometry/curvature.hpp +++ b/include/Algo/Geometry/curvature.hpp @@ -440,17 +440,17 @@ void computeCurvatureVertices_NormalCycles( if (!map. template isOrbitEmbedded()) { CellMarkerNoUnmark cm(map); - map. template initOrbitEmbedding(); + map. template initAllOrbitsEmbedding(); } if (!map. template isOrbitEmbedded()) { CellMarkerNoUnmark cm(map); - map. template initOrbitEmbedding(); + map. template initAllOrbitsEmbedding(); } if (!map. template isOrbitEmbedded()) { CellMarkerNoUnmark cm(map); - map. template initOrbitEmbedding(); + map. template initAllOrbitsEmbedding(); } FunctorComputeCurvatureVertices_NormalCycles funct(map, radius, position, normal, edgeangle, kmax, kmin, Kmax, Kmin, Knormal); diff --git a/include/Topology/generic/genericmap.h b/include/Topology/generic/genericmap.h index 7d379046921e285eed5236b7641c67138931a1d6..efae06e449ff7d87c9b378dc7653b268b8e4158f 100644 --- a/include/Topology/generic/genericmap.h +++ b/include/Topology/generic/genericmap.h @@ -438,6 +438,14 @@ public: template void initCell(unsigned int i) ; + /** + * Traverse the map and embed all orbits of the given dimension with a new cell + * @param realloc if true -> all the orbits are embedded on new cells, if false -> already embedded orbits are not impacted + */ + template + void initAllOrbitsEmbedding(bool realloc = false) ; + + /**************************************** * QUICK TRAVERSAL MANAGEMENT * ****************************************/ diff --git a/include/Topology/generic/genericmap.hpp b/include/Topology/generic/genericmap.hpp index 890821a579d276c1df7048c9f5356fac199a1183..cda01ae56f01531a2c4ac821306b365a9edc0458 100644 --- a/include/Topology/generic/genericmap.hpp +++ b/include/Topology/generic/genericmap.hpp @@ -397,12 +397,12 @@ inline void GenericMap::copyCell(Dart d, Dart e) assert(isOrbitEmbedded() || !"Invalid parameter: orbit not embedded"); unsigned int dE = getEmbedding(d) ; unsigned int eE = getEmbedding(e) ; -// if(eE != EMBNULL) // if the source is NULL, nothing to copy -// { -// if(dE == EMBNULL) // if the dest is NULL, create a new cell -// dE = setOrbitEmbeddingOnNewCell(d) ; + if(eE != EMBNULL) // if the source is NULL, nothing to copy + { + if(dE == EMBNULL) // if the dest is NULL, create a new cell + dE = setOrbitEmbeddingOnNewCell(d) ; m_attribs[ORBIT].copyLine(dE, eE) ; // copy the data -// } + } } template @@ -419,6 +419,23 @@ inline void GenericMap::initCell(unsigned int i) m_attribs[ORBIT].initLine(i) ; } + +template +void GenericMap::initAllOrbitsEmbedding(bool realloc) +{ + assert(isOrbitEmbedded() || !"Invalid parameter: orbit not embedded") ; + DartMarker mark(*this) ; + for(Dart d = begin(); d != end(); next(d)) + { + if(!mark.isMarked(d)) + { + mark.markOrbit(d) ; + if(realloc || getEmbedding(d) == EMBNULL) + setOrbitEmbeddingOnNewCell(d) ; + } + } +} + /**************************************** * QUICK TRAVERSAL MANAGEMENT * ****************************************/ @@ -538,18 +555,9 @@ void GenericMap::addEmbedding() AttributeMultiVector* amv = dartCont.addAttribute(oss.str()) ; m_embeddings[ORBIT] = amv ; - FunctorInitEmb fsetemb(*this); - DartMarker dm(*this); - for(Dart d = this->begin(); d != this->end(); this->next(d)) - { - if(!dm.isMarked(d)) - { - dm.markOrbit(d); - unsigned int em = newCell(); - fsetemb.changeEmb(em); - foreach_dart_of_orbit(d, fsetemb); - } - } + // set new embedding to EMBNULL for all the darts of the map + for(unsigned int i = dartCont.begin(); i < dartCont.end(); dartCont.next(i)) + (*amv)[i] = EMBNULL ; } /**************************************** diff --git a/include/Topology/generic/traversor2_closed.h b/include/Topology/generic/traversor2_closed.h new file mode 100644 index 0000000000000000000000000000000000000000..ba2d497ccb515c454d780fdebf908c0843425ea6 --- /dev/null +++ b/include/Topology/generic/traversor2_closed.h @@ -0,0 +1,260 @@ +/******************************************************************************* +* CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps * +* version 0.1 * +* Copyright (C) 2009-2012, IGG Team, LSIIT, University of Strasbourg * +* * +* This library is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by the * +* Free Software Foundation; either version 2.1 of the License, or (at your * +* option) any later version. * +* * +* This library is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this library; if not, write to the Free Software Foundation, * +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * +* * +* Web site: http://cgogn.unistra.fr/ * +* Contact information: cgogn@unistra.fr * +* * +*******************************************************************************/ + +#ifndef __TRAVERSOR2_CLOSED_H__ +#define __TRAVERSOR2_CLOSED_H__ + +#include "Topology/generic/dart.h" +#include "Topology/generic/traversorGen.h" + +namespace CGoGN +{ + +namespace ClosedMap +{ + + +/******************************************************************************* + VERTEX CENTERED TRAVERSALS +*******************************************************************************/ + +// Traverse the edges incident to a given vertex +template +class Traversor2VE: public Traversor +{ +private: + MAP& m ; + Dart start ; + Dart current ; + +public: + Traversor2VE(MAP& map, Dart dart) ; + + Dart begin() ; + Dart end() ; + Dart next() ; +} ; + +// Traverse the faces incident to a given vertex +template +class Traversor2VF : public Traversor +{ +private: + MAP& m ; + Dart start ; + Dart current ; + +public: + Traversor2VF(MAP& map, Dart dart) ; + + Dart begin() ; + Dart end() ; + Dart next() ; +} ; + +// Traverse the vertices adjacent to a given vertex through sharing a common edge +template +class Traversor2VVaE : public Traversor +{ +private: + MAP& m ; + Dart start ; + Dart current ; + +public: + Traversor2VVaE(MAP& map, Dart dart) ; + + Dart begin() ; + Dart end() ; + Dart next() ; +} ; + +// Traverse the vertices adjacent to a given vertex through sharing a common face +template +class Traversor2VVaF : public Traversor +{ +private: + MAP& m ; + Dart start ; + Dart current ; + + Dart stop ; + +public: + Traversor2VVaF(MAP& map, Dart dart) ; + + Dart begin() ; + Dart end() ; + Dart next() ; +} ; + +/******************************************************************************* + EDGE CENTERED TRAVERSALS +*******************************************************************************/ + +// Traverse the vertices incident to a given edge +template +class Traversor2EV : public Traversor +{ +private: + MAP& m ; + Dart start ; + Dart current ; + +public: + Traversor2EV(MAP& map, Dart dart) ; + + Dart begin() ; + Dart end() ; + Dart next() ; +} ; + +// Traverse the faces incident to a given edge +template +class Traversor2EF : public Traversor +{ +private: + MAP& m ; + Dart start ; + Dart current ; + +public: + Traversor2EF(MAP& map, Dart dart) ; + + Dart begin() ; + Dart end() ; + Dart next() ; +} ; + +// Traverse the edges adjacent to a given edge through sharing a common vertex +template +class Traversor2EEaV : public Traversor +{ +private: + MAP& m ; + Dart start ; + Dart current ; + + Dart stop1, stop2 ; + +public: + Traversor2EEaV(MAP& map, Dart dart) ; + + Dart begin() ; + Dart end() ; + Dart next() ; +} ; + +// Traverse the edges adjacent to a given edge through sharing a common face +template +class Traversor2EEaF : public Traversor +{ +private: + MAP& m ; + Dart start ; + Dart current ; + + Dart stop1, stop2 ; + +public: + Traversor2EEaF(MAP& map, Dart dart) ; + + Dart begin() ; + Dart end() ; + Dart next() ; +} ; + +/******************************************************************************* + FACE CENTERED TRAVERSALS +*******************************************************************************/ + +// Traverse the vertices incident to a given face +template +class Traversor2FV : public Traversor +{ +private: + MAP& m ; + Dart start ; + Dart current ; + +public: + Traversor2FV(MAP& map, Dart dart) ; + + Dart begin() ; + Dart end() ; + Dart next() ; +} ; + + +// Traverse the edges incident to a given face (equivalent to vertices) +template +class Traversor2FE: public Traversor2FV +{ +public: + Traversor2FE(MAP& map, Dart dart):Traversor2FV(map,dart){} +} ; + +// Traverse the faces adjacent to a given face through sharing a common vertex +template +class Traversor2FFaV : public Traversor +{ +private: + MAP& m ; + Dart start ; + Dart current ; + + Dart stop ; + +public: + Traversor2FFaV(MAP& map, Dart dart) ; + + Dart begin() ; + Dart end() ; + Dart next() ; +} ; + +// Traverse the faces adjacent to a given face through sharing a common edge +template +class Traversor2FFaE : public Traversor +{ +private: + MAP& m ; + Dart start ; + Dart current ; + +public: + Traversor2FFaE(MAP& map, Dart dart) ; + + Dart begin() ; + Dart end() ; + Dart next() ; +} ; + +} // namespace ClosedMap + +} // namespace CGoGN + +#include "Topology/generic/traversor2_closed.hpp" + +#endif diff --git a/include/Topology/generic/traversor2_closed.hpp b/include/Topology/generic/traversor2_closed.hpp new file mode 100644 index 0000000000000000000000000000000000000000..472c927991adf21aa1957faccdae083d2495b175 --- /dev/null +++ b/include/Topology/generic/traversor2_closed.hpp @@ -0,0 +1,438 @@ +/******************************************************************************* +* CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps * +* version 0.1 * +* Copyright (C) 2009-2012, IGG Team, LSIIT, University of Strasbourg * +* * +* This library is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by the * +* Free Software Foundation; either version 2.1 of the License, or (at your * +* option) any later version. * +* * +* This library is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this library; if not, write to the Free Software Foundation, * +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * +* * +* Web site: http://cgogn.unistra.fr/ * +* Contact information: cgogn@unistra.fr * +* * +*******************************************************************************/ + +namespace CGoGN +{ + +namespace ClosedMap +{ + +/******************************************************************************* + VERTEX CENTERED TRAVERSALS +*******************************************************************************/ + +// Traversor2VE + +template +Traversor2VE::Traversor2VE(MAP& map, Dart dart) : m(map), start(dart) +{} + +template +Dart Traversor2VE::begin() +{ + current = start ; + return current ; +} + +template +Dart Traversor2VE::end() +{ + return NIL ; +} + +template +Dart Traversor2VE::next() +{ + if(current != NIL) + { + current = m.phi2(m.phi_1(current)) ; + if(current == start) + current = NIL ; + } + return current ; +} + +// Traversor2VF + +template +Traversor2VF::Traversor2VF(MAP& map, Dart dart) : m(map), start(dart) +{ +} + +template +Dart Traversor2VF::begin() +{ + current = start ; + return current ; +} + +template +Dart Traversor2VF::end() +{ + return NIL ; +} + +template +Dart Traversor2VF::next() +{ + if(current != NIL) + { + current = m.phi2(m.phi_1(current)) ; + if(current == start) + current = NIL ; + } + return current ; +} + +// Traversor2VVaE + +template +Traversor2VVaE::Traversor2VVaE(MAP& map, Dart dart) : m(map) +{ + start = m.phi2(dart) ; +} + +template +Dart Traversor2VVaE::begin() +{ + current = start ; + return current ; +} + +template +Dart Traversor2VVaE::end() +{ + return NIL ; +} + +template +Dart Traversor2VVaE::next() +{ + if(current != NIL) + { + current = m.phi_1(m.phi2(current)) ; + if(current == start) + current = NIL ; + } + return current ; +} + +// Traversor2VVaF + +template +Traversor2VVaF::Traversor2VVaF(MAP& map, Dart dart) : m(map) +{ + if(m.isBoundaryMarked(dart)) + dart = m.phi2(m.phi_1(dart)) ; + start = m.phi1(m.phi1(dart)) ; + if(start == dart) + start = m.phi1(dart) ; + stop = dart ; +} + +template +Dart Traversor2VVaF::begin() +{ + current = start ; + return current ; +} + +template +Dart Traversor2VVaF::end() +{ + return NIL ; +} + +template +Dart Traversor2VVaF::next() +{ + if(current != NIL) + { + current = m.phi1(current) ; + if(current == stop) + { + Dart d = m.phi2(m.phi_1(current)) ; + current = m.phi1(m.phi1(d)) ; + if(current == d) + current = m.phi1(d) ; + stop = d ; + } + if(current == start) + current = NIL ; + } + return current ; +} + +/******************************************************************************* + EDGE CENTERED TRAVERSALS +*******************************************************************************/ + +// Traversor2EV + +template +Traversor2EV::Traversor2EV(MAP& map, Dart dart) : m(map), start(dart) +{} + +template +Dart Traversor2EV::begin() +{ + current = start ; + return current ; +} + +template +Dart Traversor2EV::end() +{ + return NIL ; +} + +template +Dart Traversor2EV::next() +{ + if(current != NIL) + { + current = m.phi2(current) ; + if(current == start) + current = NIL ; + } + return current ; +} + +// Traversor2EF + +template +Traversor2EF::Traversor2EF(MAP& map, Dart dart) : m(map), start(dart) +{ +} + +template +Dart Traversor2EF::begin() +{ + current = start ; + return current ; +} + +template +Dart Traversor2EF::end() +{ + return NIL ; +} + +template +Dart Traversor2EF::next() +{ + if(current != NIL) + { + current = m.phi2(current) ; + if(current == start) // do not consider a boundary face + current = NIL ; + } + return current ; +} + +// Traversor2EEaV + +template +Traversor2EEaV::Traversor2EEaV(MAP& map, Dart dart) : m(map) +{ + start = m.phi2(m.phi_1(dart)) ; + stop1 = dart ; + stop2 = m.phi2(dart) ; +} + +template +Dart Traversor2EEaV::begin() +{ + current = start ; + return current ; +} + +template +Dart Traversor2EEaV::end() +{ + return NIL ; +} + +template +Dart Traversor2EEaV::next() +{ + if(current != NIL) + { + current = m.phi2(m.phi_1(current)) ; + if(current == stop1) + current = m.phi2(m.phi_1(stop2)) ; + else if(current == stop2) + current = NIL ; + } + return current ; +} + +// Traversor2EEaF + +template +Traversor2EEaF::Traversor2EEaF(MAP& map, Dart dart) : m(map) +{ + start = m.phi1(dart) ; + stop1 = dart ; + stop2 = m.phi2(dart) ; +} + +template +Dart Traversor2EEaF::begin() +{ + current = start ; + return current ; +} + +template +Dart Traversor2EEaF::end() +{ + return NIL ; +} + +template +Dart Traversor2EEaF::next() +{ + if(current != NIL) + { + current = m.phi1(current) ; + if(current == stop1) + current = m.phi1(stop2) ; + else if(current == stop2) + current = NIL ; + } + return current ; +} + +/******************************************************************************* + FACE CENTERED TRAVERSALS +*******************************************************************************/ + +// Traversor2FV + +template +Traversor2FV::Traversor2FV(MAP& map, Dart dart) : m(map), start(dart) +{} + +template +Dart Traversor2FV::begin() +{ + current = start ; + return current ; +} + +template +Dart Traversor2FV::end() +{ + return NIL ; +} + +template +Dart Traversor2FV::next() +{ + if(current != NIL) + { + current = m.phi1(current) ; + if(current == start) + current = NIL ; + } + return current ; +} + +// Traversor2FFaV + +template +Traversor2FFaV::Traversor2FFaV(MAP& map, Dart dart) : m(map) +{ + start = m.phi2(m.phi_1(m.phi2(m.phi_1(dart)))) ; + current = start ; + if(start == dart) + { + stop = m.phi2(m.phi_1(dart)) ; + start = next() ; + } + stop = dart ; +} + +template +Dart Traversor2FFaV::begin() +{ + current = start ; + return current ; +} + +template +Dart Traversor2FFaV::end() +{ + return NIL ; +} + +template +Dart Traversor2FFaV::next() +{ + if(current != NIL) + { + current = m.phi2(m.phi_1(current)) ; + if(current == stop) + { + Dart d = m.phi1(current) ; + current = m.phi2(m.phi_1(m.phi2(m.phi_1(d)))) ; + if(current == d) + { + stop = m.phi2(m.phi_1(d)) ; + return next() ; + } + stop = d ; + } + if(current == start) + current = NIL ; + } + return current ; +} + +// Traversor2FFaE + +template +Traversor2FFaE::Traversor2FFaE(MAP& map, Dart dart) : m(map) +{ + start = m.phi2(dart) ; +} + +template +Dart Traversor2FFaE::begin() +{ + current = start ; + return current ; +} + +template +Dart Traversor2FFaE::end() +{ + return NIL ; +} + +template +Dart Traversor2FFaE::next() +{ + if(current != NIL) + { + current = m.phi2(m.phi1(m.phi2(current))) ; + if(current == start) + current = NIL ; + } + return current ; +} + +} // namespace ClosedMap +} // namespace CGoGN