Triangulation_2 new scheme - first trial

This commit is contained in:
Mariette Yvinec 1999-07-21 14:21:55 +00:00
parent 2ffbb9a22a
commit 461f4e4dee
8 changed files with 1476 additions and 1150 deletions

File diff suppressed because it is too large Load Diff

View File

@ -137,21 +137,28 @@ public:
// CHECKING
bool is_valid(bool verbose = false, int level = 0) const;
// HELPING
bool has_vertex(const Vertex* v) const;
//bool has_edge(const Vertex* v1, const Vertex* v2) const;
//bool has_face(const Vertex* v1, const Vertex* v2, const Vertex* v3) const;
//Edge has_edge(const Vertex* v1, const Vertex* v2) const;
//Face* has_face(const Vertex* v1, const Vertex* v2, const Vertex* v3) const;
void copy_tds(const Tds &tds);
Vertex* copy_tds(const Tds &tds, const Vertex*);
Vertex* file_input(std::istream& is);
void file_output(std::ostream& os,
Vertex* v = infinite_vertex()) const;
private:
// SETTING
void set_number_of_vertices(int n) {_number_of_vertices = n;}
void set_dimension (int n) {_dimension = n ;}
void set_infinite_vertex(Vertex* v) { _infinite_vertex = v;}
//HELPING fUNCTIONS
std::istream& file_input(std::istream& is);
std::ostream& file_output(std::ostream& os,
Vertex* v = infinite_vertex()) const;
void copy_tds(const Tds &tds);
// INFINITE FEATURES
// INFINITE FEATURES
Vertex* infinite_vertex() const {return _infinite_vertex; }
Face* infinite_face() const { return _infinite_vertex->face();}
bool is_infinite(const Face* f) const;
@ -834,21 +841,37 @@ is_valid(bool verbose, int level) const
// return;
// }
template < class Gt , class Vb, class Fb>
bool
Triangulation_default_data_structure_2<Gt,Vb,Fb>::
has_vertex(const Vertex* v) const
{
if (v == infinite_vertex()) return true; //short cut for frequent case
if (number_of_vertices() == 0) return false;
for (Vertex_iterator vit = vertices_begin();
vit != vertices_end(); ++vit) {
if ( v == &(*vit)) return true;
}
return false;
}
template < class Gt , class Vb, class Fb>
void
Triangulation_default_data_structure_2<Gt,Vb,Fb>::Vertex*
Triangulation_default_data_structure_2<Gt,Vb,Fb>::
copy_tds(const Tds &tds)
copy_tds(const Tds &tds, const Vertex* v)
{
CGAL_triangulation_precondition( tds.has_vertex(v));
_number_of_vertices = tds.number_of_vertices();
_geom_traits = tds.geom_traits();
//the class Geom_traits is required to have a pertinent operator=
_dimension = tds.dimension();
if(tds.number_of_vertices() == 0){return;}
if(tds.number_of_vertices() == 0){return static_cast<Vertex*>(NULL);}
std::map< void*, void*, less<void*> > V;
std::map< void*, void*, less<void*> > F;
std::map< const void*, void*, less<const void*> > V;
std::map< const void*, void*, less<const void*> > F;
Vertex* v2;
Face* f2;
@ -859,7 +882,7 @@ copy_tds(const Tds &tds)
V[&(*it)] = new Vertex( it->point() );
}
//set infinite_vertex
v2 = (Vertex*)V[tds.infinite_vertex()];
v2 = static_cast<Vertex*>(V[v]);
set_infinite_vertex(v2);
// create the faces
@ -887,7 +910,20 @@ copy_tds(const Tds &tds)
}
CGAL_triangulation_postcondition( is_valid() );
return;
return v2;
}
template < class Gt , class Vb, class Fb>
void
Triangulation_default_data_structure_2<Gt,Vb,Fb>::
copy_tds(const Tds &tds)
{
_number_of_vertices = tds.number_of_vertices();
_geom_traits = tds.geom_traits();
_dimension = tds.dimension();
if(tds.number_of_vertices() == 0){return;}
copy_tds(tds, tds.infinite_vertex());
}
template < class Gt , class Vb, class Fb>
@ -948,7 +984,7 @@ clear()
}
template <class Gt , class Vb, class Fb>
std::ostream&
void
Triangulation_default_data_structure_2<Gt,Vb,Fb>::
file_output( std::ostream& os, Vertex* v) const
{
@ -961,7 +997,7 @@ file_output( std::ostream& os, Vertex* v) const
int m = number_of_full_dim_faces();
if(is_ascii(os)) os << n << ' ' << m << ' ' << dimension() << endl;
else os << n << m << dimension();
if (n==0) return os;
if (n==0) return;
std::map< void*, int, less<void*> > V;
std::map< void*, int, less<void*> > F;
@ -1008,22 +1044,25 @@ file_output( std::ostream& os, Vertex* v) const
}
}
return os;
return ;
}
template <class Gt , class Vb, class Fb>
std::istream&
Triangulation_default_data_structure_2<Gt,Vb,Fb>::Vertex*
Triangulation_default_data_structure_2<Gt,Vb,Fb>::
file_input( std::istream& is)
{
//input from file
// set the first vertex as infinite_Vertex
//return a pointer to the first vertex
//set this first vertex as infinite_Vertex
if(number_of_vertices() != 0) clear();
int n, m, d;
is >> n >> m >> d;
if (n==0) return NULL;
set_number_of_vertices(n);
set_dimension(d);
@ -1058,7 +1097,8 @@ file_input( std::istream& is)
F[i]->set_neighbor(j, F[index]);
}
}
return is;
return V[0];
}
template <class Gt , class Vb, class Fb>
@ -1083,7 +1123,8 @@ std::istream&
operator>>(std::istream& is,
Triangulation_default_data_structure_2<Gt,Vb,Fb>& tds)
{
return tds.file_input(is);
tds.file_input(is);
return is;
}
@ -1092,7 +1133,8 @@ std::ostream&
operator<<(std::ostream& os,
const Triangulation_default_data_structure_2<Gt,Vb,Fb> &tds)
{
return tds.file_output(os,tds.infinite_vertex());
tds.file_output(os,tds.infinite_vertex());
return os;
}
CGAL_END_NAMESPACE

