From cfd4e92153e7ffe4ed925e1850b6779857fb4808 Mon Sep 17 00:00:00 2001 From: Marc Glisse Date: Fri, 13 Jan 2017 02:11:40 +0100 Subject: [PATCH] Use extended Kd_tree information also for search / search_any_point. Note that we don't want to use set_upper_bound, because it calls set_max_span, which the current split already avoids. Also fix Kd_tree_rectangle::lower() with fixed dimension. --- Spatial_searching/include/CGAL/Kd_tree_node.h | 22 +++++++++++++------ .../include/CGAL/Kd_tree_rectangle.h | 6 +++-- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/Spatial_searching/include/CGAL/Kd_tree_node.h b/Spatial_searching/include/CGAL/Kd_tree_node.h index 16d28f303a7..c9d5e23478e 100644 --- a/Spatial_searching/include/CGAL/Kd_tree_node.h +++ b/Spatial_searching/include/CGAL/Kd_tree_node.h @@ -203,9 +203,8 @@ namespace CGAL { static_cast(this); // after splitting b denotes the lower part of b Kd_tree_rectangle b_upper(b); - b.split(b_upper, node->cutting_dimension(), - node->cutting_value()); - + node->split_bbox(b, b_upper); + if (q.outer_range_contains(b)) it=node->lower()->tree_items(it); else @@ -240,8 +239,7 @@ namespace CGAL { static_cast(this); // after splitting b denotes the lower part of b Kd_tree_rectangle b_upper(b); - b.split(b_upper, node->cutting_dimension(), - node->cutting_value()); + node->split_bbox(b, b_upper); if (q.outer_range_contains(b)){ result = node->lower()->any_tree_item(); @@ -342,6 +340,7 @@ namespace CGAL { typedef typename TreeTraits::FT FT; typedef typename Kd_tree::Separator Separator; + typedef typename Kd_tree::D D; private: @@ -469,8 +468,13 @@ namespace CGAL { { return Separator(cutting_dimension,cutting_value); }*/ - + void split_bbox(Kd_tree_rectangle& l, Kd_tree_rectangle& u) const { + l.lower()[cut_dim]=lower_low_val; + l.upper()[cut_dim]=lower_high_val; + u.lower()[cut_dim]=upper_low_val; + u.upper()[cut_dim]=upper_high_val; + } };//internal node template < class TreeTraits, class Splitter> @@ -484,6 +488,7 @@ namespace CGAL { typedef typename TreeTraits::FT FT; typedef typename Kd_tree::Separator Separator; + typedef typename Kd_tree::D D; private: @@ -576,8 +581,11 @@ namespace CGAL { { return Separator(cutting_dimension,cutting_value); }*/ - + void split_bbox(Kd_tree_rectangle& l, Kd_tree_rectangle& u) const { + l.upper()[cut_dim]=cut_val; + u.lower()[cut_dim]=cut_val; + } };//internal node diff --git a/Spatial_searching/include/CGAL/Kd_tree_rectangle.h b/Spatial_searching/include/CGAL/Kd_tree_rectangle.h index 78ed29f06d7..979ec7867c3 100644 --- a/Spatial_searching/include/CGAL/Kd_tree_rectangle.h +++ b/Spatial_searching/include/CGAL/Kd_tree_rectangle.h @@ -213,8 +213,10 @@ namespace CGAL { return D::value; } - const T* lower() const {return lower_;} - const T* upper() const {return upper_;} + T* lower() {return lower_.data();} + T* upper() {return upper_.data();} + const T* lower() const {return lower_.data();} + const T* upper() const {return upper_.data();} Kd_tree_rectangle& operator=(const Kd_tree_rectangle& r)