/******************************************************************************* * 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 { /******************************************************************************* VERTEX CENTERED TRAVERSALS *******************************************************************************/ // Traversor2VE template Traversor2VE::Traversor2VE(MAP& map, Dart dart) : m(map), start(dart),m_QLT(NULL) { AttributeMultiVector > >* quickTraversal = map.template getQuickIncidentTraversal() ; if (quickTraversal != NULL) { m_QLT = &(quickTraversal->operator[](map.template getEmbedding(dart))); } } template Dart Traversor2VE::begin() { if(m_QLT != NULL) { m_ItDarts = m_QLT->begin(); return *m_ItDarts++; } current = start ; return current ; } template Dart Traversor2VE::end() { return NIL ; } template Dart Traversor2VE::next() { if(m_QLT != NULL) { return *m_ItDarts++; } if(current != NIL) { // current = m.alpha1(current) ; 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),m_QLT(NULL) { AttributeMultiVector > >* quickTraversal = map.template getQuickIncidentTraversal() ; if (quickTraversal != NULL) { m_QLT = &(quickTraversal->operator[](map.template getEmbedding(dart))); } else { if(m.isBoundaryMarked2(start)) // jump over a boundary face start = m.phi2(m.phi_1(start)) ; } } template Dart Traversor2VF::begin() { if(m_QLT != NULL) { m_ItDarts = m_QLT->begin(); return *m_ItDarts++; } current = start ; return current ; } template Dart Traversor2VF::end() { return NIL ; } template Dart Traversor2VF::next() { if(m_QLT != NULL) { return *m_ItDarts++; } if(current != NIL) { current = m.phi2(m.phi_1(current)) ; if(m.isBoundaryMarked2(current)) // jump over a boundary face current = m.phi2(m.phi_1(current)) ; if(current == start) current = NIL ; } return current ; } // Traversor2VVaE template Traversor2VVaE::Traversor2VVaE(MAP& map, Dart dart) : m(map),m_QLT(NULL) { AttributeMultiVector > >* quickTraversal = map.template getQuickAdjacentTraversal() ; if (quickTraversal != NULL) { m_QLT = &(quickTraversal->operator[](map.template getEmbedding(dart))); } else { start = m.phi2(dart) ; } } template Dart Traversor2VVaE::begin() { if(m_QLT != NULL) { m_ItDarts = m_QLT->begin(); return *m_ItDarts++; } current = start ; return current ; } template Dart Traversor2VVaE::end() { return NIL ; } template Dart Traversor2VVaE::next() { if(m_QLT != NULL) { return *m_ItDarts++; } 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),m_QLT(NULL) { AttributeMultiVector > >* quickTraversal = map.template getQuickAdjacentTraversal() ; if (quickTraversal != NULL) { m_QLT = &(quickTraversal->operator[](map.template getEmbedding(dart))); } else { if(m.isBoundaryMarked2(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() { if(m_QLT != NULL) { m_ItDarts = m_QLT->begin(); return *m_ItDarts++; } current = start ; return current ; } template Dart Traversor2VVaF::end() { return NIL ; } template Dart Traversor2VVaF::next() { if(m_QLT != NULL) { return *m_ItDarts++; } if(current != NIL) { current = m.phi1(current) ; if(current == stop) { Dart d = m.phi2(m.phi_1(current)) ; if(m.isBoundaryMarked2(d)) // jump over a boundary face { d = m.phi2(m.phi_1(d)) ; current = m.phi1(d); } else 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),m_QLT(NULL) { AttributeMultiVector > >* quickTraversal = map.template getQuickIncidentTraversal() ; if (quickTraversal != NULL) { m_QLT = &(quickTraversal->operator[](map.template getEmbedding(dart))); } } template Dart Traversor2EV::begin() { if(m_QLT != NULL) { m_ItDarts = m_QLT->begin(); return *m_ItDarts++; } current = start ; return current ; } template Dart Traversor2EV::end() { return NIL ; } template Dart Traversor2EV::next() { if(m_QLT != NULL) { return *m_ItDarts++; } 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),m_QLT(NULL) { AttributeMultiVector > >* quickTraversal = map.template getQuickIncidentTraversal() ; if (quickTraversal != NULL) { m_QLT = &(quickTraversal->operator[](map.template getEmbedding(dart))); } else { if(m.isBoundaryMarked2(start)) start = m.phi2(current) ; } } template Dart Traversor2EF::begin() { if(m_QLT != NULL) { m_ItDarts = m_QLT->begin(); return *m_ItDarts++; } current = start ; return current ; } template Dart Traversor2EF::end() { return NIL ; } template Dart Traversor2EF::next() { if(m_QLT != NULL) { return *m_ItDarts++; } if(current != NIL) { current = m.phi2(current) ; if(current == start || m.isBoundaryMarked2(current)) // do not consider a boundary face current = NIL ; } return current ; } // Traversor2EEaV template Traversor2EEaV::Traversor2EEaV(MAP& map, Dart dart) : m(map),m_QLT(NULL) { AttributeMultiVector > >* quickTraversal = map.template getQuickAdjacentTraversal() ; if (quickTraversal != NULL) { m_QLT = &(quickTraversal->operator[](map.template getEmbedding(dart))); } else { start = m.phi2(m.phi_1(dart)) ; stop1 = dart ; stop2 = m.phi2(dart) ; } } template Dart Traversor2EEaV::begin() { if(m_QLT != NULL) { m_ItDarts = m_QLT->begin(); return *m_ItDarts++; } current = start ; return current ; } template Dart Traversor2EEaV::end() { return NIL ; } template Dart Traversor2EEaV::next() { if(m_QLT != NULL) { return *m_ItDarts++; } 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),m_QLT(NULL) { AttributeMultiVector > >* quickTraversal = map.template getQuickAdjacentTraversal() ; if (quickTraversal != NULL) { m_QLT = &(quickTraversal->operator[](map.template getEmbedding(dart))); } else { start = m.phi1(dart) ; stop1 = dart ; stop2 = m.phi2(dart) ; } } template Dart Traversor2EEaF::begin() { if(m_QLT != NULL) { m_ItDarts = m_QLT->begin(); return *m_ItDarts++; } current = start ; return current ; } template Dart Traversor2EEaF::end() { return NIL ; } template Dart Traversor2EEaF::next() { if(m_QLT != NULL) { return *m_ItDarts++; } 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),m_QLT(NULL) { AttributeMultiVector > >* quickTraversal = map.template getQuickIncidentTraversal() ; if (quickTraversal != NULL) { m_QLT = &(quickTraversal->operator[](map.template getEmbedding(dart))); } } template Dart Traversor2FV::begin() { if(m_QLT != NULL) { m_ItDarts = m_QLT->begin(); return *m_ItDarts++; } current = start ; return current ; } template Dart Traversor2FV::end() { return NIL ; } template Dart Traversor2FV::next() { if(m_QLT != NULL) { return *m_ItDarts++; } if(current != NIL) { current = m.phi1(current) ; if(current == start) current = NIL ; } return current ; } // Traversor2FFaV template Traversor2FFaV::Traversor2FFaV(MAP& map, Dart dart) : m(map),m_QLT(NULL) { AttributeMultiVector > >* quickTraversal = map.template getQuickAdjacentTraversal() ; if (quickTraversal != NULL) { m_QLT = &(quickTraversal->operator[](map.template getEmbedding(dart))); } else { 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 ; if(m.isBoundaryMarked2(start)) start = next() ; } } template Dart Traversor2FFaV::begin() { if(m_QLT != NULL) { m_ItDarts = m_QLT->begin(); return *m_ItDarts++; } current = start ; return current ; } template Dart Traversor2FFaV::end() { return NIL ; } template Dart Traversor2FFaV::next() { if(m_QLT != NULL) { return *m_ItDarts++; } 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(m.isBoundaryMarked2(current)) return next() ; } if(current == start) current = NIL ; } return current ; } // Traversor2FFaE template Traversor2FFaE::Traversor2FFaE(MAP& map, Dart dart) : m(map),m_QLT(NULL) { AttributeMultiVector > >* quickTraversal = map.template getQuickAdjacentTraversal() ; if (quickTraversal != NULL) { m_QLT = &(quickTraversal->operator[](map.template getEmbedding(dart))); } else { start = m.phi2(dart) ; while(start != NIL && m.isBoundaryMarked2(start)) { start = m.phi2(m.phi1(m.phi2(start))) ; if(start == m.phi2(dart)) start = NIL ; } } } template Dart Traversor2FFaE::begin() { if(m_QLT != NULL) { m_ItDarts = m_QLT->begin(); return *m_ItDarts++; } current = start ; return current ; } template Dart Traversor2FFaE::end() { return NIL ; } template Dart Traversor2FFaE::next() { if(m_QLT != NULL) { return *m_ItDarts++; } if(current != NIL) { do { current = m.phi2(m.phi1(m.phi2(current))) ; } while(m.isBoundaryMarked2(current)) ; if(current == start) current = NIL ; } return current ; } // //template //Traversor2* Traversor2::createIncident(MAP& map, Dart dart, unsigned int orbX, unsigned int orbY) //{ // int code = 0x100*(orbX-VERTEX) + orbY-VERTEX; // // switch(code) // { // case 0x0001: // return new Traversor2VE(map,dart); // break; // case 0x0002: // return new Traversor2VF(map,dart); // break; // case 0x0100: // return new Traversor2EV(map,dart); // break; // case 0x0102: // return new Traversor2EF(map,dart); // break; // case 0x0200: // return new Traversor2FV(map,dart); // break; // case 0x0201: // return new Traversor2FE(map,dart); // break; // default: // return NULL; // break; // } // return NULL; //} // //template //Traversor2* Traversor2::createAdjacent(MAP& map, Dart dart, unsigned int orbX, unsigned int orbY) //{ // int code = 0x100*(orbX-VERTEX) + orbY-VERTEX; // switch(code) // { // case 0x0001: // return new Traversor2VVaE(map,dart); // break; // case 0x0002: // return new Traversor2VVaF(map,dart); // break; // case 0x0100: // return new Traversor2EEaV(map,dart); // break; // case 0x0102: // return new Traversor2EEaF(map,dart); // break; // case 0x0200: // return new Traversor2FFaV(map,dart); // break; // case 0x0201: // return new Traversor2FFaE(map,dart); // break; // default: // return NULL; // break; // } // return NULL; //} } // namespace CGoGN