diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h index bc1e7cd1728..1d77f283dc0 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -1280,19 +1281,23 @@ private: const double& sq_low) { CGAL_assertion_code(std::size_t nb_done = 0); - std::vector degenerate_faces; + boost::unordered_set degenerate_faces; BOOST_FOREACH(halfedge_descriptor h, halfedges_around_target(halfedge(v, mesh_), mesh_)) { if (is_border(h, mesh_)) continue; if (PMP::is_degenerated(h, mesh_, vpmap_, GeomTraits())) - degenerate_faces.push_back(h); + degenerate_faces.insert(h); } while(!degenerate_faces.empty()) { - halfedge_descriptor h = degenerate_faces.back(); - degenerate_faces.pop_back(); + halfedge_descriptor h = *(degenerate_faces.begin()); + degenerate_faces.erase(degenerate_faces.begin()); + + //check that opposite is not also degenerate + if (degenerate_faces.find(opposite(h, mesh_)) != degenerate_faces.end()) + degenerate_faces.erase(opposite(h, mesh_)); CGAL_assertion(PMP::is_degenerated(h, mesh_, vpmap_, GeomTraits())); if (face(h, mesh_) == boost::graph_traits::null_face()) @@ -1338,13 +1343,22 @@ private: short_edges.insert(typename Bimap::value_type(hf, sqlen)); } + std::size_t nb_degen = degenerate_faces.size(); if (!is_border(hf, mesh_) && PMP::is_degenerated(hf, mesh_, vpmap_, GeomTraits())) - degenerate_faces.push_back(hf); + degenerate_faces.insert(hf); if (!is_border(hfo, mesh_) && PMP::is_degenerated(hfo, mesh_, vpmap_, GeomTraits())) - degenerate_faces.push_back(hfo); + degenerate_faces.insert(hfo); + if (degenerate_faces.size() == nb_degen + 2) + { + //process has failed to remove degeneracies + degenerate_faces.erase(hf); + degenerate_faces.erase(hfo); + std::cerr << "Warning : possible degeneracies remaining " + << "after the edge collapse step" << std::endl; + } break; } }