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.
This commit is contained in:
Marc Glisse 2017-01-13 02:11:40 +01:00
parent 482b0bc073
commit cfd4e92153
2 changed files with 19 additions and 9 deletions

View File

@ -203,8 +203,7 @@ namespace CGAL {
static_cast<Internal_node_const_handle>(this); static_cast<Internal_node_const_handle>(this);
// after splitting b denotes the lower part of b // after splitting b denotes the lower part of b
Kd_tree_rectangle<FT,D> b_upper(b); Kd_tree_rectangle<FT,D> b_upper(b);
b.split(b_upper, node->cutting_dimension(), node->split_bbox(b, b_upper);
node->cutting_value());
if (q.outer_range_contains(b)) if (q.outer_range_contains(b))
it=node->lower()->tree_items(it); it=node->lower()->tree_items(it);
@ -240,8 +239,7 @@ namespace CGAL {
static_cast<Internal_node_const_handle>(this); static_cast<Internal_node_const_handle>(this);
// after splitting b denotes the lower part of b // after splitting b denotes the lower part of b
Kd_tree_rectangle<FT,D> b_upper(b); Kd_tree_rectangle<FT,D> b_upper(b);
b.split(b_upper, node->cutting_dimension(), node->split_bbox(b, b_upper);
node->cutting_value());
if (q.outer_range_contains(b)){ if (q.outer_range_contains(b)){
result = node->lower()->any_tree_item(); result = node->lower()->any_tree_item();
@ -342,6 +340,7 @@ namespace CGAL {
typedef typename TreeTraits::FT FT; typedef typename TreeTraits::FT FT;
typedef typename Kd_tree<TreeTraits,Splitter,UseExtendedNode>::Separator Separator; typedef typename Kd_tree<TreeTraits,Splitter,UseExtendedNode>::Separator Separator;
typedef typename Kd_tree<TreeTraits,Splitter,UseExtendedNode>::D D;
private: private:
@ -470,7 +469,12 @@ namespace CGAL {
return Separator(cutting_dimension,cutting_value); return Separator(cutting_dimension,cutting_value);
}*/ }*/
void split_bbox(Kd_tree_rectangle<FT,D>& l, Kd_tree_rectangle<FT,D>& 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 };//internal node
template < class TreeTraits, class Splitter> template < class TreeTraits, class Splitter>
@ -484,6 +488,7 @@ namespace CGAL {
typedef typename TreeTraits::FT FT; typedef typename TreeTraits::FT FT;
typedef typename Kd_tree<TreeTraits,Splitter,Tag_false>::Separator Separator; typedef typename Kd_tree<TreeTraits,Splitter,Tag_false>::Separator Separator;
typedef typename Kd_tree<TreeTraits,Splitter,Tag_false>::D D;
private: private:
@ -577,7 +582,10 @@ namespace CGAL {
return Separator(cutting_dimension,cutting_value); return Separator(cutting_dimension,cutting_value);
}*/ }*/
void split_bbox(Kd_tree_rectangle<FT,D>& l, Kd_tree_rectangle<FT,D>& u) const {
l.upper()[cut_dim]=cut_val;
u.lower()[cut_dim]=cut_val;
}
};//internal node };//internal node

View File

@ -213,8 +213,10 @@ namespace CGAL {
return D::value; return D::value;
} }
const T* lower() const {return lower_;} T* lower() {return lower_.data();}
const T* upper() const {return upper_;} T* upper() {return upper_.data();}
const T* lower() const {return lower_.data();}
const T* upper() const {return upper_.data();}
Kd_tree_rectangle& Kd_tree_rectangle&
operator=(const Kd_tree_rectangle& r) operator=(const Kd_tree_rectangle& r)