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; typedef typename GeomTraits::Point_3::Point Point;
#endif #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 // types for search tree
// TOFIX: how can we avoid repeating those? // TOFIX: how can we avoid repeating those?

View File

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

View File

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