From f882c5d3a63dfc7060d1abf52b9daeba946eebf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 26 Jun 2019 15:09:19 +0200 Subject: [PATCH 1/2] Sanitize result of square root --- .../CGAL/Segment_Delaunay_graph_2/Basic_predicates_C2.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Segment_Delaunay_graph_2/include/CGAL/Segment_Delaunay_graph_2/Basic_predicates_C2.h b/Segment_Delaunay_graph_2/include/CGAL/Segment_Delaunay_graph_2/Basic_predicates_C2.h index c6d3f292454..136d4722cae 100644 --- a/Segment_Delaunay_graph_2/include/CGAL/Segment_Delaunay_graph_2/Basic_predicates_C2.h +++ b/Segment_Delaunay_graph_2/include/CGAL/Segment_Delaunay_graph_2/Basic_predicates_C2.h @@ -146,8 +146,11 @@ public: static FT to_ft(const Sqrt_3& x) { - FT sqrt_e = compute_sqrt( to_ft(x.e()), FT_Has_sqrt() ); - FT sqrt_f = compute_sqrt( to_ft(x.f()), FT_Has_sqrt() ); + // If the number type does not offer a square root, x.e() and x.f() (which are of type sqrt_1) + // might be negative after (approximately) evaluating them. Taking the max sanitize these values + // to ensure that we do not take the square root of a negative number. + FT sqrt_e = compute_sqrt( (std::max)(FT(0), to_ft(x.e())), FT_Has_sqrt() ); + FT sqrt_f = compute_sqrt( (std::max)(FT(0), to_ft(x.f())), FT_Has_sqrt() ); FT sqrt_ef = sqrt_e * sqrt_f; return to_ft(x.a()) + to_ft(x.b()) * sqrt_e + to_ft(x.c()) * sqrt_f + to_ft(x.d()) * sqrt_ef; From df9a63b2b40f09b60ccb614bd3c9798d13597ca1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 27 Jun 2019 08:44:46 +0200 Subject: [PATCH 2/2] update marks on removed edges --- .../internal/Corefinement/Face_graph_output_builder.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/Face_graph_output_builder.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/Face_graph_output_builder.h index 2e4a3b33bc4..b079f204e1b 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/Face_graph_output_builder.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/Face_graph_output_builder.h @@ -560,9 +560,15 @@ public: ++epp_it; } BOOST_FOREACH(edge_descriptor ed, inter_edges_to_remove1) + { + put(marks_on_input_edges.ecm1, ed, false); intersection_edges1.erase(ed); + } BOOST_FOREACH(edge_descriptor ed, inter_edges_to_remove2) + { + put(marks_on_input_edges.ecm2, ed, false); intersection_edges2.erase(ed); + } // (1) Assign a patch id to each facet indicating in which connected // component limited by intersection edges of the surface they are.