View File

@ -67,27 +67,11 @@ public:
Face& operator*() const ;
Face* operator->() const ;
bool operator==(const Face_circulator &fc) const
{ return (_v == fc._v) && (pos == fc.pos); }
bool operator!=(const Face_circulator &fc) const
{ return ! (*this == fc); }
bool is_empty() const
{ return ((_v == NULL) || (pos == NULL)); }
bool operator==(CGAL_NULL_TYPE n) const
{
CGAL_triangulation_assertion( n == NULL);
return (_v == NULL || pos == NULL);
}
bool operator!=(CGAL_NULL_TYPE n) const
{
CGAL_triangulation_assertion( n == NULL);
return ! (*this == NULL);
}
bool operator==(const Face_circulator &fc) const ;
bool operator!=(const Face_circulator &fc) const;
bool is_empty() const;
bool operator==(CGAL_NULL_TYPE n) const;
bool operator!=(CGAL_NULL_TYPE n) const;
};
@ -99,15 +83,6 @@ class Triangulation_ds_vertex_circulator_2 :
public Triangulation_cw_ccw_2
{
public:
// typedef Vertex value_type;
// typedef std:: ptrdiff_t difference_type;
// typedef std::size_t size_type;
// typedef Vertex* pointer;
// typedef const Vertex* const_pointer;
// typedef Vertex& reference;
// typedef const Vertex& const_reference;
// typedef CGAL::Bidirectional_circulator_tag iterator_category;
typedef Triangulation_ds_vertex_circulator_2<Vertex, Face>
Vertex_circulator;
private:
@ -126,51 +101,20 @@ public:
: _v(vc._v), pos(vc.pos), _ri(vc._ri)
{}
Vertex_circulator &operator=(const Vertex_circulator &vc)
{
_v = vc._v;
_ri = vc._ri;
pos = vc.pos;
return *this;
}
Vertex_circulator &operator=(const Vertex_circulator &vc);
Vertex_circulator& operator++();
Vertex_circulator operator++(int);
Vertex_circulator& operator--();
Vertex_circulator operator--(int);
Vertex& operator*() const ;
Vertex* operator->() const;
bool operator==(const Vertex_circulator &vc) const
{
return (_v == vc._v) && (_ri == vc._ri) && (pos == vc.pos);
}
bool operator!=(const Vertex_circulator &vc) const
{
return ! (*this == vc);
}
bool is_empty() const
{
return ((_v == NULL) || (pos == NULL));
}
bool operator==(CGAL_NULL_TYPE n) const
{
CGAL_triangulation_assertion( n == NULL);
return (_v == NULL) || (pos == NULL);
}
bool operator!=(CGAL_NULL_TYPE n) const
{
CGAL_triangulation_assertion( n == NULL);
return !(*this == NULL);
}
bool operator==(const Vertex_circulator &vc) const;
bool operator!=(const Vertex_circulator &vc) const;
bool is_empty() const;
bool operator==(CGAL_NULL_TYPE n) const;
bool operator!=(CGAL_NULL_TYPE n) const;
};
@ -186,15 +130,6 @@ public:
typedef Triangulation_ds_edge_circulator_2<Vertex,Face> Edge_circulator;
typedef std::pair<Face*, int> Edge;
// typedef Edge value_type;
// typedef std:: ptrdiff_t difference_type;
// typedef std::size_t size_type;
// typedef Edge* pointer;
// typedef const Edge* const_pointer;
// typedef Edge& reference;
// typedef const Edge& const_reference;
// typedef CGAL::Bidirectional_circulator_tag iterator_category;
private:
int _ri;
const Vertex* _v;
@ -211,49 +146,19 @@ public:
: _ri(vc._ri), _v(vc._v), pos(vc.pos)
{}
Edge_circulator &operator=(const Edge_circulator &vc)
{
_v = vc._v;
_ri = vc._ri;
pos = vc.pos;
return *this;
}
Edge_circulator &operator=(const Edge_circulator &vc);
Edge operator*() const ;
Edge_circulator& operator++();
Edge_circulator operator++(int);
Edge_circulator& operator--();
Edge_circulator operator--(int);
bool operator==(const Edge_circulator &vc) const
{
return (_v == vc._v) && (_ri == vc._ri) && (pos == vc.pos);
}
bool operator!=(const Edge_circulator &vc) const
{
return ! (*this == vc);
}
bool is_empty() const
{
return ((_v == NULL) || (pos == NULL));
}
bool operator==(CGAL_NULL_TYPE n) const
{
CGAL_triangulation_assertion( n == NULL);
return (_v == NULL) || (pos == NULL);
}
bool operator!=(CGAL_NULL_TYPE n) const
{
CGAL_triangulation_assertion( n == NULL);
return !(*this == NULL);
}
bool operator==(const Edge_circulator &vc) const;
bool operator!=(const Edge_circulator &vc) const;
bool is_empty() const;
bool operator==(CGAL_NULL_TYPE n) const;
bool operator!=(CGAL_NULL_TYPE n) const;
};
@ -333,6 +238,48 @@ operator->() const
}
template < class Vertex, class Face >
inline bool
Triangulation_ds_face_circulator_2<Vertex,Face> ::
operator==(const Face_circulator &fc) const
{
return (_v == fc._v) && (pos == fc.pos);
}
template < class Vertex, class Face >
inline bool
Triangulation_ds_face_circulator_2<Vertex,Face> ::
operator!=(const Face_circulator &fc) const
{
return ! (*this == fc);
}
template < class Vertex, class Face >
inline bool
Triangulation_ds_face_circulator_2<Vertex,Face> ::
is_empty() const
{
return ((_v == NULL) || (pos == NULL));
}
template < class Vertex, class Face >
inline bool
Triangulation_ds_face_circulator_2<Vertex,Face> ::
operator==(CGAL_NULL_TYPE n) const
{
CGAL_triangulation_assertion( n == NULL);
return (_v == NULL || pos == NULL);
}
template < class Vertex, class Face >
inline bool
Triangulation_ds_face_circulator_2<Vertex,Face> ::
operator!=(CGAL_NULL_TYPE n) const
{
CGAL_triangulation_assertion( n == NULL);
return ! (*this == NULL);
}
template < class Vertex, class Face >
Triangulation_ds_vertex_circulator_2<Vertex,Face> ::
Triangulation_ds_vertex_circulator_2 (const Vertex* v, const Face* f)
@ -348,6 +295,19 @@ Triangulation_ds_vertex_circulator_2 (const Vertex* v, const Face* f)
return;
}
template < class Vertex, class Face >
inline
Triangulation_ds_vertex_circulator_2<Vertex,Face>&
Triangulation_ds_vertex_circulator_2<Vertex,Face> ::
operator=(const Vertex_circulator &vc)
{
_v = vc._v;
_ri = vc._ri;
pos = vc.pos;
return *this;
}
template < class Vertex, class Face >
Triangulation_ds_vertex_circulator_2<Vertex,Face>&
Triangulation_ds_vertex_circulator_2<Vertex,Face> ::
@ -427,6 +387,49 @@ operator->() const
return pos->vertex(_ri);
}
template < class Vertex, class Face >
inline bool
Triangulation_ds_vertex_circulator_2<Vertex,Face> ::
operator==(const Vertex_circulator &vc) const
{
return (_v == vc._v) && (_ri == vc._ri) && (pos == vc.pos);
}
template < class Vertex, class Face >
inline bool
Triangulation_ds_vertex_circulator_2<Vertex,Face> ::
operator!=(const Vertex_circulator &vc) const
{
return ! (*this == vc);
}
template < class Vertex, class Face >
inline bool
Triangulation_ds_vertex_circulator_2<Vertex,Face> ::
is_empty() const
{
return ((_v == NULL) || (pos == NULL));
}
template < class Vertex, class Face >
inline bool
Triangulation_ds_vertex_circulator_2<Vertex,Face> ::
operator==(CGAL_NULL_TYPE n) const
{
CGAL_triangulation_assertion( n == NULL);
return (_v == NULL) || (pos == NULL);
}
template < class Vertex, class Face >
inline bool
Triangulation_ds_vertex_circulator_2<Vertex,Face> ::
operator!=(CGAL_NULL_TYPE n) const
{
CGAL_triangulation_assertion( n == NULL);
return !(*this == NULL);
}
template < class Vertex, class Face >
Triangulation_ds_edge_circulator_2<Vertex,Face> ::
Triangulation_ds_edge_circulator_2(const Vertex* v, const Face* f)
@ -442,6 +445,18 @@ Triangulation_ds_edge_circulator_2(const Vertex* v, const Face* f)
return;
}
template < class Vertex, class Face >
inline
Triangulation_ds_edge_circulator_2<Vertex,Face>&
Triangulation_ds_edge_circulator_2<Vertex,Face> ::
operator=(const Edge_circulator &vc)
{
_v = vc._v;
_ri = vc._ri;
pos = vc.pos;
return *this;
}
template < class Vertex, class Face >
inline std::pair<Face*, int>
Triangulation_ds_edge_circulator_2<Vertex,Face> ::
@ -513,6 +528,49 @@ operator--(int)
return tmp;
}
template < class Vertex, class Face >
inline bool
Triangulation_ds_edge_circulator_2<Vertex,Face> ::
operator==(const Edge_circulator &vc) const
{
return (_v == vc._v) && (_ri == vc._ri) && (pos == vc.pos);
}
template < class Vertex, class Face >
inline bool
Triangulation_ds_edge_circulator_2<Vertex,Face> ::
operator!=(const Edge_circulator &vc) const
{
return ! (*this == vc);
}
template < class Vertex, class Face >
inline bool
Triangulation_ds_edge_circulator_2<Vertex,Face> ::
is_empty() const
{
return ((_v == NULL) || (pos == NULL));
}
template < class Vertex, class Face >
inline bool
Triangulation_ds_edge_circulator_2<Vertex,Face> ::
operator==(CGAL_NULL_TYPE n) const
{
CGAL_triangulation_assertion( n == NULL);
return (_v == NULL) || (pos == NULL);
}
template < class Vertex, class Face >
inline bool
Triangulation_ds_edge_circulator_2<Vertex,Face> ::
operator!=(CGAL_NULL_TYPE n) const
{
CGAL_triangulation_assertion( n == NULL);
return !(*this == NULL);
}
CGAL_END_NAMESPACE
#endif //CGAL_TRIANGULATION_DS_CIRCULATORS_2_H

