CGAL 5.3 - dD Spatial Searching
|
#include <CGAL/Kd_tree.h>
The class Kd_tree
defines a k-d
tree.
Traits | must be a model of the concept SearchTraits , for example Search_traits_2<Simple_cartesian<double> > . |
Splitter | must be a model for the concept Splitter . It defaults to Sliding_midpoint<Traits> . |
UseExtendedNode | must be Tag_true , if the tree shall be built with extended nodes, and Tag_false otherwise. |
EnablePointsCache | can be Tag_true or Tag_false . Not storing the points coordinates inside the tree usually generates a lot of cache misses, leading to non-optimal performance. This is the case for example when indices are stored inside the tree, or to a lesser extent when the points coordinates are stored in a dynamically allocated array (e.g., Epick_d with dynamic dimension) — we says "to a lesser extent" because the points are re-created by the kd-tree in a cache-friendly order after its construction, so the coordinates are more likely to be stored in a near-optimal order on the heap. When EnablePointsCache is set to Tag_true , the points coordinates will be cached in an optimal way. This will increase memory consumption but provide better search performance. See also the GeneralDistance and FuzzyQueryItem concepts for additional requirements when using such a cache. |
CGAL::Kd_tree_node<Traits>
CGAL::Search_traits_2<Kernel>
CGAL::Search_traits_3<Kernel>
CGAL::Search_traits<FT_,Point,CartesianIterator,ConstructCartesianIterator>
Types | |
typedef unspecified_type | D |
Dimension tag. | |
typedef Traits::Point_d | Point_d |
Point class. | |
typedef Traits::FT | FT |
Number type. | |
typedef unspecified_type | Splitter |
Splitter type. | |
typedef unspecified_type | iterator |
Bidirectional const iterator with value type Point_d that allows to enumerate all points in the tree. | |
typedef unspecified_type | Node_handle |
A handle with value type Kd_tree_node<Traits,Splitter> . | |
typedef unspecified_type | Node_const_handle |
A const handle with value type Kd_tree_node<Traits,Splitter> . | |
typedef unspecified_type | Point_d_iterator |
Random access const iterator with value type const Point_d* . | |
typedef unspecified_type | size_type |
A type that counts the number of elements in a k-d tree. | |
Creation | |
Kd_tree (Splitter s=Splitter(), Traits t=Traits()) | |
Constructs an empty k-d tree. | |
template<class InputIterator > | |
Kd_tree (InputIterator first, InputIterator beyond, Splitter s=Splitter(), Traits t=Traits()) | |
Constructs a k-d tree on the elements from the sequence [first, beyond) using the splitting rule implemented by s . More... | |
template<typename ConcurrencyTag > | |
void | build () |
The constructor does not build the internal data structure, and it is also not updated after calls to insert() . More... | |
void | invalidate_build () |
This clears the internal data structure, which then gets rebuilt either by an explicit call to build() or implicitly by the next query or removal. More... | |
Operations | |
void | insert (Point_d p) |
Inserts the point p in the k-d tree. More... | |
template<class InputIterator > | |
void | insert (InputIterator first, InputIterator beyond) |
Inserts the elements from the sequence [first, beyond) in the k-d tree. More... | |
template<class IdentifyPoint > | |
void | remove (Point_d p, IdentifyPoint identify_point) |
Removes the point p from the k-d tree. More... | |
void | remove (Point_d p) |
Removes point p , calling the 2-argument function remove() with a functor that simply compares coordinates. | |
void | reserve (size_t size) |
size_t | capacity () |
template<class FuzzyQueryItem > | |
boost::optional< Point_d > | search_any_point (FuzzyQueryItem q) const |
Reports any point that is approximately contained by q . More... | |
template<class OutputIterator , class FuzzyQueryItem > | |
OutputIterator | search (OutputIterator it, FuzzyQueryItem q) const |
Reports the points that are approximately contained by q . More... | |
iterator | begin () const |
Returns a const iterator to the first point in the tree. More... | |
iterator | end () const |
Returns the appropriate past-the-end const iterator. | |
void | clear () |
Removes all points from the k-d tree. | |
size_type | size () const |
Returns the number of points that are stored in the tree. | |
Traits | traits () const |
return the instance of the traits used to construct the tree. | |
Node_handle | root () |
Returns a handle to the root node of the tree. | |
Node_const_handle | root () const |
Returns a const handle to the root node of the tree. | |
const Kd_tree_rectangle< FT, D > & | bounding_box () const |
Returns a const reference to the bounding box of the root node of the tree. | |
std::ostream & | statistics (std::ostream &s) const |
Inserts statistics of the tree into the output stream s . | |
CGAL::Kd_tree< Traits, Splitter, UseExtendedNode, EnablePointsCache >::Kd_tree | ( | InputIterator | first, |
InputIterator | beyond, | ||
Splitter | s = Splitter() , |
||
Traits | t = Traits() |
||
) |
Constructs a k-d
tree on the elements from the sequence [first, beyond)
using the splitting rule implemented by s
.
The value type of the InputIterator
must be Point_d
.
iterator CGAL::Kd_tree< Traits, Splitter, UseExtendedNode, EnablePointsCache >::begin | ( | ) | const |
void CGAL::Kd_tree< Traits, Splitter, UseExtendedNode, EnablePointsCache >::build | ( | ) |
The constructor does not build the internal data structure, and it is also not updated after calls to insert()
.
The method build()
is called implicitly at the first call to a query or removal member function. You can call build()
explicitly to ensure that the next call to query functions will not trigger the reconstruction of the data structure.
ConcurrencyTag | enables sequential versus parallel algorithm. Possible values are Sequential_tag , Parallel_tag , and Parallel_if_available_tag . This template parameter is optional: calling build() without specifying the concurrency tag will result in Sequential_tag being used. If build() is not called by the user but called implicitly at the first call to a query or removal member function, Sequential_tag is also used. |
void CGAL::Kd_tree< Traits, Splitter, UseExtendedNode, EnablePointsCache >::insert | ( | Point_d | p | ) |
Inserts the point p
in the k-d
tree.
build()
, automatically triggers a rebuild of the whole structure. void CGAL::Kd_tree< Traits, Splitter, UseExtendedNode, EnablePointsCache >::insert | ( | InputIterator | first, |
InputIterator | beyond | ||
) |
Inserts the elements from the sequence [first, beyond)
in the k-d
tree.
The value type of the InputIterator
must be Point_d
.
void CGAL::Kd_tree< Traits, Splitter, UseExtendedNode, EnablePointsCache >::invalidate_build | ( | ) |
This clears the internal data structure, which then gets rebuilt either by an explicit call to build()
or implicitly by the next query or removal.
The only reason to call this function explicitly is to rebalance the tree after some number of removals.
void CGAL::Kd_tree< Traits, Splitter, UseExtendedNode, EnablePointsCache >::remove | ( | Point_d | p, |
IdentifyPoint | identify_point | ||
) |
Removes the point p
from the k-d
tree.
It uses equal_to_p
to identify the point after locating it, which can matter in particular when 2 points are in the same place. IdentifyPoint
is a unary functor that takes a Point_d
and returns a bool
. This is a limited and naive implementation that does not rebalance the tree. On the other hand, the tree remains valid and ready for queries. If the internal data structure is not already built, for instance because the last operation was an insertion, it first calls build()
.
OutputIterator CGAL::Kd_tree< Traits, Splitter, UseExtendedNode, EnablePointsCache >::search | ( | OutputIterator | it, |
FuzzyQueryItem | q | ||
) | const |
Reports the points that are approximately contained by q
.
The types FuzzyQueryItem::Point_d
and Point_d
must be equivalent. To use this function Traits
must be a model of the concept RangeSearchTraits
.
boost::optional<Point_d> CGAL::Kd_tree< Traits, Splitter, UseExtendedNode, EnablePointsCache >::search_any_point | ( | FuzzyQueryItem | q | ) | const |
Reports any point that is approximately contained by q
.
The types FuzzyQueryItem::Point_d
and Point_d
must be equivalent. To use this function Traits
must be a model of the concept RangeSearchTraits
.