From d3c874bd83dcf9543898bcc2a57701e3579ed443 Mon Sep 17 00:00:00 2001 From: Maxime Gimeno Date: Mon, 26 Mar 2018 11:45:45 +0200 Subject: [PATCH] Add some info about what a valid graph is. --- BGL/include/CGAL/boost/graph/helpers.h | 72 +++++++++++++++----------- 1 file changed, 43 insertions(+), 29 deletions(-) diff --git a/BGL/include/CGAL/boost/graph/helpers.h b/BGL/include/CGAL/boost/graph/helpers.h index 84711f40297..5e2c03e95e9 100644 --- a/BGL/include/CGAL/boost/graph/helpers.h +++ b/BGL/include/CGAL/boost/graph/helpers.h @@ -359,20 +359,25 @@ bool is_valid_face_descriptor( typename boost::graph_traits::face_des /*! \ingroup PkgBGLHelperFct * \brief checks the integrity of `g`. - * \param g the HalfedgeGraph to test. + * + * `g` is valid if it follows the rules of the `HalfedgeListGraph` concept, + * and all of its associations are reciprocal. + * For example, `prev(next(h, g), g)` must be `h`, + * and `next(prev(h, g), g)` must be `h`. + * \param g the `Graph` to test. * \param verb : if `true`, the details of the check will be written in the standard output. * - * \tparam HalfedgeGraph a model of `HalfedgeListGraph` + * \tparam `Graph` a model of `HalfedgeListGraph` * \return `true` if `g` is valid, `false` otherwise. * */ -template -bool is_valid_halfedge_graph(const HalfedgeGraph& g, bool verb = false) +template +bool is_valid_halfedge_graph(const Graph& g, bool verb = false) { - typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; - typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; - typedef typename boost::graph_traits::vertices_size_type vertex_size_type; - typedef typename boost::graph_traits::halfedges_size_type halfedges_size_type; + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::vertices_size_type vertex_size_type; + typedef typename boost::graph_traits::halfedges_size_type halfedges_size_type; Verbose_ostream verr(verb); std::size_t num_v(std::distance(boost::begin(vertices(g)), boost::end(vertices(g)))), num_h(std::distance(boost::begin(halfedges(g)), boost::end(halfedges(g)))); @@ -388,8 +393,8 @@ bool is_valid_halfedge_graph(const HalfedgeGraph& g, bool verb = false) break; verr << "halfedge " << n << std::endl; // Pointer integrity. - valid = valid && ( next(begin, g) != boost::graph_traits::null_halfedge()); - valid = valid && ( opposite(begin, g) != boost::graph_traits::null_halfedge()); + valid = valid && ( next(begin, g) != boost::graph_traits::null_halfedge()); + valid = valid && ( opposite(begin, g) != boost::graph_traits::null_halfedge()); if ( ! valid) { verr << " pointer integrity corrupted (ptr==0)." << std::endl; @@ -414,7 +419,7 @@ bool is_valid_halfedge_graph(const HalfedgeGraph& g, bool verb = false) break; } // vertex integrity. - valid = valid && ( target(begin, g) != boost::graph_traits::null_vertex()); + valid = valid && ( target(begin, g) != boost::graph_traits::null_vertex()); if ( ! valid) { verr << " vertex pointer integrity corrupted." << std::endl; @@ -440,7 +445,7 @@ bool is_valid_halfedge_graph(const HalfedgeGraph& g, bool verb = false) break; verr << "vertex " << v << std::endl; // Pointer integrity. - if ( halfedge(vbegin, g) != boost::graph_traits::null_halfedge()) + if ( halfedge(vbegin, g) != boost::graph_traits::null_halfedge()) valid = valid && ( target( halfedge(vbegin, g), g) == vbegin); else @@ -452,7 +457,7 @@ bool is_valid_halfedge_graph(const HalfedgeGraph& g, bool verb = false) } // cycle-around-vertex test. halfedge_descriptor h = halfedge(vbegin, g); - if ( h != boost::graph_traits::null_halfedge()) { + if ( h != boost::graph_traits::null_halfedge()) { halfedge_descriptor ge = h; do { verr << " halfedge " << n << std::endl; @@ -500,21 +505,25 @@ return valid; \ingroup PkgBGLHelperFct * \brief checks the integrity of `g`. * + * `g` is valid if it is a valid `HalfedgeListGraph`, if it follows the rules + * of the `FaceListGraph` concept, and all of its associations are reciprocal. + * For example, `face(halfedge(f,g),g)` must be `f`. * calls `is_valid_halfedge_graph()` - * \param g the FaceGraph to test. + * \param g the `Graph` to test. * \param verb : if `true`, the details of the check will be written in the standard output. * - * \tparam FaceGraph a model of `FaceListGraph` + * \tparam `Graph` a model of `FaceListGraph` * \return `true` if `g` is valid, `false` otherwise. * + * \see `is_valid_halfedge_graph()` */ -template -bool is_valid_face_graph(const FaceGraph& g, bool verb = false) +template +bool is_valid_face_graph(const Graph& g, bool verb = false) { - typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; - typedef typename boost::graph_traits::face_descriptor face_descriptor; - typedef typename boost::graph_traits::faces_size_type faces_size_type; - typedef typename boost::graph_traits::halfedges_size_type halfedges_size_type; + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef typename boost::graph_traits::face_descriptor face_descriptor; + typedef typename boost::graph_traits::faces_size_type faces_size_type; + typedef typename boost::graph_traits::halfedges_size_type halfedges_size_type; std::size_t num_f(std::distance(boost::begin(faces(g)), boost::end(faces(g)))), num_h(std::distance(boost::begin(halfedges(g)), boost::end(halfedges(g)))); @@ -534,7 +543,7 @@ bool is_valid_face_graph(const FaceGraph& g, bool verb = false) break; verr << "face " << f << std::endl; // Pointer integrity. - if ( halfedge(fbegin, g) != boost::graph_traits::null_halfedge()) + if ( halfedge(fbegin, g) != boost::graph_traits::null_halfedge()) valid = valid && ( face(halfedge(fbegin, g), g) == fbegin); else @@ -545,7 +554,7 @@ bool is_valid_face_graph(const FaceGraph& g, bool verb = false) } // cycle-around-face test. halfedge_descriptor h = halfedge( fbegin, g); - if (h != boost::graph_traits::null_halfedge()) { + if (h != boost::graph_traits::null_halfedge()) { halfedge_descriptor ge = h; do { verr << " halfedge " << n << std::endl; @@ -588,19 +597,24 @@ bool is_valid_face_graph(const FaceGraph& g, bool verb = false) \ingroup PkgBGLHelperFct * \brief checks the integrity of `g`. * - * calls `is_valid_face_graph()` - * \param g the `PolygonMesh` to test. + * `g` is valid if it is a valid `FaceListGraph` and it has distinct faces on each side of an edge. + * calls `is_valid_face_graph()`. + * + * \param g the `Mesh` to test. * \param verb : if `true`, the details of the check will be written in the standard output. * - * \tparam PolygonMesh a model of `FaceListGraph` and `HalfedgeListGraph`, and follows + * \tparam Mesh a model of `FaceListGraph` and `HalfedgeListGraph`, and follows * the definition of a \ref PMPDef "PolygonMesh" * \return `true` if `g` is valid, `false` otherwise. * + * \see `is_valid_face_graph()` + * \see `is_valid_halfedge_graph()` + * */ -template -bool is_valid_polygon_mesh(const PolygonMesh& g, bool verb = false) +template +bool is_valid_polygon_mesh(const Mesh& g, bool verb = false) { - typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; Verbose_ostream verr(verb); bool valid=is_valid_face_graph(g, verb); //test for 2-manifoldness