From 79affebe42a83dc3dcb592492e172fd87dfb50ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 14 May 2012 11:54:16 +0000 Subject: [PATCH] make the traversal and expand using the traits class stored in the AABB_tree --- AABB_tree/include/CGAL/AABB_traits.h | 12 ++-- AABB_tree/include/CGAL/AABB_tree.h | 30 ++++++---- .../CGAL/internal/AABB_tree/AABB_node.h | 16 +++--- .../AABB_tree/AABB_traversal_traits.h | 57 +++++++++++-------- AABB_tree/test/AABB_tree/AABB_test_util.h | 19 ++++--- 5 files changed, 78 insertions(+), 56 deletions(-) diff --git a/AABB_tree/include/CGAL/AABB_traits.h b/AABB_tree/include/CGAL/AABB_traits.h index 0a7f553527f..4ee6f62d955 100644 --- a/AABB_tree/include/CGAL/AABB_traits.h +++ b/AABB_tree/include/CGAL/AABB_traits.h @@ -114,7 +114,7 @@ void operator()(PrimitiveIterator first, } }; -Sort_primitives sort_primitives_object() {return Sort_primitives();} +Sort_primitives sort_primitives_object() const {return Sort_primitives();} /** @@ -139,7 +139,7 @@ typename AT::Bounding_box operator()(ConstPrimitiveIterator first, } }; -Compute_bbox compute_bbox_object() {return Compute_bbox();} +Compute_bbox compute_bbox_object() const {return Compute_bbox();} class Do_intersect { @@ -157,7 +157,7 @@ public: } }; -Do_intersect do_intersect_object() {return Do_intersect();} +Do_intersect do_intersect_object() const {return Do_intersect();} class Intersection { public: @@ -175,7 +175,7 @@ operator()(const Query& query, const typename AT::Primitive& primitive) const } }; -Intersection intersection_object() {return Intersection();} +Intersection intersection_object() const {return Intersection();} // This should go down to the GeomTraits, i.e. the kernel @@ -218,8 +218,8 @@ Intersection intersection_object() {return Intersection();} } }; - Closest_point closest_point_object() {return Closest_point();} - Compare_distance compare_distance_object() {return Compare_distance();} + Closest_point closest_point_object() const {return Closest_point();} + Compare_distance compare_distance_object() const {return Compare_distance();} private: diff --git a/AABB_tree/include/CGAL/AABB_tree.h b/AABB_tree/include/CGAL/AABB_tree.h index fb8be4af0a6..fa263f6dbdb 100644 --- a/AABB_tree/include/CGAL/AABB_tree.h +++ b/AABB_tree/include/CGAL/AABB_tree.h @@ -108,6 +108,10 @@ namespace CGAL { clear(); } + const AABBTraits& traits() const{ + return m_traits; + } + /// Clears the tree void clear() { @@ -232,6 +236,8 @@ public: } private: + //Traits class + AABBTraits m_traits; // set of input primitives Primitives m_primitives; // single root node @@ -269,7 +275,8 @@ public: template AABB_tree::AABB_tree() - : m_primitives() + : m_traits() + , m_primitives() , m_p_root_node(NULL) , m_p_search_tree(NULL) , m_search_tree_constructed(false) @@ -281,7 +288,8 @@ public: template AABB_tree::AABB_tree(ConstPrimitiveIterator first, ConstPrimitiveIterator beyond) - : m_primitives() + : m_traits() + , m_primitives() , m_p_root_node(NULL) , m_p_search_tree(NULL) , m_search_tree_constructed(false) @@ -346,7 +354,7 @@ public: } // constructs the tree - m_p_root_node->expand(m_primitives.begin(), m_primitives.end(), m_primitives.size()); + m_p_root_node->expand(m_primitives.begin(), m_primitives.end(), m_primitives.size(),m_traits); // In case the users has switched on the acceletated distance query // data structure with the default arguments, then it has to be @@ -411,7 +419,7 @@ public: { using namespace CGAL::internal::AABB_tree; typedef typename AABB_tree::AABB_traits AABBTraits; - Do_intersect_traits traversal_traits; + Do_intersect_traits traversal_traits(m_traits); this->traversal(query, traversal_traits); return traversal_traits.is_intersection_found(); } @@ -430,7 +438,7 @@ public: Counting_iterator out(&counter); Listing_primitive_traits traversal_traits(out); + Query, Counting_iterator> traversal_traits(out,m_traits); this->traversal(query, traversal_traits); return counter; } @@ -444,7 +452,7 @@ public: using namespace CGAL::internal::AABB_tree; typedef typename AABB_tree::AABB_traits AABBTraits; Listing_primitive_traits traversal_traits(out); + Query, OutputIterator> traversal_traits(out,m_traits); this->traversal(query, traversal_traits); return out; } @@ -458,7 +466,7 @@ public: using namespace CGAL::internal::AABB_tree; typedef typename AABB_tree::AABB_traits AABBTraits; Listing_intersection_traits traversal_traits(out); + Query, OutputIterator> traversal_traits(out,m_traits); this->traversal(query, traversal_traits); return out; } @@ -470,7 +478,7 @@ public: { using namespace CGAL::internal::AABB_tree; typedef typename AABB_tree::AABB_traits AABBTraits; - First_intersection_traits traversal_traits; + First_intersection_traits traversal_traits(m_traits); this->traversal(query, traversal_traits); return traversal_traits.result(); } @@ -482,7 +490,7 @@ public: { using namespace CGAL::internal::AABB_tree; typedef typename AABB_tree::AABB_traits AABBTraits; - First_primitive_traits traversal_traits; + First_primitive_traits traversal_traits(m_traits); this->traversal(query, traversal_traits); return traversal_traits.result(); } @@ -496,7 +504,7 @@ public: typename Primitive::Id hint_primitive = m_primitives[0].id(); using namespace CGAL::internal::AABB_tree; typedef typename AABB_tree::AABB_traits AABBTraits; - Projection_traits projection_traits(hint,hint_primitive); + Projection_traits projection_traits(hint,hint_primitive,m_traits); this->traversal(query, projection_traits); return projection_traits.closest_point(); } @@ -546,7 +554,7 @@ public: { using namespace CGAL::internal::AABB_tree; typedef typename AABB_tree::AABB_traits AABBTraits; - Projection_traits projection_traits(hint.first,hint.second); + Projection_traits projection_traits(hint.first,hint.second,m_traits); this->traversal(query, projection_traits); return projection_traits.closest_point_and_primitive(); } diff --git a/AABB_tree/include/CGAL/internal/AABB_tree/AABB_node.h b/AABB_tree/include/CGAL/internal/AABB_tree/AABB_node.h index 099075f1e78..dda29f4d089 100644 --- a/AABB_tree/include/CGAL/internal/AABB_tree/AABB_node.h +++ b/AABB_tree/include/CGAL/internal/AABB_tree/AABB_node.h @@ -64,7 +64,8 @@ public: template void expand(ConstPrimitiveIterator first, ConstPrimitiveIterator beyond, - const std::size_t range); + const std::size_t range, + const AABBTraits&); /** * @brief General traversal query @@ -124,12 +125,13 @@ template void AABB_node::expand(ConstPrimitiveIterator first, ConstPrimitiveIterator beyond, - const std::size_t range) + const std::size_t range, + const Tr& traits) { - m_bbox = AABB_traits().compute_bbox_object()(first, beyond); + m_bbox = traits.compute_bbox_object()(first, beyond); // sort primitives along longest axis aabb - AABB_traits().sort_primitives_object()(first, beyond, m_bbox); + traits.sort_primitives_object()(first, beyond, m_bbox); switch(range) { @@ -140,14 +142,14 @@ AABB_node::expand(ConstPrimitiveIterator first, case 3: m_p_left_child = &(*first); m_p_right_child = static_cast(this)+1; - right_child().expand(first+1, beyond, 2); + right_child().expand(first+1, beyond, 2,traits); break; default: const std::size_t new_range = range/2; m_p_left_child = static_cast(this) + 1; m_p_right_child = static_cast(this) + new_range; - left_child().expand(first, first + new_range, new_range); - right_child().expand(first + new_range, beyond, range - new_range); + left_child().expand(first, first + new_range, new_range,traits); + right_child().expand(first + new_range, beyond, range - new_range,traits); } } diff --git a/AABB_tree/include/CGAL/internal/AABB_tree/AABB_traversal_traits.h b/AABB_tree/include/CGAL/internal/AABB_tree/AABB_traversal_traits.h index a5499444274..e216506b3f6 100644 --- a/AABB_tree/include/CGAL/internal/AABB_tree/AABB_traversal_traits.h +++ b/AABB_tree/include/CGAL/internal/AABB_tree/AABB_traversal_traits.h @@ -79,20 +79,20 @@ class First_intersection_traits public: typedef typename boost::optional Result; public: - First_intersection_traits() - : m_result() + First_intersection_traits(const AABBTraits& traits) + : m_result(), m_traits(traits) {} bool go_further() const { return !m_result; } void intersection(const Query& query, const Primitive& primitive) { - m_result = AABBTraits().intersection_object()(query, primitive); + m_result = m_traits.intersection_object()(query, primitive); } bool do_intersect(const Query& query, const Node& node) const { - return AABBTraits().do_intersect_object()(query, node.bbox()); + return m_traits.do_intersect_object()(query, node.bbox()); } Result result() const { return m_result; } @@ -100,6 +100,7 @@ public: private: Result m_result; + const AABBTraits& m_traits; }; @@ -120,15 +121,15 @@ class Listing_intersection_traits typedef typename ::CGAL::AABB_tree::size_type size_type; public: - Listing_intersection_traits(Output_iterator out_it) - : m_out_it(out_it) {} + Listing_intersection_traits(Output_iterator out_it, const AABBTraits& traits) + : m_out_it(out_it), m_traits(traits) {} bool go_further() const { return true; } void intersection(const Query& query, const Primitive& primitive) { boost::optional intersection; - intersection = AABBTraits().intersection_object()(query, primitive); + intersection = m_traits.intersection_object()(query, primitive); if(intersection) { *m_out_it++ = *intersection; @@ -137,11 +138,12 @@ public: bool do_intersect(const Query& query, const Node& node) const { - return AABBTraits().do_intersect_object()(query, node.bbox()); + return m_traits.do_intersect_object()(query, node.bbox()); } private: Output_iterator m_out_it; + const AABBTraits& m_traits; }; @@ -162,14 +164,14 @@ class Listing_primitive_traits typedef typename ::CGAL::AABB_tree::size_type size_type; public: - Listing_primitive_traits(Output_iterator out_it) - : m_out_it(out_it) {} + Listing_primitive_traits(Output_iterator out_it, const AABBTraits& traits) + : m_out_it(out_it), m_traits(traits) {} bool go_further() const { return true; } void intersection(const Query& query, const Primitive& primitive) { - if( AABBTraits().do_intersect_object()(query, primitive) ) + if( m_traits.do_intersect_object()(query, primitive) ) { *m_out_it++ = primitive.id(); } @@ -177,11 +179,12 @@ public: bool do_intersect(const Query& query, const Node& node) const { - return AABBTraits().do_intersect_object()(query, node.bbox()); + return m_traits.do_intersect_object()(query, node.bbox()); } private: Output_iterator m_out_it; + const AABBTraits& m_traits; }; @@ -202,15 +205,16 @@ class First_primitive_traits typedef typename ::CGAL::AABB_tree::size_type size_type; public: - First_primitive_traits() + First_primitive_traits(const AABBTraits& traits) : m_is_found(false) - , m_result() {} + , m_result() + , m_traits(traits) {} bool go_further() const { return !m_is_found; } void intersection(const Query& query, const Primitive& primitive) { - if( AABBTraits().do_intersect_object()(query, primitive) ) + if( m_traits.do_intersect_object()(query, primitive) ) { m_result = boost::optional(primitive.id()); m_is_found = true; @@ -219,7 +223,7 @@ public: bool do_intersect(const Query& query, const Node& node) const { - return AABBTraits().do_intersect_object()(query, node.bbox()); + return m_traits.do_intersect_object()(query, node.bbox()); } boost::optional result() const { return m_result; } @@ -228,6 +232,7 @@ public: private: bool m_is_found; boost::optional m_result; + const AABBTraits& m_traits; }; /** @@ -247,27 +252,28 @@ class Do_intersect_traits typedef typename ::CGAL::AABB_tree::size_type size_type; public: - Do_intersect_traits() - : m_is_found(false) + Do_intersect_traits(const AABBTraits& traits) + : m_is_found(false), m_traits(traits) {} bool go_further() const { return !m_is_found; } void intersection(const Query& query, const Primitive& primitive) { - if( AABBTraits().do_intersect_object()(query, primitive) ) + if( m_traits.do_intersect_object()(query, primitive) ) m_is_found = true; } bool do_intersect(const Query& query, const Node& node) const { - return AABBTraits().do_intersect_object()(query, node.bbox()); + return m_traits.do_intersect_object()(query, node.bbox()); } bool is_intersection_found() const { return m_is_found; } private: bool m_is_found; + const AABBTraits& m_traits; }; @@ -289,16 +295,18 @@ class Projection_traits public: Projection_traits(const Point& hint, - const typename Primitive::Id& hint_primitive) + const typename Primitive::Id& hint_primitive, + const AABBTraits& traits) : m_closest_point(hint), - m_closest_primitive(hint_primitive) + m_closest_primitive(hint_primitive), + m_traits(traits) {} bool go_further() const { return true; } void intersection(const Point& query, const Primitive& primitive) { - Point new_closest_point = AABBTraits().closest_point_object() + Point new_closest_point = m_traits.closest_point_object() (query, primitive, m_closest_point); if(new_closest_point != m_closest_point) { @@ -309,7 +317,7 @@ public: bool do_intersect(const Point& query, const Node& node) const { - return AABBTraits().compare_distance_object() + return m_traits.compare_distance_object() (query, node.bbox(), m_closest_point) == CGAL::SMALLER; } @@ -322,6 +330,7 @@ public: private: Point m_closest_point; typename Primitive::Id m_closest_primitive; + const AABBTraits& m_traits; }; }}} // end namespace CGAL::internal::AABB_tree diff --git a/AABB_tree/test/AABB_tree/AABB_test_util.h b/AABB_tree/test/AABB_tree/AABB_test_util.h index 49ad1545c05..2782fef6fb5 100644 --- a/AABB_tree/test/AABB_tree/AABB_test_util.h +++ b/AABB_tree/test/AABB_tree/AABB_test_util.h @@ -315,15 +315,18 @@ class Naive_implementations typedef typename Traits::Point_and_primitive_id Point_and_primitive_id; typedef boost::optional Intersection_result; - + + const Traits& m_traits; public: + Naive_implementations(const Traits& traits):m_traits(traits){} + template bool do_intersect(const Query& query, Polyhedron& p) const { Polyhedron_primitive_iterator it = Pr_generator().begin(p); for ( ; it != Pr_generator().end(p) ; ++it ) { - if ( Traits().do_intersect_object()(query, Pr(it) ) ) + if ( m_traits.do_intersect_object()(query, Pr(it) ) ) return true; } @@ -339,7 +342,7 @@ public: Polyhedron_primitive_iterator it = Pr_generator().begin(p); for ( ; it != Pr_generator().end(p) ; ++it ) { - if ( Traits().do_intersect_object()(query, Pr(it) ) ) + if ( m_traits.do_intersect_object()(query, Pr(it) ) ) ++result; } @@ -354,7 +357,7 @@ public: Polyhedron_primitive_iterator it = Pr_generator().begin(p); for ( ; it != Pr_generator().end(p) ; ++it ) { - if ( Traits().do_intersect_object()(query, Pr(it) ) ) + if ( m_traits.do_intersect_object()(query, Pr(it) ) ) *out++ = Pr(it).id(); } @@ -369,7 +372,7 @@ public: Polyhedron_primitive_iterator it = Pr_generator().begin(p); for ( ; it != Pr_generator().end(p) ; ++it ) { - Intersection_result intersection = Traits().intersection_object()(query, Pr(it)); + Intersection_result intersection = m_traits.intersection_object()(query, Pr(it)); if ( intersection ) *out++ = *intersection; } @@ -389,7 +392,7 @@ public: for ( ; it != Pr_generator().end(p) ; ++it ) { - closest_point = Traits().closest_point_object()(query, Pr(it), closest_point); + closest_point = m_traits.closest_point_object()(query, Pr(it), closest_point); } return closest_point; @@ -409,7 +412,7 @@ public: for ( ; it != Pr_generator().end(p) ; ++it ) { Pr tmp_pr(it); - Point tmp_pt = Traits().closest_point_object()(query, tmp_pr, closest_point); + Point tmp_pt = m_traits.closest_point_object()(query, tmp_pr, closest_point); if ( tmp_pt != closest_point ) { closest_point = tmp_pt; @@ -446,7 +449,7 @@ public: Tree_vs_naive(Tree& tree, Polyhedron& p) : m_tree(tree) , m_polyhedron(p) - , m_naive() + , m_naive(m_tree.traits()) , m_naive_time(0) , m_tree_time(0) {}