Add_range_support for Arrangement Dcel.

This commit is contained in:
Maxime Gimeno 2016-11-07 16:25:23 +01:00
parent fc29bc3a6a
commit 3016500246
5 changed files with 164 additions and 9 deletions

View File

@ -545,6 +545,10 @@ returning constant iterators instead of mutable ones.
*/ */
Vertex_iterator vertices_end(); Vertex_iterator vertices_end();
/*!
returns a range over handles of the arrangement vertices .
*/
unspecified_type vertex_handles();
/*! /*!
returns the number of arrangement vertices that lie at infinity and returns the number of arrangement vertices that lie at infinity and
are not associated with valid points. Such vertices are not considered are not associated with valid points. Such vertices are not considered
@ -578,6 +582,11 @@ returning constant iterators instead of mutable ones.
*/ */
Halfedge_iterator halfedges_end(); Halfedge_iterator halfedges_end();
/*!
returns a range over handles of the arrangement halfedges .
*/
unspecified_type halfedge_handles();
/*! /*!
returns the number of edges in the arrangement (equivalent to returns the number of edges in the arrangement (equivalent to
`arr.number_of_halfedges() / 2`). `arr.number_of_halfedges() / 2`).
@ -594,6 +603,10 @@ returning constant iterators instead of mutable ones.
*/ */
Edge_iterator edges_end(); Edge_iterator edges_end();
/*!
returns a range over handles of the arrangement edges .
*/
unspecified_type edge_handles();
/// @} /// @}
@ -627,6 +640,11 @@ returning constant iterators instead of mutable ones.
*/ */
Face_iterator faces_end(); Face_iterator faces_end();
/*!
returns a range over handles of the arrangement faces .
*/
unspecified_type face_handles();
/*! /*!
returns the number of unbounded faces in the arrangement. returns the number of unbounded faces in the arrangement.
Note `arr.number_of_faces()` also counts the unbounded faces Note `arr.number_of_faces()` also counts the unbounded faces

View File

@ -163,6 +163,11 @@ returns a past-the-end iterator of the vertices in `dcel`.
*/ */
Vertex_iterator vertices_end(); Vertex_iterator vertices_end();
/*!
returns a range over handles of the vertices in `dcel`.
*/
unspecified_type vertex_handles();
/*! /*!
returns a begin-iterator of the vertices in `dcel`. returns a begin-iterator of the vertices in `dcel`.
*/ */
@ -173,6 +178,11 @@ returns a past-the-end iterator of the vertices in `dcel`.
*/ */
Vertex_const_iterator vertices_end() const; Vertex_const_iterator vertices_end() const;
/*!
returns a const range over handles of the vertices in `dcel`.
*/
unspecified_type vertex_handles() const;
/*! /*!
returns a begin-iterator of the halfedges in `dcel`. returns a begin-iterator of the halfedges in `dcel`.
*/ */
@ -183,6 +193,11 @@ returns a past-the-end iterator of the halfedges in `dcel`.
*/ */
Halfedge_iterator halfedges_end(); Halfedge_iterator halfedges_end();
/*!
returns a range over handles of the halfedges in `dcel`.
*/
unspecified_type halfedge_handles();
/*! /*!
returns a begin-iterator of the halfedges in `dcel`. returns a begin-iterator of the halfedges in `dcel`.
*/ */
@ -193,6 +208,11 @@ returns a past-the-end iterator of the halfedges in `dcel`.
*/ */
Halfedge_const_iterator halfedges_end() const; Halfedge_const_iterator halfedges_end() const;
/*!
returns a cosnt range over handles of the halfedges in `dcel`.
*/
unspecified_type halfedge_handles() const;
/*! /*!
returns a begin-iterator of the faces in `dcel`. returns a begin-iterator of the faces in `dcel`.
*/ */
@ -203,6 +223,11 @@ returns a past-the-end iterator of the faces in `dcel`.
*/ */
Face_iterator faces_end(); Face_iterator faces_end();
/*!
returns a range over handles of the faces in `dcel`.
*/
unspecified_type faces_handles();
/*! /*!
returns a begin-iterator of the faces in `dcel`. returns a begin-iterator of the faces in `dcel`.
*/ */
@ -213,6 +238,10 @@ returns a past-the-end iterator of the faces in `dcel`.
*/ */
Face_const_iterator faces_end() const; Face_const_iterator faces_end() const;
/*!
returns a const range over handles of the faces in `dcel`.
*/
unspecified_type faces_handles() const;
/// @} /// @}

