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 d8c72e59126..a88abd0a667 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 @@ -413,6 +413,45 @@ void stitch_borders_impl(PM& pmesh, run_stitch_borders(pmesh, to_stitch, uf_vertices, uf_handles); } +template +void stitch_boundary_cycle_2(PM& pmesh) +{ + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + + std::vector cycles; + BOOST_FOREACH(halfedge_descriptor hd, halfedges(pmesh)) + { + if ( is_border(hd, pmesh) ) + { + if ( hd < next(hd, pmesh) && next(next(hd, pmesh), pmesh) == hd ) + { + cycles.push_back(hd); + } + } + } + + BOOST_FOREACH(halfedge_descriptor hd, cycles) + { + halfedge_descriptor nhd = next(hd, pmesh); + + //nhd and its opposite will be removed + //update face pointer + set_face(hd, face(opposite(nhd, pmesh), pmesh), pmesh); + set_halfedge(face(hd, pmesh), hd, pmesh); + //update next/prev pointers + halfedge_descriptor tmp = prev(opposite(nhd, pmesh), pmesh); + set_next(tmp, hd, pmesh); + tmp = next(opposite(nhd, pmesh), pmesh); + set_next(hd, tmp, pmesh); + //update vertex pointers + set_halfedge(source(hd, pmesh), opposite(hd, pmesh), pmesh); + set_halfedge(target(hd, pmesh), hd, pmesh); + + // remove the extra halfedges + remove_edge(edge(nhd, pmesh), pmesh); + } +} + } //end of namespace internal @@ -484,6 +523,7 @@ void stitch_borders(PolygonMesh& pmesh, const CGAL_PMP_NP_CLASS& np) internal::Less_for_halfedge(pmesh, vpm), vpm); stitch_borders(pmesh, hedge_pairs_to_stitch); + internal::stitch_boundary_cycle_2(pmesh); }