From 38218aca4f19c3f253567a8ea3fb06e4d89aa278 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Tue, 22 Sep 2020 15:28:40 +0200 Subject: [PATCH 1/2] Fix deleting elements (degenerate faces) that might be further in the range --- .../CGAL/Polygon_mesh_processing/repair.h | 38 ++++++------------- 1 file changed, 12 insertions(+), 26 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair.h index bab4589b1b1..1dc090cf96d 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair.h @@ -1243,37 +1243,23 @@ bool remove_degenerate_faces(const FaceRange& face_range, // Ignore faces with null edges if(!all_removed) { - std::map are_degenerate_edges; - - for(face_descriptor fd : degenerate_face_set) + typename std::set::iterator it = degenerate_face_set.begin(); + while(it != degenerate_face_set.end()) { - for(halfedge_descriptor hd : halfedges_around_face(halfedge(fd, tmesh), tmesh)) + bool has_degenerate_edge = false; + for(halfedge_descriptor hd : halfedges_around_face(halfedge(*it, tmesh), tmesh)) { - edge_descriptor ed = edge(hd, tmesh); - std::pair::iterator, bool> is_insert_successful = - are_degenerate_edges.insert(std::make_pair(ed, false)); - - bool is_degenerate = false; - if(is_insert_successful.second) + const edge_descriptor ed = edge(hd, tmesh); + if(is_degenerate_edge(ed, tmesh, np)) { - // did not previously exist in the map, so actually have to check if it is degenerate - if(traits.equal_3_object()(get(vpmap, target(ed, tmesh)), get(vpmap, source(ed, tmesh)))) - is_degenerate = true; - } - - is_insert_successful.first->second = is_degenerate; - - if(is_degenerate) - { - halfedge_descriptor h = halfedge(ed, tmesh); - if(!is_border(h, tmesh)) - degenerate_face_set.erase(face(h, tmesh)); - - h = opposite(h, tmesh); - if(!is_border(h, tmesh)) - degenerate_face_set.erase(face(h, tmesh)); + has_degenerate_edge = true; + it = degenerate_face_set.erase(it); + break; } } + + if(!has_degenerate_edge) + ++it; } } From 0b3143ea5c6e4862b95c9d573fc7af154fb7c79d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Tue, 22 Sep 2020 15:30:57 +0200 Subject: [PATCH 2/2] Also test degenerate element removal with EPECK --- .../remove_degeneracies_test.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/remove_degeneracies_test.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/remove_degeneracies_test.cpp index ab5778ec5f8..7d5e93c3f13 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/remove_degeneracies_test.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/remove_degeneracies_test.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -16,9 +17,7 @@ namespace PMP = CGAL::Polygon_mesh_processing; typedef CGAL::Exact_predicates_inexact_constructions_kernel EPICK; - -typedef CGAL::Surface_mesh Surface_mesh; -typedef CGAL::Polyhedron_3 Polyhedron; +typedef CGAL::Exact_predicates_exact_constructions_kernel EPECK; template void detect_degeneracies(const EdgeRange& edge_range, @@ -38,7 +37,7 @@ void detect_degeneracies(const EdgeRange& edge_range, dedges.clear(); PMP::degenerate_edges(edge_range, mesh, std::inserter(dedges, dedges.begin()), CGAL::parameters::all_default()); - std::cout << "\t" << dedges.size() << " degenerate edges vs " << expected_dedges_n << std::endl; + std::cout << "\t" << dedges.size() << " degenerate edges, expected " << expected_dedges_n << std::endl; assert(dedges.size() == expected_dedges_n); // API tests @@ -49,7 +48,7 @@ void detect_degeneracies(const EdgeRange& edge_range, dfaces.clear(); PMP::degenerate_faces(face_range, mesh, std::back_inserter(dfaces), CGAL::parameters::all_default()); - std::cout << "\t" << dfaces.size() << " degenerate faces vs " << expected_dfaces_n << std::endl; + std::cout << "\t" << dfaces.size() << " degenerate faces, expected " << expected_dfaces_n << std::endl; assert(dfaces.size() == expected_dfaces_n); } @@ -238,10 +237,16 @@ void test() int main() { std::cout << "EPICK SM TESTS" << std::endl; - test(); + test >(); std::cout << "EPICK POLYHEDRON TESTS" << std::endl; - test(); + test>(); + + std::cout << "EPICK SM TESTS" << std::endl; + test >(); + + std::cout << "EPECK POLYHEDRON TESTS" << std::endl; + test >(); return EXIT_SUCCESS; }