AABB tree: more on Point_and_primitive in traversal traits

This commit is contained in:
Pierre Alliez 2009-05-02 09:45:20 +00:00
parent b4cff1bb34
commit 2d22df1c41
3 changed files with 21 additions and 18 deletions

View File

@ -53,7 +53,7 @@ public:
typedef typename GeomTraits::Point_3::Point Point;
#endif
typedef typename std::pair<typename Point, typename primitive> Point_and_primitive;
typedef typename std::pair<typename Point, typename Primitive> Point_and_primitive;
// types for search tree
// TOFIX: how can we avoid repeating those?

View File

@ -104,7 +104,7 @@ namespace CGAL {
template<typename Query>
bool any_intersection(const Query& q,
Intersection& intersection) const;
Point_and_primitive& intersection) const;
template<typename Query, typename OutputIterator>
bool any_intersected_primitive(const Query& q,
@ -113,22 +113,25 @@ namespace CGAL {
// distance queries
FT squared_distance(const Point& q, const Point& hint) const;
FT squared_distance(const Point& q) const;
Point closest_point(const Point& q, const Point& hint) const;
Point closest_point(const Point& q) const;
Point closest_point(const Point& q, const Point& hint);
Point closest_point(const Point& q);
Primitive closest_primitive(const Point& q, const Point& hint) const;
Primitive closest_primitive(const Point& q) const;
Point_and_primitive closest_point_and_primitive(const Point& q, const Point& hint) const;
Point_and_primitive closest_point_and_primitive(const Point& q) const;
Bounding_box root_bbox() const { return m_p_root->bounding_box(); }
bool is_empty() const { return m_data.empty(); }
bool empty() const { return m_data.empty(); }
size_t size() const { return m_data.size(); }
/// generic traversal of tree
template <class Query, class Traversal_traits>
void traversal(const Query& q, Traversal_traits& traits) const
{
m_p_root->template traversal<Traversal_traits,Query>(q, traits, m_data.size());
if(!empty())
m_p_root->template traversal<Traversal_traits,Query>(q, traits, m_data.size());
else
std::cerr << "AABB tree traversal with empty tree" << std::endl;
}
//////////////////////////////////////////////
@ -197,7 +200,7 @@ namespace CGAL {
return AABBTraits().do_intersect(q, node.bounding_box());
}
int intersection_number() const { return m_nb_intersections; }
int number_of_intersections() const { return m_nb_intersections; }
private:
Point_and_primitive m_intersection;
@ -232,8 +235,8 @@ namespace CGAL {
}
private:
Intersection m_intersection;
Output_iterator m_out_it;
Point_and_primitive m_intersection;
};
@ -284,7 +287,7 @@ namespace CGAL {
{
// TOFIX: update m_closest_primitive
m_closest_point = AABBTraits().nearest_point(query, primitive, m_closest_point);
m_sphere = AABBTraits().sphere(q, m_closest_point);
m_sphere = AABBTraits().sphere(query, m_closest_point);
}
bool do_intersect(const Point& q, const Node& node) const
@ -422,7 +425,7 @@ namespace CGAL {
Traversal_traits traversal_traits;
this->traversal(query, traversal_traits);
return traversal_traits.intersection_number();
return traversal_traits.number_of_intersections();
}
@ -492,18 +495,18 @@ namespace CGAL {
template<typename Tr>
typename AABB_tree<Tr>::Point
AABB_tree<Tr>::closest_point(const Point& query,
const Point& hint) const
const Point& hint)
{
Distance_traits traversal_traits(query,hint);
this->traversal(query, traversal_traits);
return traversal_traits.projection();
Distance_traits distance_traits(query,hint);
this->traversal(query, distance_traits);
return distance_traits.closest_point();
}
// closest point without hint, the search KD-tree is queried for the
// first nearest neighbor point to get a hint
template<typename Tr>
typename AABB_tree<Tr>::Point
AABB_tree<Tr>::closest_point(const Point& query) const
AABB_tree<Tr>::closest_point(const Point& query)
{
// construct search KD-tree if needed
Point hint;

View File

@ -51,7 +51,7 @@ void test_all_query_types(Tree& tree)
typedef typename K::Vector_3 Vector;
typedef typename K::Segment_3 Segment;
typedef typename Tree::Primitive Primitive;
typedef typename Tree::Intersection Intersection;
typedef typename Tree::Point_and_primitive Point_and_primitive;
Point p((FT)-0.5, (FT)-0.5, (FT)-0.5);
Point q((FT) 0.5, (FT) 0.5, (FT) 0.5);
@ -77,13 +77,13 @@ void test_all_query_types(Tree& tree)
tree.all_intersected_primitives(segment,std::back_inserter(primitives));
// any_intersection
Intersection intersection;
Point_and_primitive intersection;
success = tree.any_intersection(ray,intersection);
success = tree.any_intersection(line,intersection);
success = tree.any_intersection(segment,intersection);
// all_intersections
std::list<Intersection> intersections;
std::list<Point_and_primitive> intersections;
tree.all_intersections(ray,std::back_inserter(intersections));
tree.all_intersections(line,std::back_inserter(intersections));
tree.all_intersections(segment,std::back_inserter(intersections));