diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/connected_components_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/connected_components_example.cpp index cd95d9e4b2f..1a7a03bb8c4 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/connected_components_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/connected_components_example.cpp @@ -78,7 +78,7 @@ int main(int argc, char* argv[]) std::size_t num = CGAL::Polygon_mesh_processing::connected_components(mesh, fccmap, CGAL::Polygon_mesh_processing::parameters::edge_is_constrained_map(Constraint(mesh, bound))); - + std::cerr << "- The graph has " << num << " connected components (face connectivity)" << std::endl; typedef std::map Components_size; Components_size nb_per_cc; @@ -92,8 +92,8 @@ int main(int argc, char* argv[]) std::cerr << "- We keep the two largest components" << std::endl; CGAL::Polygon_mesh_processing::keep_largest_connected_components(mesh, - 2, - Constraint(mesh, bound)); + 2, + CGAL::Polygon_mesh_processing::parameters::edge_is_constrained_map(Constraint(mesh, bound))); return 0; } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/connected_components.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/connected_components.h index 94f391ce7b8..7c31e7c9006 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/connected_components.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/connected_components.h @@ -522,8 +522,8 @@ connected_components(const PolygonMesh& pmesh, fcm, boost::vertex_index_map( choose_const_pmap(get_param(np, boost::face_index), - pmesh, - boost::face_index) + pmesh, + boost::face_index) ) ); } @@ -565,32 +565,15 @@ connected_components(const PolygonMesh& pmesh, * \return the number of connected components erased (ignoring isolated vertices). */ template ::type -#endif - , typename FaceIndexMap -#ifdef DOXYGEN_RUNNING - = typename boost::property_map::type -#endif -> + , typename NamedParameters> std::size_t keep_largest_connected_components(PolygonMesh& pmesh - , std::size_t nb_components_to_keep - , EdgeConstraintMap ecmap -#ifdef DOXYGEN_RUNNING - = CGAL::Default() -#endif - , VertexIndexMap vim -#ifdef DOXYGEN_RUNNING - = get(CGAL::vertex_index_t, pmesh) -#endif - ,FaceIndexMap fim -#ifdef DOXYGEN_RUNNING - = get(CGAL::face_index_t, pmesh) -#endif -) + , std::size_t nb_components_to_keep + , const NamedParameters& np) { + using boost::choose_param; + using boost::get_param; + using boost::choose_const_pmap; + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits::vertex_iterator vertex_iterator; typedef typename boost::graph_traits::face_descriptor face_descriptor; @@ -598,8 +581,39 @@ std::size_t keep_largest_connected_components(PolygonMesh& pmesh typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits::edge_descriptor edge_descriptor; typedef typename boost::graph_traits::edge_iterator edge_iterator; + + //EdgeConstraintMap + typedef typename boost::lookup_named_param_def < + CGAL::edge_is_constrained_t, + NamedParameters, + internal::No_constraint//default + > ::type EdgeConstraintMap; + EdgeConstraintMap ecmap = choose_param(get_param(np, edge_is_constrained), + EdgeConstraintMap()); + + //FaceIndexMap + typedef typename boost::lookup_named_param_def < + boost::face_index_t, + NamedParameters, + boost::property_map < PolygonMesh, boost::face_index_t>::type //default + > ::type FaceIndexMap; + FaceIndexMap fim = choose_const_pmap(get_param(np, boost::face_index), + pmesh, + boost::face_index); + + //vector_property_map boost::vector_property_map face_cc(fim); - + + //VertexIndexMap + typedef typename boost::lookup_named_param_def < + boost::vertex_index_t, + NamedParameters, + boost::property_map < PolygonMesh, boost::vertex_index_t>::type //default + > ::type VertexIndexMap; + VertexIndexMap vim = choose_const_pmap(get_param(np, boost::vertex_index), + pmesh, + boost::vertex_index); + std::size_t num = connected_components(pmesh, face_cc, CGAL::Polygon_mesh_processing::parameters::edge_is_constrained_map(ecmap). face_index_map(fim)); @@ -741,55 +755,16 @@ std::size_t keep_largest_connected_components(PolygonMesh& pmesh return num - nb_components_to_keep; } -template -std::size_t keep_largest_connected_components(PolygonMesh& pmesh - , std::size_t nb_components_to_keep - , CGAL::Default - , VertexIndexMap vim - , FaceIndexMap fim) -{ - return keep_largest_connected_components(pmesh, nb_components_to_keep, - internal::No_constraint(), - vim, - fim); -} - -template -std::size_t keep_largest_connected_components(PolygonMesh& pmesh, - std::size_t nb_components_to_keep, - EdgeConstraintMap ecmap, - VertexIndexMap vim) -{ - return keep_largest_connected_components(pmesh, nb_components_to_keep, ecmap, vim, - get(boost::face_index, pmesh)); -} - -template -std::size_t keep_largest_connected_components(PolygonMesh& pmesh, - std::size_t nb_components_to_keep, - EdgeConstraintMap ecmap) -{ - return keep_largest_connected_components(pmesh, nb_components_to_keep, ecmap, - get(boost::vertex_index, pmesh), - get(boost::face_index, pmesh)); -} - template std::size_t keep_largest_connected_components(PolygonMesh& pmesh, std::size_t nb_components_to_keep) { return keep_largest_connected_components(pmesh, - nb_components_to_keep, - internal::No_constraint(), - get(boost::vertex_index, pmesh), - get(boost::face_index, pmesh)); + nb_components_to_keep, + CGAL::Polygon_mesh_processing::parameters::all_default()); } - - } // namespace Polygon_mesh_processing } // namespace CGAL diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/named_function_params.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/named_function_params.h index 7fadcdc96d8..012a83208cc 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/named_function_params.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/named_function_params.h @@ -140,12 +140,21 @@ namespace CGAL{ //overload template pmp_bgl_named_params - face_index_map(const IndexMap& p) const + face_index_map(const IndexMap& p) const { typedef pmp_bgl_named_params Params; return Params(p, *this); } + //overload + template + pmp_bgl_named_params + vertex_index_map(const IndexMap& p) const + { + typedef pmp_bgl_named_params Params; + return Params(p, *this); + } + }; namespace Polygon_mesh_processing{ @@ -232,6 +241,7 @@ namespace parameters{ return Params(em); } + //overload template pmp_bgl_named_params edge_is_constrained_map_params(const EdgeIsConstrainedParams& em) @@ -241,6 +251,7 @@ namespace parameters{ return Params(em); } + //overload template pmp_bgl_named_params face_index_map(IndexMap const& p) @@ -249,7 +260,14 @@ namespace parameters{ return Params(p); } - + //overload + template + pmp_bgl_named_params + vertex_index_map(const IndexMap& p) + { + typedef pmp_bgl_named_params Params; + return Params(p); + } } //namespace parameters } //namespace Polygon_mesh_processing diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/connected_component_polyhedron.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/connected_component_polyhedron.cpp index 38c059ada8d..021b2a0424e 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/connected_component_polyhedron.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/connected_component_polyhedron.cpp @@ -95,11 +95,10 @@ void mesh_no_id(char* argv1) std::cout << &*f << " in connected component " << fccmap[f] << std::endl; } - PMP::keep_largest_connected_components(sm - , 2 - , CGAL::Default() - , vim - , fim); + PMP::keep_largest_connected_components(sm + , 2 + , PMP::parameters::vertex_index_map(vim). + face_index_map(fim)); std::cout << "mesh:\n" << sm << std::endl; }