From a7c2244d595aefb9bc8fa9d5d9b17f8b941e05a8 Mon Sep 17 00:00:00 2001 From: Monique Teillaud Date: Wed, 22 Sep 1999 13:39:48 +0000 Subject: [PATCH] Facet iterators implemented --- .../doc_tex/Triangulation_3/TDS3.tex | 29 ++- .../Triangulation_3/Triangulation3.tex | 31 ++- .../doc_tex/basic/Triangulation_3/TDS3.tex | 29 ++- .../basic/Triangulation_3/Triangulation3.tex | 31 ++- .../include/CGAL/Triangulation_3.h | 60 ++++- .../CGAL/Triangulation_circulators_3.h | 138 ++++++++++- .../CGAL/Triangulation_data_structure_3.h | 70 +++++- .../CGAL/Triangulation_ds_circulators_3.h | 229 +++++++++++++++++- 8 files changed, 574 insertions(+), 43 deletions(-) diff --git a/Packages/Triangulation_3/doc_tex/Triangulation_3/TDS3.tex b/Packages/Triangulation_3/doc_tex/Triangulation_3/TDS3.tex index 02f5b79b520..6e2a34576a9 100644 --- a/Packages/Triangulation_3/doc_tex/Triangulation_3/TDS3.tex +++ b/Packages/Triangulation_3/doc_tex/Triangulation_3/TDS3.tex @@ -688,15 +688,30 @@ into the triangulation data structure.} const;} {Idem for edge \ccc{(i,j)} of \ccc{c}.} +The following circulators on facets are defined only in dimension~3, +though facets are defined also in dimension~2: there are only two +facets sharing an edge in dimension~2. \ccMethod{Facet_circulator incident_facets(Edge e) const;} -{Starts at an arbitrary facet incident to \ccc{e}.\\ -\textit{not yet implemented}} +{Starts at an arbitrary facet incident to \ccc{e}. +\ccPrecond{\ccVar.\ccc{dimension()}~$=3$}} \ccGlue -\ccMethod{Facet_circulator incident_facets(Edge e, Facet f) const;} -{Starts at facet \ccc{f}. -\ccPrecond{\ccVar.\ccc{dimension()}~$\geq 2$ and \ccc{f} is incident to -\ccc{e}.}\\ -\textit{not yet implemented}} +\ccMethod{Facet_circulator incident_facets(Cell* c, int i, int j) const;} +{Idem for edge \ccc{(i,j)} of \ccc{c}.} +\ccGlue +\ccMethod{Facet_circulator incident_facets(Edge e, Facet start) const;} +{Starts at facet \ccc{start}. +\ccPrecond{\ccc{start} is incident to \ccc{e}.}} +\ccGlue +\ccMethod{Facet_circulator incident_facets(Edge e, Cell* start, int f) const;} +{Starts at facet of index \ccc{f} in \ccc{start}.} +\ccGlue +\ccMethod{Facet_circulator incident_facets(Cell* c, int i, int j, +Facet start) const;} +{Idem for edge \ccc{(i,j)} of \ccc{c}.} +\ccGlue +\ccMethod{Facet_circulator incident_facets(Cell* c, int i, int j, +Cell* start, int f) const;} +{Idem for edge \ccc{(i,j)} of \ccc{c} and facet \ccc{(start,f)}.} \ccHeading{Traversal of the incident cells and the adjacent vertices of a given vertex} diff --git a/Packages/Triangulation_3/doc_tex/Triangulation_3/Triangulation3.tex b/Packages/Triangulation_3/doc_tex/Triangulation_3/Triangulation3.tex index 3c6a3aa55a3..7dbb6420267 100644 --- a/Packages/Triangulation_3/doc_tex/Triangulation_3/Triangulation3.tex +++ b/Packages/Triangulation_3/doc_tex/Triangulation_3/Triangulation3.tex @@ -975,20 +975,31 @@ are invalited by any modification of one of the cells traversed. Cell_handle start) const;} {Idem for edge \ccc{(i,j)} of \ccc{c}.} +The following circulators on facets are defined only in dimension~3, +though facets are defined also in dimension~2: there are only two +facets sharing an edge in dimension~2. \ccMethod{Facet_circulator incident_facets(Edge e) const;} -{Starts at an arbitrary facet incident to \ccc{e}.} +{Starts at an arbitrary facet incident to \ccc{e}. +\ccPrecond{\ccVar.\ccc{dimension()}~$=3$}} \ccGlue -\ccMethod{Facet_circulator incident_facets(Edge e, Facet f) const;} -{Starts at facet \ccc{f}. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 2$ and \ccc{f} is incident to -\ccc{e}.}\\ -\textit{not yet implemented}} +\ccMethod{Facet_circulator incident_facets(Cell_handle c, int i, int j) const;} +{Idem for edge \ccc{(i,j)} of \ccc{c}.} \ccGlue -\ccMethod{Facet_circulator incident_facets(Edge e, Cell_handle c, int i) +\ccMethod{Facet_circulator incident_facets(Edge e, Facet start) const;} +{Starts at facet \ccc{start}. +\ccPrecond{\ccc{start} is incident to \ccc{e}.}} +\ccGlue +\ccMethod{Facet_circulator incident_facets(Edge e, Cell_handle start, int f) const;} -{Idem, starts at facet of index \ccc{i} in \ccc{c}. -\ccPrecond{idem and $i \in \{0,1,2,3\}$ in dimension~3, $i = 3$ in -dimension~2.}} +{Starts at facet of index \ccc{f} in \ccc{start}.} +\ccGlue +\ccMethod{Facet_circulator incident_facets(Cell_handle c, int i, int j, +Facet start) const;} +{Idem for edge \ccc{(i,j)} of \ccc{c}.} +\ccGlue +\ccMethod{Facet_circulator incident_facets(Cell_handle c, int i, int j, +Cell_handle start, int f) const;} +{Idem for edge \ccc{(i,j)} of \ccc{c} and facet \ccc{(start,f)}.} \ccHeading{Traversal of the incident cells and the adjacent vertices of a given vertex} diff --git a/Packages/Triangulation_3/doc_tex/basic/Triangulation_3/TDS3.tex b/Packages/Triangulation_3/doc_tex/basic/Triangulation_3/TDS3.tex index 02f5b79b520..6e2a34576a9 100644 --- a/Packages/Triangulation_3/doc_tex/basic/Triangulation_3/TDS3.tex +++ b/Packages/Triangulation_3/doc_tex/basic/Triangulation_3/TDS3.tex @@ -688,15 +688,30 @@ into the triangulation data structure.} const;} {Idem for edge \ccc{(i,j)} of \ccc{c}.} +The following circulators on facets are defined only in dimension~3, +though facets are defined also in dimension~2: there are only two +facets sharing an edge in dimension~2. \ccMethod{Facet_circulator incident_facets(Edge e) const;} -{Starts at an arbitrary facet incident to \ccc{e}.\\ -\textit{not yet implemented}} +{Starts at an arbitrary facet incident to \ccc{e}. +\ccPrecond{\ccVar.\ccc{dimension()}~$=3$}} \ccGlue -\ccMethod{Facet_circulator incident_facets(Edge e, Facet f) const;} -{Starts at facet \ccc{f}. -\ccPrecond{\ccVar.\ccc{dimension()}~$\geq 2$ and \ccc{f} is incident to -\ccc{e}.}\\ -\textit{not yet implemented}} +\ccMethod{Facet_circulator incident_facets(Cell* c, int i, int j) const;} +{Idem for edge \ccc{(i,j)} of \ccc{c}.} +\ccGlue +\ccMethod{Facet_circulator incident_facets(Edge e, Facet start) const;} +{Starts at facet \ccc{start}. +\ccPrecond{\ccc{start} is incident to \ccc{e}.}} +\ccGlue +\ccMethod{Facet_circulator incident_facets(Edge e, Cell* start, int f) const;} +{Starts at facet of index \ccc{f} in \ccc{start}.} +\ccGlue +\ccMethod{Facet_circulator incident_facets(Cell* c, int i, int j, +Facet start) const;} +{Idem for edge \ccc{(i,j)} of \ccc{c}.} +\ccGlue +\ccMethod{Facet_circulator incident_facets(Cell* c, int i, int j, +Cell* start, int f) const;} +{Idem for edge \ccc{(i,j)} of \ccc{c} and facet \ccc{(start,f)}.} \ccHeading{Traversal of the incident cells and the adjacent vertices of a given vertex} diff --git a/Packages/Triangulation_3/doc_tex/basic/Triangulation_3/Triangulation3.tex b/Packages/Triangulation_3/doc_tex/basic/Triangulation_3/Triangulation3.tex index 3c6a3aa55a3..7dbb6420267 100644 --- a/Packages/Triangulation_3/doc_tex/basic/Triangulation_3/Triangulation3.tex +++ b/Packages/Triangulation_3/doc_tex/basic/Triangulation_3/Triangulation3.tex @@ -975,20 +975,31 @@ are invalited by any modification of one of the cells traversed. Cell_handle start) const;} {Idem for edge \ccc{(i,j)} of \ccc{c}.} +The following circulators on facets are defined only in dimension~3, +though facets are defined also in dimension~2: there are only two +facets sharing an edge in dimension~2. \ccMethod{Facet_circulator incident_facets(Edge e) const;} -{Starts at an arbitrary facet incident to \ccc{e}.} +{Starts at an arbitrary facet incident to \ccc{e}. +\ccPrecond{\ccVar.\ccc{dimension()}~$=3$}} \ccGlue -\ccMethod{Facet_circulator incident_facets(Edge e, Facet f) const;} -{Starts at facet \ccc{f}. -\ccPrecond{\ccVar.\ccc{dimension()} $\geq 2$ and \ccc{f} is incident to -\ccc{e}.}\\ -\textit{not yet implemented}} +\ccMethod{Facet_circulator incident_facets(Cell_handle c, int i, int j) const;} +{Idem for edge \ccc{(i,j)} of \ccc{c}.} \ccGlue -\ccMethod{Facet_circulator incident_facets(Edge e, Cell_handle c, int i) +\ccMethod{Facet_circulator incident_facets(Edge e, Facet start) const;} +{Starts at facet \ccc{start}. +\ccPrecond{\ccc{start} is incident to \ccc{e}.}} +\ccGlue +\ccMethod{Facet_circulator incident_facets(Edge e, Cell_handle start, int f) const;} -{Idem, starts at facet of index \ccc{i} in \ccc{c}. -\ccPrecond{idem and $i \in \{0,1,2,3\}$ in dimension~3, $i = 3$ in -dimension~2.}} +{Starts at facet of index \ccc{f} in \ccc{start}.} +\ccGlue +\ccMethod{Facet_circulator incident_facets(Cell_handle c, int i, int j, +Facet start) const;} +{Idem for edge \ccc{(i,j)} of \ccc{c}.} +\ccGlue +\ccMethod{Facet_circulator incident_facets(Cell_handle c, int i, int j, +Cell_handle start, int f) const;} +{Idem for edge \ccc{(i,j)} of \ccc{c} and facet \ccc{(start,f)}.} \ccHeading{Traversal of the incident cells and the adjacent vertices of a given vertex} diff --git a/Packages/Triangulation_3/include/CGAL/Triangulation_3.h b/Packages/Triangulation_3/include/CGAL/Triangulation_3.h index f6a46d076cd..12205f8f6e1 100644 --- a/Packages/Triangulation_3/include/CGAL/Triangulation_3.h +++ b/Packages/Triangulation_3/include/CGAL/Triangulation_3.h @@ -74,6 +74,9 @@ class Triangulation_facet_iterator_3; template < class GT, class Tds> class Triangulation_cell_circulator_3; +template < class GT, class Tds> +class Triangulation_facet_circulator_3; + template < class GT, class Tds> class Triangulation_cell_3; @@ -81,7 +84,7 @@ template < class GT, class Tds > class Triangulation_3 :public Triangulation_utils_3 { - friend std::istream& operator>> CGAL_NULL_TMPL_ARGS + friend std::istream& operator >> CGAL_NULL_TMPL_ARGS (std::istream& is, Triangulation_3 &tr); friend class Triangulation_cell_3; @@ -94,6 +97,7 @@ class Triangulation_3 friend Triangulation_edge_iterator_3; friend Triangulation_vertex_iterator_3; friend Triangulation_cell_circulator_3; + friend Triangulation_facet_circulator_3; public: @@ -112,8 +116,7 @@ public: typedef Triangulation_cell_circulator_3 Cell_circulator; -// typedef Triangulation_edge_circulator_3 Edge_circulator; -// typedef Triangulation_vertex_circulator_3 Vertex_circulator; + typedef Triangulation_facet_circulator_3 Facet_circulator; typedef Triangulation_cell_iterator_3 Cell_iterator; typedef Triangulation_facet_iterator_3 Facet_iterator; @@ -718,7 +721,56 @@ public: = (Triangulation_3*)this; return Cell_circulator(ncthis,c,i,j,start); } + // + Facet_circulator incident_facets(const Edge & e) const + { + CGAL_triangulation_precondition( dimension() == 3 ); + Triangulation_3* ncthis + = (Triangulation_3*)this; + return Facet_circulator(ncthis,e); + } + Facet_circulator incident_facets(Cell_handle c, int i, int j) const + { + CGAL_triangulation_precondition( dimension() == 3 ); + Triangulation_3* ncthis + = (Triangulation_3*)this; + return Facet_circulator(ncthis,c,i,j); + } + Facet_circulator incident_facets(const Edge & e, + Facet start) const + { + CGAL_triangulation_precondition( dimension() == 3 ); + Triangulation_3* ncthis + = (Triangulation_3*)this; + return Facet_circulator(ncthis,e,start); + } + Facet_circulator incident_facets(Cell_handle c, int i, int j, + Facet start) const + { + CGAL_triangulation_precondition( dimension() == 3 ); + Triangulation_3* ncthis + = (Triangulation_3*)this; + return Facet_circulator(ncthis,c,i,j,start); + } + Facet_circulator incident_facets(const Edge & e, + Cell_handle start, int f) const + { + CGAL_triangulation_precondition( dimension() == 3 ); + Triangulation_3* ncthis + = (Triangulation_3*)this; + return Facet_circulator(ncthis,e,start,f); + } + Facet_circulator incident_facets(Cell_handle c, int i, int j, + Cell_handle start, int f) const + { + CGAL_triangulation_precondition( dimension() == 3 ); + Triangulation_3* ncthis + = (Triangulation_3*)this; + return Facet_circulator(ncthis,c,i,j,start,f); + } + + // void incident_cells(Vertex_handle v, std::set > & cells, @@ -762,7 +814,7 @@ public: template < class GT, class Tds > std::istream & -operator>> (std::istream& is, Triangulation_3 &tr) +operator >> (std::istream& is, Triangulation_3 &tr) // reads // the dimension // the number of finite vertices diff --git a/Packages/Triangulation_3/include/CGAL/Triangulation_circulators_3.h b/Packages/Triangulation_3/include/CGAL/Triangulation_circulators_3.h index e8f85c4d751..4d1db6abc4f 100644 --- a/Packages/Triangulation_3/include/CGAL/Triangulation_circulators_3.h +++ b/Packages/Triangulation_3/include/CGAL/Triangulation_circulators_3.h @@ -141,7 +141,7 @@ public: return tmp; } - inline Cell & operator*() const + inline Cell & operator*() const { return (Cell &)(*_cb); } @@ -156,6 +156,142 @@ private: Triangulation * _tr; }; +template < class Gt, class Tds> +class Triangulation_facet_circulator_3 + : public Bidirectional_circulator_base::Facet, + ptrdiff_t, size_t> +{ +public: + typedef typename Tds::Cell Ctds; + typedef typename Tds::Facet_circulator Circulator_base; + + typedef Triangulation_cell_3 Cell; + typedef Triangulation_vertex_3 Vertex; + typedef typename Vertex::Vertex_handle Vertex_handle; + typedef typename Cell::Cell_handle Cell_handle; + typedef Triangulation_3 Triangulation; + typedef typename Triangulation_3::Edge Edge; + typedef typename Triangulation_3::Facet Facet; + + typedef Triangulation_facet_circulator_3 Facet_circulator; + + Triangulation_facet_circulator_3() + : _cb(), _tr(NULL) + {} + + Triangulation_facet_circulator_3(Triangulation * tr, Cell_handle c, + int s, int t) + : _cb( &(tr->_tds), (Ctds *) &(*c), s, t ), _tr(tr) + {} + + Triangulation_facet_circulator_3(Triangulation * tr, Edge e) + : _cb( &(tr->_tds), (Ctds *) &(*(e.first)), e.second, e.third ), _tr(tr) + {} + + Triangulation_facet_circulator_3(Triangulation * tr, + Cell_handle c, int s, int t, + Facet start) + : _cb( &(tr->_tds), + (Ctds *) &(*c), s, t, + std::make_pair((Ctds *) &(*start.first), start.second) ), + _tr(tr) + {} + + Triangulation_facet_circulator_3(Triangulation * tr, Edge e, + Facet start) + : _cb( &(tr->_tds), + (Ctds *) &(*(e.first)), e.second, e.third, + std::make_pair((Ctds *) &(*start.first), start.second) ), + _tr(tr) + {} + + Triangulation_facet_circulator_3(Triangulation * tr, + Cell_handle c, int s, int t, + Cell_handle start, int f) + : _cb( &(tr->_tds), + (Ctds *) &(*c), s, t, + (Ctds *) &(*start), f ), + _tr(tr) + {} + + Triangulation_facet_circulator_3(Triangulation * tr, Edge e, + Cell_handle start, int f) + : _cb( &(tr->_tds), + (Ctds *) &(*(e.first)), e.second, e.third, + (Ctds *) &(*start), f ), + _tr(tr) + {} + + Triangulation_facet_circulator_3(const Facet_circulator & ccir) + : _cb(ccir._cb), _tr(ccir._tr) + {} + + Facet_circulator& + operator=(const Facet_circulator & ccir) + { + _cb = ccir._cb; + _tr = ccir._tr; + return *this; + } + + bool + operator==(const Facet_circulator & ccir) const + { + return ( _cb == ccir._cb); + } + + bool + operator!=(const Facet_circulator & ccir) + { + return ( !(*this == ccir) ); + } + + Facet_circulator & + operator++() + { + ++_cb; + return *this; + } + + Facet_circulator & + operator--() + { + --_cb; + return *this; + } + + Facet_circulator + operator++(int) + { + Facet_circulator tmp(*this); + ++(*this); + return tmp; + } + + Facet_circulator + operator--(int) + { + Facet_circulator tmp(*this); + --(*this); + return tmp; + } + + inline Facet & operator*() const + { + return (Facet &)(*_cb); + } + + inline Facet* operator->() const + { + return (Facet*)( &(*_cb) ); + } + +private: + Circulator_base _cb; + Triangulation * _tr; +}; + CGAL_END_NAMESPACE #endif // CGAL_TRIANGULATION_CIRCULATORS_3_H diff --git a/Packages/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h b/Packages/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h index 73fc170b5aa..3f438f9603f 100644 --- a/Packages/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h +++ b/Packages/Triangulation_3/include/CGAL/Triangulation_data_structure_3.h @@ -61,13 +61,15 @@ template class Triangulation_ds_vertex_iterator_3; template class Triangulation_ds_cell_circulator_3; +template +class Triangulation_ds_facet_circulator_3; template class Triangulation_data_structure_3 :public Triangulation_utils_3 { - friend std::istream& operator>> CGAL_NULL_TMPL_ARGS + friend std::istream& operator >> CGAL_NULL_TMPL_ARGS (std::istream&, Triangulation_data_structure_3&); // friend std::ostream& operator<< CGAL_NULL_TMPL_ARGS // (std::ostream& os, const Triangulation_data_structure_3 &tr); @@ -84,7 +86,11 @@ class Triangulation_data_structure_3 >; friend class Triangulation_ds_vertex_iterator_3 >; - + friend class Triangulation_ds_cell_circulator_3 + >; + friend class Triangulation_ds_facet_circulator_3 + >; + public: // typedef typename Vb::Point Point; @@ -101,6 +107,7 @@ public: typedef Triangulation_ds_edge_iterator_3 Edge_iterator; typedef Triangulation_ds_vertex_iterator_3 Vertex_iterator; typedef Triangulation_ds_cell_circulator_3 Cell_circulator; + typedef Triangulation_ds_facet_circulator_3 Facet_circulator; // CONSTRUCTORS @@ -388,6 +395,7 @@ public: // CIRCULATOR METHODS + // cells around an edge Cell_circulator incident_cells(const Edge & e) const { CGAL_triangulation_precondition( dimension() == 3 ); @@ -424,6 +432,62 @@ public: return Cell_circulator(ncthis,ce,i,j,start); } + //facets around an edge + Facet_circulator incident_facets(const Edge & e) const + { + CGAL_triangulation_precondition( dimension() == 3 ); + Tds* ncthis = (Tds *)this; + return Facet_circulator(ncthis,e); + } + +// Facet_circulator incident_facets(Cell* ce, int i, int j) const +// { +// return incident_cells(make_triple(ce,i,j)); +// } + Facet_circulator incident_facets(Cell* ce, int i, int j) const + { + CGAL_triangulation_precondition( dimension() == 3 ); + Tds* ncthis = (Tds *)this; + return Facet_circulator(ncthis,ce,i,j); + } + + Facet_circulator incident_facets(const Edge & e, Facet start) const + { + CGAL_triangulation_precondition( dimension() == 3 ); + Tds* ncthis = (Tds *)this; + return Facet_circulator(ncthis,e,start); + } + +// Facet_circulator incident_facets(Cell* ce, int i, int j, Cell* c) const +// { +// return incident_facets(make_triple(ce,i,j),c); +// } + Facet_circulator incident_facets(Cell* ce, int i, int j, Facet start) const + { + CGAL_triangulation_precondition( dimension() == 3 ); + Tds* ncthis = (Tds *)this; + return Facet_circulator(ncthis,ce,i,j,start); + } + + Facet_circulator incident_facets(const Edge & e, Cell* start, int f) const + { + CGAL_triangulation_precondition( dimension() == 3 ); + Tds* ncthis = (Tds *)this; + return Facet_circulator(ncthis,e,start,f); + } + +// Facet_circulator incident_facets(Cell* ce, int i, int j, Cell* c) const +// { +// return incident_facets(make_triple(ce,i,j),c); +// } + Facet_circulator incident_facets(Cell* ce, int i, int j, Cell* start, int f) const + { + CGAL_triangulation_precondition( dimension() == 3 ); + Tds* ncthis = (Tds *)this; + return Facet_circulator(ncthis,ce,i,j,start,f); + } + + // around a vertex void incident_cells(Vertex* v, std::set > & cells, Cell* c = NULL ) const; @@ -487,7 +551,7 @@ private: }; template < class Vb, class Cb> -std::istream& operator>> +std::istream& operator >> (std::istream& is, Triangulation_data_structure_3& tds) // reads : // the dimension diff --git a/Packages/Triangulation_3/include/CGAL/Triangulation_ds_circulators_3.h b/Packages/Triangulation_3/include/CGAL/Triangulation_ds_circulators_3.h index 42278b391f8..fe6893fb328 100644 --- a/Packages/Triangulation_3/include/CGAL/Triangulation_ds_circulators_3.h +++ b/Packages/Triangulation_3/include/CGAL/Triangulation_ds_circulators_3.h @@ -176,7 +176,6 @@ public: return *this; } - Cell_circulator operator--(int) { CGAL_triangulation_precondition( (pos != NULL) ); @@ -217,6 +216,234 @@ private: Cell* pos; // current cell }; +template < class Tds > +class Triangulation_ds_facet_circulator_3 + : public Bidirectional_circulator_base, + public Triangulation_utils_3 +{ + // circulates on facets around a given edge +public: + + typedef typename Tds::Cell Cell; + typedef typename Tds::Facet Facet; + typedef typename Tds::Edge Edge; + typedef typename Tds::Vertex Vertex; + + typedef Triangulation_ds_facet_circulator_3 Facet_circulator; + + // CONSTRUCTORS + + Triangulation_ds_facet_circulator_3() + : _tds(NULL), _c(NULL), pos(NULL) + { + _s = 0; + _t = 0; + } + +// Triangulation_ds_facet_circulator_3() +// : _tds(NULL), _e(), pos(NULL) +// { +// _e.first = NULL; +// _e.second = 0; +// _e.third = 0; +// } + + + Triangulation_ds_facet_circulator_3(Tds * tds, Cell* c, int s, int t) + : _tds(tds), _c(c), _s(s), _t(t) + { + CGAL_triangulation_precondition( c != NULL && + s >= 0 && s < 4 && + t >= 0 && t < 4 ); + // if ( _tds->dimension() <3 ) useless since precondition in tds + // incident_facets + pos = c; + } + + Triangulation_ds_facet_circulator_3(Tds * tds, Edge e) + : _tds(tds), _c(e.first), _s(e.second), _t(e.third) + { + CGAL_triangulation_precondition( e.first != NULL && + (e.second==0 || e.second==1 || + e.second==2 || e.second==3 ) && + (e.third==0 || e.third==1 || + e.third==2 || e.third==3 ) ); + // if ( _tds->dimension() <3 ) useless since precondition in tds + // incident_facets + pos = e.first; + } + + Triangulation_ds_facet_circulator_3(Tds * tds, Cell* c, int s, int t, + Cell* start, int f) + : _tds(tds), _c(c), _s(s), _t(t) + { + CGAL_triangulation_precondition( c != NULL && + s >= 0 && s < 4 && + t >= 0 && t < 4 && + f >= 0 && f < 4 ); + CGAL_triangulation_precondition_code + ( int i; int j; ) + CGAL_triangulation_precondition + ( start->has_vertex( c->vertex(s), i ) && + start->has_vertex( c->vertex(t), j ) && + ( f!=i && f!=j ) ); + if ( f == (int) nextposaround(i,j) ) pos = start; + else pos = start->neighbor(6-i-j-f); // other cell with same facet + } + + Triangulation_ds_facet_circulator_3(Tds * tds, Cell* c, int s, int t, + Facet start) + : _tds(tds), _c(c), _s(s), _t(t) + { + CGAL_triangulation_precondition( c != NULL && + s >= 0 && s < 4 && + t >= 0 && t < 4 ); + CGAL_triangulation_precondition_code + ( int i; int j; ) + CGAL_triangulation_precondition + ( start.first->has_vertex( c->vertex(s), i ) && + start.first->has_vertex( c->vertex(t), j ) && + ( start.second !=i && start.second !=j ) ); + + if ( start.second == (int) nextposaround(i,j) ) pos = start.first; + else pos = start.first->neighbor(6-i-j-start.second); + // other cell with same facet + } + + Triangulation_ds_facet_circulator_3(Tds * tds, Edge e, + Cell* start, int f) + : _tds(tds), _c(e.first), _s(e.second), _t(e.third) + { + CGAL_triangulation_precondition( e.first != NULL && + (e.second==0 || e.second==1 || + e.second==2 || e.second==3 ) && + (e.third==0 || e.third==1 || + e.third==2 || e.third==3 ) && + f >= 0 && f < 4 ); + CGAL_triangulation_precondition_code + ( int i; int j; ) + CGAL_triangulation_precondition + ( start.first->has_vertex( e.first->vertex(e.second), i ) && + start.first->has_vertex( e.first->vertex(e.third), j ) && + ( f!=i && f!=j ) ); + if ( f == (int) nextposaround(i,j) ) pos = start.first; + else pos = start.first->neighbor(6-i-j-f); // other cell with same facet + } + + Triangulation_ds_facet_circulator_3(Tds * tds, Edge e, Facet start) + : _tds(tds), _c(e.first), _s(e.second), _t(e.third) + { + CGAL_triangulation_precondition( e.first != NULL && + (e.second==0 || e.second==1 || + e.second==2 || e.second==3 ) && + (e.third==0 || e.third==1 || + e.third==2 || e.third==3 ) ); + CGAL_triangulation_precondition_code + ( int i; int j; ) + CGAL_triangulation_precondition + ( start.first->has_vertex( e.first->vertex(e.second), i ) && + start.first->has_vertex( e.first->vertex(e.third), j ) ); + if ( start.second == (int) nextposaround(i,j) ) pos = start.first; + else pos = start.first->neighbor(6-i-j-start.second); + } + + Triangulation_ds_facet_circulator_3(const Facet_circulator & ccir) + : _tds(ccir._tds), _c(ccir._c), _s(ccir._s), _t(ccir._t), pos(ccir.pos) + {} + + Facet_circulator & + operator=(const Facet_circulator & ccir) + { + _tds = ccir._tds; + _c = ccir._c; + _s = ccir._s; + _t = ccir._t; + pos = ccir.pos; + return *this; + } + + Facet_circulator & + operator++() + { + CGAL_triangulation_precondition( (pos != NULL) ); + //then dimension() cannot be < 3 +// int i = pos->index(_c->vertex(_s)); +// int j = pos->index(_c->vertex(_t)); + +// pos = pos->neighbor( nextposaround(i,j) ); + + pos = pos->neighbor( nextposaround( pos->index(_c->vertex(_s)), + pos->index(_c->vertex(_t)) ) ); + return *this; + } + + Facet_circulator operator++(int) + { + CGAL_triangulation_precondition( (pos != NULL) ); + Facet_circulator tmp(*this); + ++(*this); + return tmp; + } + + Facet_circulator& operator--() + { + CGAL_triangulation_precondition( (pos != NULL) ); +// int i = pos->index(_c->vertex(_s)); +// int j = pos->index(_c->vertex(_t)); + +// pos = pos->neighbor( nextposaround(j,i) ); + + pos = pos->neighbor( nextposaround( pos->index(_c->vertex(_t)), + pos->index(_c->vertex(_s)) ) ); + return *this; + } + + Facet_circulator operator--(int) + { + CGAL_triangulation_precondition( (pos != NULL) ); + Facet_circulator tmp(*this); + --(*this); + return tmp; + } + + inline Facet& operator*() const + { + return std::make_pair(*pos, + nextposaround( pos->index(_c->vertex(_s)), + pos->index(_c->vertex(_t)) ) ); + } + +// inline Facet* operator->() const +// { +// return pos; +// } + + bool operator==(const Facet_circulator & ccir) const + { + return ( ( _tds == ccir._tds ) && + ( _c->vertex(_s) == ccir._c->vertex(ccir._s) ) && + ( _c->vertex(_t) == ccir._c->vertex(ccir._t) ) && + ( pos == ccir.pos ) ); + } + + + bool operator!=(const Facet_circulator & ccir) const + { + return ! (*this == ccir); + } + +private: + Tds* _tds; + Cell* _c; // cell containing the considered edge + int _s; // index of the source vertex of the edge in _c + int _t; // index of the target vertex of the edge in _c + Cell* pos; // current cell + // the current fact is the facet of pos numbered + // nextposaround( pos->index(_c->vertex(_s)), + // pos->index(_c->vertex(_t)) ) +}; + CGAL_END_NAMESPACE #endif // CGAL_TRIANGULATION_DS_CIRCULATORS_3_H