View File

@ -1011,24 +1011,64 @@ public:
//@{ //@{
Vertex_iterator vertices_begin() { return vertices.begin(); } Vertex_iterator vertices_begin() { return vertices.begin(); }
Vertex_iterator vertices_end() { return vertices.end(); } Vertex_iterator vertices_end() { return vertices.end(); }
Iterator_range<Prevent_deref<Vertex_iterator> >
vertex_handles()
{
return make_prevent_deref_range(vertices_begin(), vertices_end());
}
Halfedge_iterator halfedges_begin() { return halfedges.begin();} Halfedge_iterator halfedges_begin() { return halfedges.begin();}
Halfedge_iterator halfedges_end() { return halfedges.end(); } Halfedge_iterator halfedges_end() { return halfedges.end(); }
Iterator_range<Prevent_deref<Halfedge_iterator> >
halfegde_handles()
{
return make_prevent_deref_range(halfedges_begin(), halfedges_end());
}
Face_iterator faces_begin() { return faces.begin(); } Face_iterator faces_begin() { return faces.begin(); }
Face_iterator faces_end() { return faces.end(); } Face_iterator faces_end() { return faces.end(); }
Iterator_range<Prevent_deref<Face_iterator> >
face_handles()
{
return make_prevent_deref_range(faces_begin(), faces_end());
}
Edge_iterator edges_begin() { return halfedges.begin(); } Edge_iterator edges_begin() { return halfedges.begin(); }
Edge_iterator edges_end() { return halfedges.end(); } Edge_iterator edges_end() { return halfedges.end(); }
Iterator_range<Prevent_deref<Edge_iterator> >
edge_handles()
{
return make_prevent_deref_range(edges_begin(), edges_end());
}
//@} //@}
/// \name Obtaining constant iterators. /// \name Obtaining constant iterators.
//@{ //@{
Vertex_const_iterator vertices_begin() const { return vertices.begin(); } Vertex_const_iterator vertices_begin() const { return vertices.begin(); }
Vertex_const_iterator vertices_end() const { return vertices.end(); } Vertex_const_iterator vertices_end() const { return vertices.end(); }
Iterator_range<Prevent_deref<Vertex_iterator> >
vertex_handles() const
{
return make_prevent_deref_range(vertices_begin(), vertices_end());
}
Halfedge_const_iterator halfedges_begin() const { return halfedges.begin(); } Halfedge_const_iterator halfedges_begin() const { return halfedges.begin(); }
Halfedge_const_iterator halfedges_end() const { return halfedges.end(); } Halfedge_const_iterator halfedges_end() const { return halfedges.end(); }
Iterator_range<Prevent_deref<Halfedge_iterator> >
halfegde_handles() const
{
return make_prevent_deref_range(halfedges_begin(), halfedges_end());
}
Face_const_iterator faces_begin() const { return faces.begin(); } Face_const_iterator faces_begin() const { return faces.begin(); }
Face_const_iterator faces_end() const { return faces.end(); } Face_const_iterator faces_end() const { return faces.end(); }
Iterator_range<Prevent_deref<Face_iterator> >
face_handles() const
{
return make_prevent_deref_range(faces_begin(), faces_end());
}
Edge_const_iterator edges_begin() const { return halfedges.begin(); } Edge_const_iterator edges_begin() const { return halfedges.begin(); }
Edge_const_iterator edges_end() const { return halfedges.end(); } Edge_const_iterator edges_end() const { return halfedges.end(); }
Iterator_range<Prevent_deref<Edge_iterator> >
edge_handles() const
{
return make_prevent_deref_range(edges_begin(), edges_end());
}
//@} //@}
// \name Creation of new DCEL features. // \name Creation of new DCEL features.

