From 0d617400bca6b5e5dc4a8f70a4c9d89fa64a442c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 17 Jul 2019 14:29:26 +0200 Subject: [PATCH] Accelerate AABB tree traversal by passing the tolerance as initial min_dist --- .../internal/Snapping/snap.h | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Snapping/snap.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Snapping/snap.h index 3a7bd01a471..09b5cd7607f 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Snapping/snap.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Snapping/snap.h @@ -583,9 +583,11 @@ class Projection_traits typedef CGAL::AABB_node Node; public: - explicit Projection_traits(const AABBTraits& traits) + explicit Projection_traits(const AABBTraits& traits, + const FT sq_tolerance) : m_traits(traits), - m_closest_point_initialized(false) + m_closest_point_initialized(false), + m_sq_dist(sq_tolerance) {} bool go_further() const { return true; } @@ -602,20 +604,21 @@ public: m_closest_point_initialized = true; m_closest_primitive = primitive.id(); m_closest_point = primitive.reference_point(m_traits.shared_data()); + m_sq_dist = m_traits.squared_distance_object()(query, m_closest_point); } Point new_closest_point = m_traits.closest_point_object()(query, primitive, m_closest_point); if(new_closest_point != m_closest_point) { m_closest_primitive = primitive.id(); - m_closest_point = new_closest_point; // this effectively shrinks the sphere + m_closest_point = new_closest_point; + m_sq_dist = m_traits.squared_distance_object()(query, m_closest_point); } } bool do_intersect(const Point& query, const Node& node) const { - return !m_closest_point_initialized || - m_traits.compare_distance_object()(query, node.bbox(), m_closest_point) == CGAL::SMALLER; + return m_traits.compare_distance_object()(query, node.bbox(), m_sq_dist) == CGAL::SMALLER; } Point closest_point() const { return m_closest_point; } @@ -623,10 +626,12 @@ public: bool closest_point_initialized() const { return m_closest_point_initialized; } private: + bool m_closest_point_initialized; Point m_closest_point; + FT m_sq_dist; + typename Primitive::Id m_closest_primitive; const AABBTraits& m_traits; - bool m_closest_point_initialized; }; template @@ -770,7 +775,7 @@ std::size_t snap_vertex_range_onto_vertex_range_non_conforming(const HalfedgeRan #endif // use the current halfedge as hint - internal::Projection_traits traversal_traits(aabb_tree.traits()); + internal::Projection_traits traversal_traits(aabb_tree.traits(), sq_tolerance); aabb_tree.traversal(query, traversal_traits); if(!traversal_traits.closest_point_initialized())