View File

@ -67,6 +67,7 @@ public:
//Vertex Access Member Functions
Vertex* vertex(int i) const;
Vertex* opposite_vertex(int i) const;
bool has_vertex(const Vertex* v) const;
bool has_vertex(const Vertex* v, int& i) const;
int index(const Vertex* v) const;
@ -76,6 +77,7 @@ public:
bool has_neighbor(const Face* n) const;
bool has_neighbor(const Face* n, int& i) const;
int index(const Face* n) const;
int opposite_index(int i) const;
//Miscelleanous
int dimension() const;
@ -128,6 +130,23 @@ vertex(int i) const
return( (Vertex*) (Fb::vertex(i)));
}
template < class Vb, class Fb >
inline
Triangulation_ds_vertex_2<Vb,Fb> *
Triangulation_ds_face_2<Vb,Fb>::
opposite_vertex(int i) const
{
return neighbor(i)->vertex(neighbor(i)->index(this));
}
template < class Vb, class Fb >
inline int
Triangulation_ds_face_2<Vb,Fb>::
opposite_index(int i) const
{
return neighbor(i)->index(this);
}
template < class Vb, class Fb >
inline bool
Triangulation_ds_face_2<Vb,Fb>::

View File

@ -51,8 +51,10 @@ public:
Triangulation_ds_vertex_2(const Point & p) : Vb(p) {}
Triangulation_ds_vertex_2(const Point & p, Face * f) : Vb(p, f ) {}
//SETTING
void set_face(Face* f) { Vb::set_face(f); }
//ACCESS
Face* face() const {return ( (Face *) (Vb::face()) );}
int degree() const ;
Vertex_circulator incident_vertices() const;

