From a691eeff9741f814b2dcaa381ad7465eaee5a17d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Thu, 23 Jun 2022 17:11:20 +0200 Subject: [PATCH 1/6] Rewrite merge_duplicate_points_in_polygon_soup() without container.insert(...) --- .../repair_polygon_soup.h | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h index fdc57bf0c05..c609dc2415a 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h @@ -604,22 +604,31 @@ Polygon construct_canonical_polygon_with_markers(const Polygon& polygon, const bool reversed) { const std::size_t polygon_size = polygon.size(); + Polygon canonical_polygon; + CGAL::internal::resize(canonical_polygon, polygon_size); if(reversed) { - std::size_t rfirst = polygon_size - 1 - first; - canonical_polygon.insert(canonical_polygon.end(), polygon.rbegin() + rfirst, polygon.rend()); - canonical_polygon.insert(canonical_polygon.end(), polygon.rbegin(), polygon.rbegin() + rfirst); + std::size_t rfirst = first + 1; + std::size_t pos = 0; + for(std::size_t i=rfirst; i --> 0 ;) // first to 0 + canonical_polygon[pos++] = polygon[i]; + for(std::size_t i=polygon_size; i --> rfirst ;) // polygon_size-1 to first+1 + canonical_polygon[pos++] = polygon[i]; } else { - canonical_polygon.insert(canonical_polygon.end(), polygon.begin() + first, polygon.end()); - canonical_polygon.insert(canonical_polygon.end(), polygon.begin(), polygon.begin() + first); + std::size_t pos = 0; + for(std::size_t i=first; i Date: Thu, 23 Jun 2022 17:12:34 +0200 Subject: [PATCH 2/6] Add an overload of repair_polygon_soup for array-based soups which does not call functions that are meaningless for ranges of fixed size faces --- .../repair_polygon_soup.h | 79 +++++++++++++++---- 1 file changed, 63 insertions(+), 16 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h index c609dc2415a..8fb8cca46af 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -990,6 +991,66 @@ std::size_t merge_duplicate_polygons_in_polygon_soup(const PointRange& points, return removed_polygons_n; } +template ::Polygon_3> +struct Polygon_soup_fixer +{ + template + void operator()(PointRange& points, + PolygonRange& polygons, + const NamedParameters& np) const + { + using parameters::get_parameter; + using parameters::choose_parameter; + + typedef typename internal::GetPolygonGeomTraits::type Traits; + Traits traits = choose_parameter(get_parameter(np, internal_np::geom_traits)); + + #ifdef CGAL_PMP_REPAIR_POLYGON_SOUP_VERBOSE + std::cout << "Repairing soup with " << points.size() << " points and " << polygons.size() << " polygons" << std::endl; + #endif + + merge_duplicate_points_in_polygon_soup(points, polygons, np); + internal::simplify_polygons_in_polygon_soup(points, polygons, traits); + internal::split_pinched_polygons_in_polygon_soup(points, polygons, traits); + internal::remove_invalid_polygons_in_polygon_soup(points, polygons); + merge_duplicate_polygons_in_polygon_soup(points, polygons, np); + remove_isolated_points_in_polygon_soup(points, polygons); + } +}; + +// Specialization if the polygon soup is an array +// Disable repair functions that are meaningless for arrays +template +struct Polygon_soup_fixer > +{ + template + void operator()(PointRange& points, + PolygonRange& polygons, + const NamedParameters& np) const + { + using parameters::get_parameter; + using parameters::choose_parameter; + + typedef typename internal::GetPolygonGeomTraits::type Traits; + Traits traits = choose_parameter(get_parameter(np, internal_np::geom_traits)); + + #ifdef CGAL_PMP_REPAIR_POLYGON_SOUP_VERBOSE + std::cout << "Repairing soup with " << points.size() << " points and " << polygons.size() << " polygons" << std::endl; + #endif + + merge_duplicate_points_in_polygon_soup(points, polygons, np); + +// internal::simplify_polygons_in_polygon_soup(points, polygons, traits); +// internal::split_pinched_polygons_in_polygon_soup(points, polygons, traits); + + internal::remove_invalid_polygons_in_polygon_soup(points, polygons); + merge_duplicate_polygons_in_polygon_soup(points, polygons, np); + remove_isolated_points_in_polygon_soup(points, polygons); + } +}; + + /// \ingroup PMP_repairing_grp /// /// \brief cleans a given polygon soup through various repairing operations. @@ -1053,22 +1114,8 @@ void repair_polygon_soup(PointRange& points, PolygonRange& polygons, const NamedParameters& np = parameters::default_values()) { - using parameters::get_parameter; - using parameters::choose_parameter; - - typedef typename internal::GetPolygonGeomTraits::type Traits; - Traits traits = choose_parameter(get_parameter(np, internal_np::geom_traits)); - -#ifdef CGAL_PMP_REPAIR_POLYGON_SOUP_VERBOSE - std::cout << "Repairing soup with " << points.size() << " points and " << polygons.size() << " polygons" << std::endl; -#endif - - merge_duplicate_points_in_polygon_soup(points, polygons, np); - internal::simplify_polygons_in_polygon_soup(points, polygons, traits); - internal::split_pinched_polygons_in_polygon_soup(points, polygons, traits); - internal::remove_invalid_polygons_in_polygon_soup(points, polygons); - merge_duplicate_polygons_in_polygon_soup(points, polygons, np); - remove_isolated_points_in_polygon_soup(points, polygons); + Polygon_soup_fixer fixer; + fixer(points, polygons, np); } } // end namespace Polygon_mesh_processing From d934a0465fe00eb5c9584421aa2b88c24beb6285 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Thu, 23 Jun 2022 17:13:29 +0200 Subject: [PATCH 3/6] Test range of array faces in repair_polygon_soup() --- .../test_repair_polygon_soup.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_repair_polygon_soup.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_repair_polygon_soup.cpp index 68ca3351965..4b9b0abbd3e 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_repair_polygon_soup.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_repair_polygon_soup.cpp @@ -564,6 +564,21 @@ void test_slit_pinched_polygons(const bool /*verbose*/ = false) int main() { + // test compilation with different polygon soup types + std::vector vpoints; + std::vector > vpolygons; + PMP::repair_polygon_soup(vpoints, vpolygons); + + std::vector > dpolygons; + PMP::repair_polygon_soup(vpoints, dpolygons); + + std::deque > dvpolygons; + PMP::repair_polygon_soup(vpoints, dvpolygons); + + std::deque > apolygons; + PMP::repair_polygon_soup(vpoints, apolygons); + + // test functions test_polygon_canonicalization(true); test_merge_duplicate_points(false); test_merge_duplicate_polygons(false); From 3be846927781361ace4e4981db6362a137ae7701 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Thu, 23 Jun 2022 17:23:09 +0200 Subject: [PATCH 4/6] Move build into 'internal' namespace --- .../repair_polygon_soup.h | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h index 8fb8cca46af..a90a70f60d5 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h @@ -991,8 +991,10 @@ std::size_t merge_duplicate_polygons_in_polygon_soup(const PointRange& points, return removed_polygons_n; } +namespace internal { + template ::Polygon_3> + typename Polygon = typename Polygon_types::Polygon_3> struct Polygon_soup_fixer { template @@ -1003,7 +1005,7 @@ struct Polygon_soup_fixer using parameters::get_parameter; using parameters::choose_parameter; - typedef typename internal::GetPolygonGeomTraits::type Traits; + typedef typename GetPolygonGeomTraits::type Traits; Traits traits = choose_parameter(get_parameter(np, internal_np::geom_traits)); #ifdef CGAL_PMP_REPAIR_POLYGON_SOUP_VERBOSE @@ -1011,9 +1013,9 @@ struct Polygon_soup_fixer #endif merge_duplicate_points_in_polygon_soup(points, polygons, np); - internal::simplify_polygons_in_polygon_soup(points, polygons, traits); - internal::split_pinched_polygons_in_polygon_soup(points, polygons, traits); - internal::remove_invalid_polygons_in_polygon_soup(points, polygons); + simplify_polygons_in_polygon_soup(points, polygons, traits); + split_pinched_polygons_in_polygon_soup(points, polygons, traits); + remove_invalid_polygons_in_polygon_soup(points, polygons); merge_duplicate_polygons_in_polygon_soup(points, polygons, np); remove_isolated_points_in_polygon_soup(points, polygons); } @@ -1032,24 +1034,23 @@ struct Polygon_soup_fixer > using parameters::get_parameter; using parameters::choose_parameter; - typedef typename internal::GetPolygonGeomTraits::type Traits; + typedef typename GetPolygonGeomTraits::type Traits; Traits traits = choose_parameter(get_parameter(np, internal_np::geom_traits)); #ifdef CGAL_PMP_REPAIR_POLYGON_SOUP_VERBOSE - std::cout << "Repairing soup with " << points.size() << " points and " << polygons.size() << " polygons" << std::endl; + std::cout << "Repairing soup with " << points.size() << " points and " << polygons.size() << " arrays" << std::endl; #endif merge_duplicate_points_in_polygon_soup(points, polygons, np); - -// internal::simplify_polygons_in_polygon_soup(points, polygons, traits); -// internal::split_pinched_polygons_in_polygon_soup(points, polygons, traits); - - internal::remove_invalid_polygons_in_polygon_soup(points, polygons); +// simplify_polygons_in_polygon_soup(points, polygons, traits); +// split_pinched_polygons_in_polygon_soup(points, polygons, traits); + remove_invalid_polygons_in_polygon_soup(points, polygons); merge_duplicate_polygons_in_polygon_soup(points, polygons, np); remove_isolated_points_in_polygon_soup(points, polygons); } }; +} // namespace internal /// \ingroup PMP_repairing_grp /// @@ -1114,7 +1115,7 @@ void repair_polygon_soup(PointRange& points, PolygonRange& polygons, const NamedParameters& np = parameters::default_values()) { - Polygon_soup_fixer fixer; + internal::Polygon_soup_fixer fixer; fixer(points, polygons, np); } From ceb8ca70ef0b045f50827cab91dd91229ce00eea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 5 Jul 2022 14:03:38 +0200 Subject: [PATCH 5/6] fix warning --- .../include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h index a90a70f60d5..4c4019bd68c 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h @@ -1035,7 +1035,7 @@ struct Polygon_soup_fixer > using parameters::choose_parameter; typedef typename GetPolygonGeomTraits::type Traits; - Traits traits = choose_parameter(get_parameter(np, internal_np::geom_traits)); +// Traits traits = choose_parameter(get_parameter(np, internal_np::geom_traits)); #ifdef CGAL_PMP_REPAIR_POLYGON_SOUP_VERBOSE std::cout << "Repairing soup with " << points.size() << " points and " << polygons.size() << " arrays" << std::endl; From b25217ed5334edd7643c349454b8ca50e78fa93b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 7 Jul 2022 13:42:37 +0200 Subject: [PATCH 6/6] remove unused typedef --- .../CGAL/Polygon_mesh_processing/repair_polygon_soup.h | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h index 4c4019bd68c..219a4925c24 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_polygon_soup.h @@ -1031,17 +1031,12 @@ struct Polygon_soup_fixer > PolygonRange& polygons, const NamedParameters& np) const { - using parameters::get_parameter; - using parameters::choose_parameter; - - typedef typename GetPolygonGeomTraits::type Traits; -// Traits traits = choose_parameter(get_parameter(np, internal_np::geom_traits)); - #ifdef CGAL_PMP_REPAIR_POLYGON_SOUP_VERBOSE std::cout << "Repairing soup with " << points.size() << " points and " << polygons.size() << " arrays" << std::endl; #endif merge_duplicate_points_in_polygon_soup(points, polygons, np); +// skipped steps: // simplify_polygons_in_polygon_soup(points, polygons, traits); // split_pinched_polygons_in_polygon_soup(points, polygons, traits); remove_invalid_polygons_in_polygon_soup(points, polygons);