From d6d8fbeb8bd1d4ec4de6a423fbd74e4028ee3218 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 27 Apr 2020 16:06:43 +0200 Subject: [PATCH] the placement must store the triangles has the AABB-tree does not copy them --- .../Edge_collapse/Bounded_distance_placement.h | 14 ++++++++------ .../test_edge_collapse_bounded_distance.cpp | 7 ++++--- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h index 8b35ffc6f47..59a33fa465c 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h @@ -59,21 +59,22 @@ private: const Triangle_mesh& tm = profile.surface_mesh(); const Geom_traits& gt = profile.geom_traits(); - std::vector input_triangles; + m_input_triangles.reserve(faces(tm).size()); for(face_descriptor f : faces(profile.surface_mesh())) { halfedge_descriptor h = halfedge(f, tm); CGAL_assertion(!is_border(h, tm)); - input_triangles.push_back(gt.construct_triangle_3_object()( - get(profile.vertex_point_map(), source(h, tm)), - get(profile.vertex_point_map(), target(h, tm)), - get(profile.vertex_point_map(), target(next(h, tm), tm)))); + m_input_triangles.emplace_back(gt.construct_triangle_3_object()( + get(profile.vertex_point_map(), source(h, tm)), + get(profile.vertex_point_map(), target(h, tm)), + get(profile.vertex_point_map(), target(next(h, tm), tm)))); } - m_tree_ptr = new AABB_tree(input_triangles.begin(), input_triangles.end()); + m_tree_ptr = new AABB_tree(m_input_triangles.begin(), m_input_triangles.end()); const_cast(m_tree_ptr)->build(); + const_cast(m_tree_ptr)->accelerate_distance_queries(); } public: @@ -129,6 +130,7 @@ public: private: const FT m_sq_threshold_dist; mutable const AABB_tree* m_tree_ptr; + mutable std::vector m_input_triangles; const BasePlacement m_base_placement; }; diff --git a/Surface_mesh_simplification/test/Surface_mesh_simplification/test_edge_collapse_bounded_distance.cpp b/Surface_mesh_simplification/test/Surface_mesh_simplification/test_edge_collapse_bounded_distance.cpp index 8aaa51a4651..0764b881fe1 100644 --- a/Surface_mesh_simplification/test/Surface_mesh_simplification/test_edge_collapse_bounded_distance.cpp +++ b/Surface_mesh_simplification/test/Surface_mesh_simplification/test_edge_collapse_bounded_distance.cpp @@ -62,15 +62,16 @@ int main(int argc, char** argv) Filtered_placement_with_tree placement_small(0.00005*diag, tree, placement_ref); SMS::edge_collapse(small_mesh, stop, CGAL::parameters::get_cost(Cost()).get_placement(placement_small)); - Filtered_placement placement_big(50*diag, placement_ref); // lazily builds the AABB tree + Filtered_placement placement_big(0.005*diag, placement_ref); // lazily builds the AABB tree SMS::edge_collapse(big_mesh, stop, CGAL::parameters::get_cost(Cost()).get_placement(placement_big)); std::cout << "no filtering: " << vertices(ref_mesh).size() << " vertices left" << std::endl; std::cout << "large filtering distance: " << vertices(big_mesh).size() << " vertices left" << std::endl; std::cout << "small filtering distance: " << vertices(small_mesh).size() << " vertices left" << std::endl; - assert(vertices(small_mesh).size() != vertices(ref_mesh).size()); - assert(vertices(big_mesh).size() == vertices(ref_mesh).size()); + assert(vertices(ref_mesh).size() < vertices(small_mesh).size()); + assert(vertices(big_mesh).size() < vertices(small_mesh).size()); + assert(vertices(ref_mesh).size() < vertices(big_mesh).size()); return EXIT_SUCCESS; }