View File

@ -44,8 +44,6 @@ template < class Gt, class Tds >
class Triangulation_face_2 : public Tds::Face
{
public:
// typedef Tds Tds;
typedef Gt Geom_traits;
typedef typename Geom_traits::Point Point;
typedef typename Geom_traits::Segment Segment;
@ -62,26 +60,22 @@ public:
// typedef std::pair<Face_handle, int> Edge;
inline
Triangulation_face_2()
: Fa()
{ }
inline
Triangulation_face_2(const Vertex_handle& v0,
const Vertex_handle& v1,
const Vertex_handle& v2)
const Vertex_handle& v1,
const Vertex_handle& v2)
: Fa(&(*v0), &(*v1), &(*v2))
{}
inline
Triangulation_face_2(const Vertex_handle& v0,
const Vertex_handle& v1,
const Vertex_handle& v2,
const Face_handle& n0,
const Face_handle& n1,
const Face_handle& n2)
const Vertex_handle& v1,
const Vertex_handle& v2,
const Face_handle& n0,
const Face_handle& n1,
const Face_handle& n2)
: Fa(&(*v0), &(*v1), &(*v2),&(*n0), &(*n1), &(*n2))
{}
@ -93,7 +87,11 @@ public:
return ((Vertex *)(Fa::vertex(i)));
}
inline Vertex_handle opposite_vertex(int i) const
{
return ((Vertex *)(Fa::opposite_vertex(i)));
}
inline bool has_vertex(const Vertex_handle& v) const
{
return (Fa::has_vertex( & (*v)) );
@ -135,7 +133,11 @@ public:
return Fa::has_neighbor( &(*f), i);
}
inline int opposite_index(int i) const
{
return Fa::opposite_index(i);
}
inline Face_handle handle() const
{
return Face_handle(this);

View File

@ -35,27 +35,9 @@
CGAL_BEGIN_NAMESPACE
template < class Gt, class Tds >
class Triangulation_face_2;
template < class Gt, class Tds >
class Triangulation_vertex_2;
template < class Gt, class Tds>
class Triangulation_face_iterator_2;
template < class Gt, class Tds>
class Triangulation_vertex_iterator_2;
template < class Gt, class Tds>
class Triangulation_edge_iterator_2;
template < class Gt, class Tds>
class Triangulation_face_iterator_2
:
//public bidirectional_iterator<Triangulation_face_2<Gt,Tds>,ptrdiff_t>,
public Triangulation_cw_ccw_2
class Triangulation_all_faces_iterator_2
: public typename Tds::Face_iterator
{
public:
typedef Triangulation_face_2<Gt,Tds> value_type;
@ -65,130 +47,135 @@ public:
typedef std::ptrdiff_t difference_type;
typedef std::bidirectional_iterator_tag iterator_category;
typedef typename Tds::Vertex Ve;
typedef typename Tds::Face Fa;
typedef typename Tds::Face_iterator Iterator_base;
typedef typename Tds::Face_iterator Base;
typedef Triangulation_2<Gt,Tds> Triangulation;
typedef typename Triangulation::Face Face;
typedef typename Triangulation::Vertex Vertex;
typedef typename Triangulation::Vertex_handle Vertex_handle;
typedef typename Triangulation::Face_handle Face_handle;
typedef typename Triangulation::Edge Edge;
typedef Triangulation_All_faces_iterator_2<Gt,Tds> All_faces_iterator;
typedef Triangulation_face_iterator_2<Gt,Tds> Face_iterator;
typedef Triangulation_edge_iterator_2<Gt,Tds> Edge_iterator;
typedef Triangulation_vertex_iterator_2<Gt,Tds> Vertex_iterator;
private:
Iterator_base _ib;
Triangulation* _tr;
public:
Triangulation_face_iterator_2()
: _ib(), _tr(NULL)
Triangulation_All_faces_iterator_2()
: Base()
{}
Triangulation_face_iterator_2(Triangulation_2<Gt,Tds> *tr)
: _ib( &(tr->_tds)), _tr(tr)
{
if (tr->dimension() == 0 ||tr->dimension() ==1){
_ib = Iterator_base(&(tr->_tds),1);
return;
}
while ( _ib != Iterator_base(&(tr->_tds),1) && _tr->is_infinite((Face *) &(*_ib))){
++_ib;
}
return;
}
Triangulation_face_iterator_2(Triangulation_2<Gt,Tds> *tr, int i)
: _ib( &(tr->_tds), i), _tr(tr)
Triangulation_All_faces_iterator_2(const Triangulation_2<Gt,Tds> *tr)
: Base(tr)
Triangulation_All_faces_iterator_2(Triangulation_2<Gt,Tds> *tr, int i)
: Base(tr,1)
{ }
Triangulation_face_iterator_2(const Face_iterator& fi)
: _ib(fi._ib), _tr(fi._tr)
{}
Face_iterator&
operator=(const Face_iterator& fi)
{
_ib = fi._ib;
_tr = fi._tr;
return *this;
}
bool
operator==(const Face_iterator& fi) const
{
return ( _tr == fi._tr && _ib == fi._ib);
}
bool
operator!=(const Face_iterator& fi)
All_Faces_iterator& operator++()
{
return !(*this == fi);
}
Face_iterator&
operator++()
{
++_ib;
while ( _ib != Iterator_base(&(_tr->_tds),1) && _tr->is_infinite((Face *)&( *_ib))){
++_ib;
}
Base::operator++();
return *this;
}
Face_iterator&
operator--()
All_Faces_iterator& operator--()
{
--ib;
while ( _ib != Iterator_base(&(_tr->_tds),1) && _tr->is_infinite((Face *) &(*_ib))){
--_ib;
}
return *this;
Base::operator--()
return *this;
}
Face_iterator
operator++(int)
All_Faces_iterator operator++(int)
{
Face_iterator tmp(*this);
All_Faces_iterator tmp(*this);
++(*this);
return tmp;
}
Face_iterator
operator--(int)
All_Faces_iterator operator--(int)
{
Face_iterator tmp(*this);
All_Faces_iterator tmp(*this);
--(*this);
return tmp;
}
inline Face& operator*() const
Faces& operator*() const
{
return (Face &)(*_ib);
return static_cast<Faces &>(Base::operator*());
}
inline Face* operator->() const
Faces* operator->() const
{
return (Face*)( & (*_ib));
return static_cast<Faces *>(Base::operator->());
}
};
template < class Gt, class Tds>
class Triangulation_vertex_iterator_2
:
//public bidirectional_iterator<Triangulation_vertex_2<Gt,Tds>,ptrdiff_t>,
public Triangulation_cw_ccw_2
class Triangulation_Finite_faces_iterator_2
: public Triangulation_All_faces_iterator_2<Gt,Tds>
{
public:
typedef Triangulation_2<Gt,Tds> Triangulation;
typedef Triangulation_All_faces_iterator_2<Gt,Tds> All;
typedef Triangulation_Finite_faces_iterator_2<Gt,Tds> Finite_faces_iterator;
private:
const Triangulation* _tr;
public:
Triangulation_Finite_faces_iterator_2()
: All(), _tr()
{}
Triangulation_Finite_faces_iterator_2(const Triangulation* tr)
: All(tr), _tr(tr)
{
while ( *this != All(tr,1) && ( _tr->is_infinite(& **this)))
All::operator++();
return;
}
Triangulation_Finite_faces_iterator_2(const Triangulation* tr, int i)
: All(tr,i), _tr(tr)
{ }
Finite_faces_iterator& operator++()
{
All::operator++();
while ( *this != All(_tr,1) && _tr->is_infinite(&**this){
All::operator++();
}
return *this;
}
Finite_faces_iterator& operator--()
{
All::operator--();
while ( *this != All(_tr,1) &&
_tr->is_infinite(&**this)){
All::operator--();
}
return *this;
}
Finite_faces_iterator operator++(int)
{
Finite_Faces_iterator tmp(*this);
++(*this);
return tmp;
}
Finite_faces_iterator operator--(int)
{
Finite_Faces_iterator tmp(*this);
--(*this);
return tmp;
}
};
template < class Gt, class Tds>
class Triangulation_all_vertices_iterator_2
: public typename Tds::Vertex_iterator
{
public:
typedef Triangulation_vertex_2<Gt,Tds> value_type;
@ -198,249 +185,260 @@ public:
typedef std::ptrdiff_t difference_type;
typedef std::bidirectional_iterator_tag iterator_category;
typedef typename Tds::Vertex Ve;
typedef typename Tds::Face Fa;
typedef typename Tds::Vertex_iterator Iterator_base;
typedef typename Tds::Vertex_iterator Base;
typedef Triangulation_2<Gt,Tds> Triangulation;
typedef typename Triangulation::Face Face;
typedef typename Triangulation::Vertex Vertex;
typedef typename Triangulation::Vertex_handle Vertex_handle;
typedef typename Triangulation::Face_handle Face_handle;
typedef typename Triangulation::Edge Edge;
typedef Triangulation_face_iterator_2<Gt,Tds> Face_iterator;
typedef Triangulation_edge_iterator_2<Gt,Tds> Edge_iterator;
typedef Triangulation_vertex_iterator_2<Gt,Tds> Vertex_iterator;
private:
Iterator_base _ib;
Triangulation* _tr;
typedef Triangulation_all_vertices_iterator_2<Gt,Tds> All_vertices_iterator;
public:
Triangulation_vertex_iterator_2()
: _ib(),_tr(NULL)
Triangulation_all_vertices_iterator_2()
: Base()
{}
Triangulation_vertex_iterator_2(Triangulation_2<Gt,Tds> *tr)
: _ib( &(tr->_tds)), _tr(tr)
{
if (_tr->number_of_vertices() == 0) { _ib = Iterator_base(&(tr->_tds),1);}
//else if ( _tr->is_infinite( (Vertex &) *_ib) ) { ++_ib;}
else if ( _tr->is_infinite( (Vertex *) &(*_ib)) ){ ++_ib;}
return;
}
Triangulation_all_vertices_iterator_2(Triangulation * tr)
: Base(tr)
{ }
Triangulation_vertex_iterator_2(Triangulation_2<Gt,Tds> *tr, int i)
: _ib( &(tr->_tds), i), _tr(tr)
{ }
Triangulation_vertex_iterator_2(Triangulation *tr, int i)
: Base(tr,i)
{ }
Triangulation_vertex_iterator_2(const Vertex_iterator& vi)
: _ib(vi._ib), _tr(vi._tr)
{}
Vertex_iterator&
operator=(const Vertex_iterator& vi)
{
_tr = vi._tr;
_ib = vi._ib;
return *this;
}
bool
operator==(const Vertex_iterator& vi) const
All_vertices_iterator& operator++()
{
return ( _tr == vi._tr && _ib == vi._ib);
}
bool
operator!=(const Vertex_iterator& vi)
{
return !(*this == vi);
}
Vertex_iterator&
operator++()
{
++_ib;
while ( _ib != Iterator_base(&(_tr->_tds),1) &&
_tr->is_infinite((Vertex *) &(*_ib))){
++_ib;
}
Base::operator++();
return *this;
}
Vertex_iterator&
operator--()
All_vertices_iterator& operator--()
{
--_ib;
while ( _ib != Iterator_base(&(_tr->_tds),1) &&
_tr->is_infinite((Vertex *) &(*_ib))){
--_ib;
}
Base::operator--();
return *this;
}
Vertex_iterator
operator++(int)
All_vertices_iterator operator++(int)
{
Vertex_iterator tmp(*this);
All_Vertices_iterator tmp(*this);
++(*this);
return tmp;
}
Vertex_iterator
operator--(int)
All_vertices_iterator operator--(int)
{
Vertex_iterator tmp(*this);
All_Vertices_iterator tmp(*this);
--(*this);
return tmp;
}
inline Vertex& operator*() const
Vertex& operator*() const
{
return (Vertex &)(*_ib);
return static_cast<Vertex&>(Base::operator*());
}
inline Vertex* operator->() const
Vertex* operator->() const
{
return (Vertex*)( & (*_ib));
return static_cast<Vertex*>(Base::operator->());
}
};
template < class Gt, class Tds>
class Triangulation_edge_iterator_2
:
// public bidirectional_iterator<typename
// Triangulation_2<Gt,Tds>::Edge ,ptrdiff_t>,
public Triangulation_cw_ccw_2
class Triangulation_Finite_vertices_iterator_2
: public Triangulation_All_vertices_iterator_2<Gt,Tds>
{
public:
typedef typename Tds::Vertex Ve;
typedef typename Tds::Face Fa;
typedef typename Tds::Edge_iterator Iterator_base;
typedef Triangulation_All_vertices_iterator_2<Gt,Tds> All;
typedef Triangulation_Finite_vertices_iterator_2<Gt,Tds>
Finite_vertice_iterator;
private:
Triangulation* _tr;
typedef Triangulation_2<Gt,Tds> Triangulation;
typedef typename Triangulation::Face Face;
typedef typename Triangulation::Vertex Vertex;
typedef typename Triangulation::Vertex_handle Vertex_handle;
typedef typename Triangulation::Face_handle Face_handle;
typedef typename Triangulation::Edge Edge;
public:
Triangulation_finite_vertices_iterator_2()
: All(),_tr(NULL)
{}
Triangulation_finite_vertices_iterator_2(Triangulation *tr)
: All(tr), _tr(tr)
{
while ( *this != All(tr,int) && ( _tr->is_infinite(& **this)))
All::operator++();
return;
}
typedef Triangulation_face_iterator_2<Gt,Tds> Face_iterator;
typedef Triangulation_edge_iterator_2<Gt,Tds> Edge_iterator;
typedef Triangulation_vertex_iterator_2<Gt,Tds> Vertex_iterator;
Triangulation_finite_vertices_iterator_2(Triangulation_2<Gt,Tds> *tr, int i)
: All(tr,i), _tr(tr)
{ }
Finite_vertices_iterator& operator++()
{
All::operator++();
while ( *this != All(_tr,1) && _tr->is_infinite(&**this)){
All::operator++();
}
return *this;
}
Finite_vertices_iterator& operator--()
{
All::operator--();
while ( *this != All(_tr,1) && _tr->is_infinite(&**this)){
All::operator--();
}
return *this;
}
Finite_vertices_iterator
operator++(int)
{
Finite_vertices_iterator tmp(*this);
++(*this);
return tmp;
}
Finite_vertices_iterator
operator--(int)
{
Finite_Vertices_iterator tmp(*this);
--(*this);
return tmp;
}
};
template < class Gt, class Tds>
class Triangulation_all_edges_iterator_2
: public typename Tds::Edge_iterator
{
public:
typedef Edge value_type;
typedef Edge * pointer;
typedef Edge & reference;
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
typedef std::bidirectional_iterator_tag iterator_category;
typedef Triangulation_2<Gt,Tds> Triangulation;
typedef Triangulation::Edge Edge;
typedef Triangulation::Face Face;
typedef Triangulation::Face_handle Face_handle;
typedef typename Tds::Edge_iterator Base;
typedef Triangulation_all_edges_iterator_2<Gt,Tds> All_edges_iterator;
private:
Iterator_base _ib;
Triangulation* _tr;
public:
Triangulation_edge_iterator_2()
: _ib(), _tr(NULL)
{}
Triangulation_all_edges_iterator_2()
: Base()
{}
Triangulation_edge_iterator_2(CGAL_Triangulation_2<Gt,Tds> *tr)
: _ib( &(tr->_tds)), _tr(tr)
{
if (_tr->dimension() == 0 ) {
_ib = Iterator_base(&(tr->_tds),1);
return;
}
while ( _ib != Iterator_base(&(tr->_tds),1) &&
_tr->is_infinite((Face *)((*_ib).first), (*_ib).second)){
++_ib;
}
return;
}
Triangulation_edge_iterator_2(Triangulation_2<Gt,Tds> *tr, int i)
: _ib( &(tr->_tds), i), _tr(tr)
Triangulation_all_edges_iterator_2(Triangulation *tr)
: Base(tr)
{}
Triangulation_all_edges_iterator_2(Triangulation *tr, int i)
: Base(tr,i)
{ }
Triangulation_edge_iterator_2(const Edge_iterator& ei)
: _ib(ei._ib), _tr(ei._tr)
{}
Edge_iterator&
operator=(const Edge_iterator& ei)
{
_tr = ei._tr;
_ib = ei._ib;
All_edges_iterator& operator++()
{
Base::operator++();
return *this;
}
bool
operator==(const Edge_iterator& ei) const
{
return ( _tr == ei._tr && _ib == ei._ib);
}
bool
operator!=(const Edge_iterator& ei)
{
return !(*this == ei);
}
Edge_iterator&
operator++()
{
++_ib;
while ( _ib != Iterator_base(&(_tr->_tds),1) &&
_tr->is_infinite((Face *)((*_ib).first), (*_ib).second)){
++_ib;
}
return *this;
}
Edge_iterator&
All_edges_iterator&
operator--()
{
--_ib;
while ( _ib != Iterator_base(&(_tr->_tds),1) &&
_tr->is_infinite((Face *)((*_ib).first), *_ib.second)){
--_ib;
}
return *this;
Base::operator--();
return *this;
}
Edge_iterator
All_edges_iterator
operator++(int)
{
Edge_iterator tmp(*this);
All_edges_iterator tmp(*this);
++(*this);
return tmp;
}
Edge_iterator
All_edges_iterator
operator--(int)
{
Edge_iterator tmp(*this);
All_Edges_iterator tmp(*this);
--(*this);
return tmp;
}
inline Edge operator*() const
Edge operator*() const
{
Face_handle fh = (Face *)((*_ib).first);
return std::make_pair( fh , (*_ib).second );
Face_handle fh = static_cast<Face *>(Base::operator*().first);
return std::make_pair( fh , Base::operator*().second );
}
template < class Gt, class Tds>
class Triangulation_finite_edges_iterator_2
: public Triangulation_all_edges_iterator_2<Gt,Tds>
{
public:
typedef Triangulation_all_edges_iterator_2<Gt,Tds> All;
typedef Triangulation_finite_edges_iterator_2<Gt,Tds> Finite_edges_iterator;
private:
Triangulation* _tr;
public:
Triangulation_finite_edges_iterator_2()
: All(), _tr(NULL)
{}
Triangulation_finite_edges_iterator_2(Triangulation *tr)
: All(),_tr(NULL)
{
while ( *this != All(tr,int) && ( _tr->is_infinite(& **this)))
All::operator++();
return;
}
Triangulation_finite_edges_iterator_2(Triangulation_2<Gt,Tds> *tr, int i)
: All(tr,i), _tr(tr)
{ }
Finite_edges_iterator& operator++()
{
All::operator++()
while ( *this != All(_tr,1) && _tr->is_infinite(&**this)){
All::operator++()
}
return *this;
}
Finite_edges_iterator&
operator--()
{
All::operator--();
while ( *this != All(_tr,1) && _tr->is_infinite(&**this)){
All::operator--();
}
return *this;
}
Finite_Edges_iterator
operator++(int)
{
Finite_Edges_iterator tmp(*this);
++(*this);
return tmp;
}
Finite_Edges_iterator
operator--(int)
{
Finite_Edges_iterator tmp(*this);
--(*this);
return tmp;
}
};
CGAL_END_NAMESPACE

View File

@ -27,31 +27,38 @@
//Define shorter names to please linker (g++/egcs)
#define Triangulation_default_data_structure_2 Tdds
#define Triangulation_vertex_base_2 Tvb
#define Triangulation_face_base_2 Tfb
#define Triangulation_euclidean_traits_2 Et2
#define Triangulation_euclidean_traits_xy_3 Etxy3
#define Triangulation_euclidean_traits_xz_3 Etxz3
#define Triangulation_euclidean_traits_yz_3 Etyz3
#define Triangulation_default_data_structure_2 Tdds
#define Triangulation_vertex_base_2 Tvb
#define Triangulation_face_base_2 Tfb
#define Triangulation_euclidean_traits_2 Et2
#define Triangulation_euclidean_traits_xy_3 Etxy3
#define Triangulation_euclidean_traits_xz_3 Etxz3
#define Triangulation_euclidean_traits_yz_3 Etyz3
#define Constrained_triangulation_face_base_2 Ctfb
#define Regular_triangulation_euclidean_traits_2 Rtet2
#define Triangulation_ds_vertex_2 Tdsv
#define Triangulation_ds_face_2 Tdsf
#define Triangulation_vertex_2 Tv
#define Triangulation_face_2 Tf
#define Triangulation_vertex_handle_2 Tvh
#define Triangulation_face_handle_2 Tfh
#define Triangulation_vertex_iterator_2 Tvi
#define Triangulation_face_iterator_2 Tfi
#define Triangulation_edge_iterator_2 Tei
#define Triangulation_vertex_circulator_2 Tvc
#define Triangulation_face_circulator_2 Tfc
#define Triangulation_edge_circulator_2 Tec
#define Regular_triangulation_face_base_2 Rtfb
#define Triangulation_ds_vertex_2 Tdsv
#define Triangulation_ds_face_2 Tdsf
#define Triangulation_vertex_2 Tv
#define Triangulation_face_2 Tf
#define Triangulation_vertex_handle_2 Tvh
#define Triangulation_face_handle_2 Tfh
#define Triangulation_vertex_iterator_2 Tvi
#define Triangulation_face_iterator_2 Tfi
#define Triangulation_edge_iterator_2 Tei
#define Triangulation_all_faces_iterator_2 Tafi
#define Triangulation_all_edges_iterator_2 Taei
#define Triangulation_all_vertices_iterator_2 Tavi
#define Triangulation_finite_faces_iterator_2 Tffi
#define Triangulation_finite_edges_iterator_2 Tfei
#define Triangulation_finite_vertices_iterator_2 Tfvi
#define Triangulation_vertex_circulator_2 Tvc
#define Triangulation_face_circulator_2 Tfc
#define Triangulation_edge_circulator_2 Tec
#define Constrained_triangulation_face_base_2 Ctfb
#define Regular_triangulation_euclidean_traits_2 Rtet2
#define Regular_triangulation_face_base_2 Rtfb