diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/stitch_borders.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/stitch_borders.h index 9fdb5d884e8..e936df1bff9 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/stitch_borders.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/stitch_borders.h @@ -215,13 +215,13 @@ public: { typedef typename boost::property_traits::reference Point_ref; - CGAL_assertion(!cycle_halfedges.empty()); - #ifdef CGAL_PMP_STITCHING_DEBUG std::cout << "update_representatives(" << cycle_halfedges.size() << ", " << filtered_stitchable_halfedges.size() << ")" << std::endl; #endif + CGAL_assertion(!cycle_halfedges.empty()); + for(const halfedge_descriptor h : cycle_halfedges) put(m_candidate_halfedges, h, true); @@ -789,12 +789,12 @@ filter_stitchable_pairs(PolygonMesh& pmesh, } template + typename CycleRepMaintainer, typename VertexPointMap> std::size_t stitch_halfedge_range(const std::vector& to_stitch, const CandidateHalfedgeRange& representative_candidates, PolygonMesh& pmesh, const VertexPointMap& vpm, - MaintainerVisitor& mv) + CycleRepMaintainer& cycle_reps_maintainer) { typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; @@ -824,7 +824,7 @@ std::size_t stitch_halfedge_range(const std::vector& to_stitch, const std::vector& to_stitch_filtered = filter_stitchable_pairs(pmesh, to_stitch, to_stitch_local, uf_vertices, uf_handles); - mv.update_representatives(representative_candidates, to_stitch_filtered, vpm); + cycle_reps_maintainer.update_representatives(representative_candidates, to_stitch_filtered, vpm); // Actually stitching run_stitch_borders(pmesh, to_stitch_filtered, vpm, uf_vertices, uf_handles); @@ -837,11 +837,11 @@ std::size_t stitch_halfedge_range(const std::vector& to_stitch, PolygonMesh& pmesh, const VertexPointMap& vpm) { - Dummy_cycle_rep_maintainer mv(pmesh); - return stitch_halfedge_range(to_stitch, halfedges(pmesh), pmesh, vpm, mv); + Dummy_cycle_rep_maintainer cycle_reps_maintainer(pmesh); + return stitch_halfedge_range(to_stitch, halfedges(pmesh), pmesh, vpm, cycle_reps_maintainer); } -//overload to avoid a useless copy +// overload to avoid a useless copy template std::size_t stitch_halfedge_range_dispatcher(const std::vector& to_stitch, PolygonMesh& pmesh, @@ -850,7 +850,7 @@ std::size_t stitch_halfedge_range_dispatcher(const std::vector& to return stitch_halfedge_range(to_stitch, pmesh, vpm); } -//overload to doing the copy +// overload making a copy template std::size_t stitch_halfedge_range_dispatcher(const HalfedgePairRange& to_stitch_const, PolygonMesh& pmesh, @@ -861,7 +861,7 @@ std::size_t stitch_halfedge_range_dispatcher(const HalfedgePairRange& to_stitch_ return stitch_halfedge_range(to_stitch, pmesh, vpm); } -// collect_duplicated_stitchable_boundary_edges() cannot handle any configuration with non-manifoldness. +// collect_duplicated_stitchable_boundary_edges() cannot handle configurations with non-manifoldness. // However, even if non-manifoldness exists within a loop, it is safe choice to stitch consecutive // stitchable halfedges template ::halfed /// High-level functions -template -std::size_t stitch_boundary_cycle(const typename boost::graph_traits::halfedge_descriptor bh, +template +std::size_t stitch_boundary_cycle(const typename boost::graph_traits::halfedge_descriptor h, PolygonMesh& pmesh, - MaintainerVisitor& mv, + CycleRepMaintainer& cycle_reps_maintainer, const CGAL_PMP_NP_CLASS& np) { typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; typedef typename std::pair halfedges_pair; - CGAL_precondition(bh != boost::graph_traits::null_halfedge()); - CGAL_precondition(is_border(bh, pmesh)); + CGAL_precondition(h != boost::graph_traits::null_halfedge()); + CGAL_precondition(is_border(h, pmesh)); CGAL_precondition(is_valid(pmesh)); using parameters::choose_parameter; @@ -1124,8 +1124,8 @@ std::size_t stitch_boundary_cycle(const typename boost::graph_traits mv(pmesh); - return internal::stitch_boundary_cycle(h, pmesh, mv, np); + internal::Dummy_cycle_rep_maintainer dummy_maintainer(pmesh); + return internal::stitch_boundary_cycle(h, pmesh, dummy_maintainer, np); } template @@ -1138,17 +1138,17 @@ std::size_t stitch_boundary_cycle(const typename boost::graph_traits + typename CycleRepMaintainer, typename CGAL_PMP_NP_TEMPLATE_PARAMETERS> std::size_t stitch_boundary_cycles(const BorderHalfedgeRange& boundary_cycle_representatives, PolygonMesh& pmesh, - MaintainerVisitor& mv, + CycleRepMaintainer& cycle_reps_maintainer, const CGAL_PMP_NP_CLASS& np) { typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; std::size_t stitched_boundary_cycles_n = 0; for(const halfedge_descriptor h : boundary_cycle_representatives) - stitched_boundary_cycles_n += stitch_boundary_cycle(h, pmesh, mv, np); + stitched_boundary_cycles_n += stitch_boundary_cycle(h, pmesh, cycle_reps_maintainer, np); return stitched_boundary_cycles_n; } @@ -1194,8 +1194,8 @@ std::size_t stitch_boundary_cycles(const BorderHalfedgeRange& boundary_cycle_rep { // If this API is called, we are not from stitch_borders() (otherwise there would be a maintainer) // so there is only one pass and we don't carea bout maintaining the cycle subset - internal::Dummy_cycle_rep_maintainer mv(pmesh); - return stitch_boundary_cycles(boundary_cycle_representatives, pmesh, mv, np); + internal::Dummy_cycle_rep_maintainer dummy_maintainer(pmesh); + return stitch_boundary_cycles(boundary_cycle_representatives, pmesh, dummy_maintainer, np); } ///\cond SKIP_IN_MANUAL @@ -1290,11 +1290,11 @@ std::size_t stitch_borders(PolygonMesh& pmesh, namespace internal { template std::size_t stitch_borders(const BorderHalfedgeRange& boundary_cycle_representatives, PolygonMesh& pmesh, - MaintainerVisitor& mv, + CycleRepMaintainer& cycle_maintainer, const CGAL_PMP_NP_CLASS& np) { typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; @@ -1318,35 +1318,34 @@ std::size_t stitch_borders(const BorderHalfedgeRange& boundary_cycle_representat bool per_cc = choose_parameter(get_parameter(np, internal_np::apply_per_connected_component), false); #ifdef CGAL_PMP_STITCHING_DEBUG - std::cout << "------- Stitch cycles... (" << boundary_cycle_representatives.size() << " cycle(s))" << std::endl; + std::cout << "------- Stitch cycles (#1)... (" << boundary_cycle_representatives.size() << " cycle(s))" << std::endl; #endif - std::size_t res = stitch_boundary_cycles(boundary_cycle_representatives, pmesh, mv, np); + std::size_t res = stitch_boundary_cycles(boundary_cycle_representatives, pmesh, cycle_maintainer, np); #ifdef CGAL_PMP_STITCHING_DEBUG - std::cout << "------- Stitched " << res << " in boundary cycles" << std::endl; + std::cout << "------- Stitched " << res << " halfedge pairs in boundary cycles" << std::endl; std::cout << "------- Stitch all..." << std::endl; #endif - const auto& to_consider = mv.halfedges_to_consider(); - mv.clear_representatives(); + const auto& to_consider = cycle_maintainer.halfedges_to_consider(); + cycle_maintainer.clear_representatives(); std::vector > to_stitch; internal::collect_duplicated_stitchable_boundary_edges(to_consider, pmesh, hd_kpr, per_cc, std::back_inserter(to_stitch), np); - - res += stitch_halfedge_range(to_stitch, to_consider, pmesh, vpm, mv); - - const auto& new_representatives = mv.cycle_representatives(); + res += stitch_halfedge_range(to_stitch, to_consider, pmesh, vpm, cycle_maintainer); #ifdef CGAL_PMP_STITCHING_DEBUG - std::cout << "------- Stitched " << res << " after cycles & general" << std::endl; - std::cout << "------- Stitch cycles (#2)... (" << new_representatives.size() << " cycles)" << std::endl; + std::cout << "------- Stitched " << res << " halfedge pairs after cycles & general" << std::endl; + std::cout << "------- Stitch cycles (#2)... (" << new_representatives.size() << " cycle(s))" << std::endl; #endif + const auto& new_representatives = cycle_maintainer.cycle_representatives(); + // Don't care about keeping track of the sub-cycles as this is the last pass - internal::Dummy_cycle_rep_maintainer null_mv(pmesh); - res += stitch_boundary_cycles(new_representatives, pmesh, null_mv, np); + internal::Dummy_cycle_rep_maintainer dummy_cycle_maintainer(pmesh); + res += stitch_boundary_cycles(new_representatives, pmesh, dummy_cycle_maintainer, np); #ifdef CGAL_PMP_STITCHING_DEBUG std::cout << "------- Stitched " << res << " (total)" << std::endl; @@ -1416,8 +1415,8 @@ std::size_t stitch_borders(const BorderHalfedgeRange& boundary_cycle_representat ) { // Need to keep track of the cycles since we are working on a subset of all the boundary cycles - internal::Boundary_cycle_rep_maintainer mv(pmesh); - return stitch_borders(boundary_cycle_representatives, pmesh, mv, np); + internal::Boundary_cycle_rep_maintainer cycle_reps_maintainer(pmesh); + return stitch_borders(boundary_cycle_representatives, pmesh, cycle_reps_maintainer, np); } /// \cond SKIP_IN_MANUAL @@ -1430,8 +1429,8 @@ std::size_t stitch_borders(const BorderHalfedgeRange& boundary_cycle_representat >::type* = 0) { // Need to keep track of the cycles since we are working on a subset of all the boundary cycles - internal::Boundary_cycle_rep_maintainer mv(pmesh); - return stitch_borders(boundary_cycle_representatives, pmesh, mv, parameters::all_default()); + internal::Boundary_cycle_rep_maintainer cycle_reps_maintainer(pmesh); + return stitch_borders(boundary_cycle_representatives, pmesh, cycle_reps_maintainer, parameters::all_default()); } template @@ -1444,8 +1443,8 @@ std::size_t stitch_borders(PolygonMesh& pmesh, extract_boundary_cycles(pmesh, std::back_inserter(boundary_cycle_representatives)); // We are working on all boundary cycles, so there is no need to keep track of any subset - internal::Dummy_cycle_rep_maintainer mv(pmesh); - return stitch_borders(boundary_cycle_representatives, pmesh, mv, np); + internal::Dummy_cycle_rep_maintainer dummy_maintainer(pmesh); + return stitch_borders(boundary_cycle_representatives, pmesh, dummy_maintainer, np); } template diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_stitching.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_stitching.cpp index 7fd2d5d820e..049ad81c971 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_stitching.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_stitching.cpp @@ -209,7 +209,6 @@ void test_degenerate() CGAL::make_triangle(Point(0,0,0), Point(1,0,0), Point(0,1,0), tm); std::size_t res = CGAL::Polygon_mesh_processing::stitch_borders(tm); - std::cout << "Stitched: " << res << std::endl; assert(res == 0); }