View File

@ -1024,6 +1024,15 @@ public:
_Is_concrete_vertex(&m_topol_traits))); _Is_concrete_vertex(&m_topol_traits)));
} }
/*!
returns a range over handles of the arrangement vertices .
*/
Iterator_range<Prevent_deref<Vertex_iterator> >
vertex_handles()
{
return make_prevent_deref_range(vertices_begin(), vertices_end());
}
/*! Get a const iterator for the first vertex in the arrangement. */ /*! Get a const iterator for the first vertex in the arrangement. */
Vertex_const_iterator vertices_begin() const Vertex_const_iterator vertices_begin() const
{ {
@ -1039,6 +1048,16 @@ public:
_dcel().vertices_end(), _dcel().vertices_end(),
_Is_concrete_vertex(&m_topol_traits))); _Is_concrete_vertex(&m_topol_traits)));
} }
/*!
returns a const range over handles of the arrangement vertices .
*/
Iterator_range<Prevent_deref<Vertex_iterator> >
vertex_handles() const
{
return make_prevent_deref_range(vertices_begin(), vertices_end());
}
//@} //@}
/// \name Traversal functions for the arrangement halfedges. /// \name Traversal functions for the arrangement halfedges.
@ -1060,6 +1079,15 @@ public:
_Is_valid_halfedge(&m_topol_traits))); _Is_valid_halfedge(&m_topol_traits)));
} }
/*!
returns a range over handles of the arrangement halfedges .
*/
Iterator_range<Prevent_deref<Halfedge_iterator> >
halfedge_handles()
{
return make_prevent_deref_range(halfedges_begin(), halfedges_end());
}
/*! Get a const iterator for the first halfedge in the arrangement. */ /*! Get a const iterator for the first halfedge in the arrangement. */
Halfedge_const_iterator halfedges_begin() const Halfedge_const_iterator halfedges_begin() const
{ {
@ -1075,6 +1103,14 @@ public:
_dcel().halfedges_end(), _dcel().halfedges_end(),
_Is_valid_halfedge(&m_topol_traits))); _Is_valid_halfedge(&m_topol_traits)));
} }
/*!
returns a const range over handles of the arrangement halfedges .
*/
Iterator_range<Prevent_deref<Halfedge_iterator> >
halfedge_handles() const
{
return make_prevent_deref_range(halfedges_begin(), halfedges_end());
}
//@} //@}
/// \name Traversal functions for the arrangement edges. /// \name Traversal functions for the arrangement edges.
@ -1094,6 +1130,15 @@ public:
_Is_valid_halfedge(&m_topol_traits))); _Is_valid_halfedge(&m_topol_traits)));
} }
/*!
returns a range over handles of the arrangement edges .
*/
Iterator_range<Prevent_deref<Edge_iterator> >
edge_handles()
{
return make_prevent_deref_range(edges_begin(), edges_end());
}
/*! Get a const iterator for the first edge in the arrangement. */ /*! Get a const iterator for the first edge in the arrangement. */
Edge_const_iterator edges_begin() const Edge_const_iterator edges_begin() const
{ {
@ -1107,6 +1152,15 @@ public:
return (Edge_const_iterator(_dcel().edges_end(), _dcel().edges_end(), return (Edge_const_iterator(_dcel().edges_end(), _dcel().edges_end(),
_Is_valid_halfedge(&m_topol_traits))); _Is_valid_halfedge(&m_topol_traits)));
} }
/*!
returns a const range over handles of the arrangement edges .
*/
Iterator_range<Prevent_deref<Edge_iterator> >
edge_handles() const
{
return make_prevent_deref_range(edges_begin(), edges_end());
}
//@} //@}
/// \name Traversal functions for the arrangement faces. /// \name Traversal functions for the arrangement faces.
@ -1126,6 +1180,14 @@ public:
_Is_valid_face(&m_topol_traits))); _Is_valid_face(&m_topol_traits)));
} }
/*!
returns a range over handles of the arrangement faces .
*/
Iterator_range<Prevent_deref<Face_iterator> >
face_handles()
{
return make_prevent_deref_range(faces_begin(), faces_end());
}
/*! Get a const iterator for the first face in the arrangement. */ /*! Get a const iterator for the first face in the arrangement. */
Face_const_iterator faces_begin() const Face_const_iterator faces_begin() const
{ {
@ -1140,6 +1202,14 @@ public:
_Is_valid_face(&m_topol_traits))); _Is_valid_face(&m_topol_traits)));
} }
/*!
returns a const range over handles of the arrangement faces .
*/
Iterator_range<Prevent_deref<Face_iterator> >
face_handles() const
{
return make_prevent_deref_range(faces_begin(), f_end());
}
//! reference_face (const version). //! reference_face (const version).
/*! The function returns a reference face of the arrangement. /*! The function returns a reference face of the arrangement.
* All reference faces of arrangements of the same type have a common * All reference faces of arrangements of the same type have a common

View File

@ -85,9 +85,8 @@ bool test_one_file(std::ifstream& in_file, bool /* verbose */)
std::cout.flush(); std::cout.flush();
CGAL::insert_non_intersecting_curves(arr, xcurves.begin(), xcurves.end()); CGAL::insert_non_intersecting_curves(arr, xcurves.begin(), xcurves.end());
std::cout << "inserted" << std::endl; std::cout << "inserted" << std::endl;
for (Halfedge_iterator hit = arr.halfedges_begin(); hit != arr.halfedges_end(); hit++) { BOOST_FOREACH(Halfedge_handle hh, arr.halfedge_handles())
halfedges.push_back(hit); halfedges.push_back(hh);
}
#endif #endif
curves.clear(); curves.clear();
@ -102,7 +101,6 @@ bool test_one_file(std::ifstream& in_file, bool /* verbose */)
} }
isolated_points.clear(); isolated_points.clear();
points.clear(); points.clear();
std::cout << "The arrangement size:" << std::endl std::cout << "The arrangement size:" << std::endl
<< " V = " << arr.number_of_vertices() << " V = " << arr.number_of_vertices()
<< ", E = " << arr.number_of_edges() << ", E = " << arr.number_of_edges()
@ -110,16 +108,16 @@ bool test_one_file(std::ifstream& in_file, bool /* verbose */)
{ {
std::cout << "Faces:" << std::endl; std::cout << "Faces:" << std::endl;
Arrangement_2::Face_const_iterator fit; BOOST_FOREACH(Arrangement_2::Face_handle fh, arr.face_handles())
for (fit = arr.faces_begin(); fit != arr.faces_end(); ++fit) { {
std::cout << " Face: " std::cout << " Face: "
<< &(*fit) << &(fh)
<< std::endl; << std::endl;
std::cout << " Outer CCBs: " std::cout << " Outer CCBs: "
<< std::distance(fit->outer_ccbs_begin(), fit->outer_ccbs_end()) << std::distance(fh->outer_ccbs_begin(), fh->outer_ccbs_end())
<< std::endl; << std::endl;
std::cout << " Inner CCBs: " std::cout << " Inner CCBs: "
<< std::distance(fit->inner_ccbs_begin(), fit->inner_ccbs_end()) << std::distance(fh->inner_ccbs_begin(), fh->inner_ccbs_end())
<< std::endl; << std::endl;
std::cout << std::endl; std::cout << std::endl;
} }