Accelerate AABB tree traversal by passing the tolerance as initial min_dist

This commit is contained in:
Mael Rouxel-Labbé 2019-07-17 14:29:26 +02:00
parent ead092a62b
commit 0d617400bc
1 changed files with 12 additions and 7 deletions

View File

@ -583,9 +583,11 @@ class Projection_traits
typedef CGAL::AABB_node<AABBTraits> Node; typedef CGAL::AABB_node<AABBTraits> Node;
public: public:
explicit Projection_traits(const AABBTraits& traits) explicit Projection_traits(const AABBTraits& traits,
const FT sq_tolerance)
: m_traits(traits), : m_traits(traits),
m_closest_point_initialized(false) m_closest_point_initialized(false),
m_sq_dist(sq_tolerance)
{} {}
bool go_further() const { return true; } bool go_further() const { return true; }
@ -602,20 +604,21 @@ public:
m_closest_point_initialized = true; m_closest_point_initialized = true;
m_closest_primitive = primitive.id(); m_closest_primitive = primitive.id();
m_closest_point = primitive.reference_point(m_traits.shared_data()); 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); Point new_closest_point = m_traits.closest_point_object()(query, primitive, m_closest_point);
if(new_closest_point != m_closest_point) if(new_closest_point != m_closest_point)
{ {
m_closest_primitive = primitive.id(); 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 bool do_intersect(const Point& query, const Node& node) const
{ {
return !m_closest_point_initialized || return m_traits.compare_distance_object()(query, node.bbox(), m_sq_dist) == CGAL::SMALLER;
m_traits.compare_distance_object()(query, node.bbox(), m_closest_point) == CGAL::SMALLER;
} }
Point closest_point() const { return m_closest_point; } Point closest_point() const { return m_closest_point; }
@ -623,10 +626,12 @@ public:
bool closest_point_initialized() const { return m_closest_point_initialized; } bool closest_point_initialized() const { return m_closest_point_initialized; }
private: private:
bool m_closest_point_initialized;
Point m_closest_point; Point m_closest_point;
FT m_sq_dist;
typename Primitive::Id m_closest_primitive; typename Primitive::Id m_closest_primitive;
const AABBTraits& m_traits; const AABBTraits& m_traits;
bool m_closest_point_initialized;
}; };
template <typename PolygonMesh, typename GeomTraits, typename VPM> template <typename PolygonMesh, typename GeomTraits, typename VPM>
@ -770,7 +775,7 @@ std::size_t snap_vertex_range_onto_vertex_range_non_conforming(const HalfedgeRan
#endif #endif
// use the current halfedge as hint // use the current halfedge as hint
internal::Projection_traits<AABB_Traits> traversal_traits(aabb_tree.traits()); internal::Projection_traits<AABB_Traits> traversal_traits(aabb_tree.traits(), sq_tolerance);
aabb_tree.traversal(query, traversal_traits); aabb_tree.traversal(query, traversal_traits);
if(!traversal_traits.closest_point_initialized()) if(!traversal_traits.closest_point_initialized())