mirror of https://github.com/CGAL/cgal
Accelerate AABB tree traversal by passing the tolerance as initial min_dist
This commit is contained in:
parent
ead092a62b
commit
0d617400bc
|
|
@ -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())
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue