Jet  v1.3.3
kdtree.h
Go to the documentation of this file.
1 // Copyright (c) 2018 Doyub Kim
2 //
3 // I am making my contributions/submissions to this project solely in my
4 // personal capacity and am not conveying any rights to any intellectual
5 // property of any third parties.
6 
7 #ifndef INCLUDE_JET_KDTREE_H
8 #define INCLUDE_JET_KDTREE_H
9 
10 #include <jet/bounding_box2.h>
11 #include <jet/bounding_box3.h>
12 #include <jet/vector2.h>
13 #include <jet/vector3.h>
14 #include <jet/vector4.h>
15 
16 #include <vector>
17 
18 namespace jet {
19 
21 template <typename T, size_t K>
22 class KdTree final {
23  public:
26 
28  struct Node {
30  size_t flags = 0;
31 
34  size_t child = kMaxSize;
35 
37  size_t item = kMaxSize;
38 
41 
43  Node();
44 
46  void initLeaf(size_t it, const Point& pt);
47 
49  void initInternal(size_t axis, size_t it, size_t c, const Point& pt);
50 
52  bool isLeaf() const;
53  };
54 
55  typedef std::vector<Point> ContainerType;
56  typedef typename ContainerType::iterator Iterator;
57  typedef typename ContainerType::const_iterator ConstIterator;
58 
59  typedef std::vector<Node> NodeContainerType;
60  typedef typename NodeContainerType::iterator NodeIterator;
61  typedef typename NodeContainerType::const_iterator ConstNodeIterator;
62 
64  KdTree();
65 
67  void build(const ConstArrayAccessor1<Point>& points);
68 
78  const Point& origin, T radius,
79  const std::function<void(size_t, const Point&)>& callback) const;
80 
90  bool hasNearbyPoint(const Point& origin, T radius) const;
91 
93  size_t nearestPoint(const Point& origin) const;
94 
97 
100 
103 
106 
109 
112 
115 
118 
120  void reserve(size_t numPoints, size_t numNodes);
121 
122  private:
123  std::vector<Point> _points;
124  std::vector<Node> _nodes;
125 
126  size_t build(size_t nodeIndex, size_t* itemIndices, size_t nItems,
127  size_t currentDepth);
128 };
129 
130 } // namespace jet
131 
132 #include "detail/kdtree-inl.h"
133 
134 #endif // INCLUDE_JET_KDTREE_H
jet::KdTree::hasNearbyPoint
bool hasNearbyPoint(const Point &origin, T radius) const
jet::KdTree::begin
Iterator begin()
Returns the mutable begin iterator of the item.
jet::KdTree
Generic k-d tree structure.
Definition: kdtree.h:22
jet::KdTree::Node::item
size_t item
Item index.
Definition: kdtree.h:37
jet::ConstArrayAccessor< T, 1 >
1-D read-only array accessor class.
Definition: array_accessor1.h:184
jet::KdTree::BBox
BoundingBox< T, K > BBox
Definition: kdtree.h:25
jet::KdTree::nearestPoint
size_t nearestPoint(const Point &origin) const
Returns index of the nearest point.
jet::KdTree::Iterator
ContainerType::iterator Iterator
Definition: kdtree.h:56
jet::KdTree::begin
ConstIterator begin() const
Returns the immutable begin iterator of the item.
jet::KdTree::Node::initLeaf
void initLeaf(size_t it, const Point &pt)
Initializes leaf node.
jet::KdTree::forEachNearbyPoint
void forEachNearbyPoint(const Point &origin, T radius, const std::function< void(size_t, const Point &)> &callback) const
jet::KdTree::Node::flags
size_t flags
Split axis if flags < K, leaf indicator if flags == K.
Definition: kdtree.h:30
jet::KdTree::beginNode
ConstNodeIterator beginNode() const
Returns the immutable begin iterator of the node.
jet::KdTree::ConstNodeIterator
NodeContainerType::const_iterator ConstNodeIterator
Definition: kdtree.h:61
jet::Vector< T, K >
jet::KdTree::NodeIterator
NodeContainerType::iterator NodeIterator
Definition: kdtree.h:60
jet::kMaxSize
constexpr size_t kMaxSize
Max size_t.
Definition: constants.h:79
jet::KdTree::Node::child
size_t child
Right child index. Note that left child index is this node index + 1.
Definition: kdtree.h:34
jet::KdTree::reserve
void reserve(size_t numPoints, size_t numNodes)
Reserves memory space for this tree.
jet::KdTree::Node::point
Point point
Point stored in the node.
Definition: kdtree.h:40
jet
Definition: advection_solver2.h:18
vector2.h
jet::KdTree::KdTree
KdTree()
Constructs an empty kD-tree instance.
jet::KdTree::Node
Simple K-d tree node.
Definition: kdtree.h:28
jet::KdTree::Node::isLeaf
bool isLeaf() const
Returns true if leaf.
jet::KdTree::Node::Node
Node()
Default contructor.
vector4.h
jet::KdTree::end
ConstIterator end() const
Returns the immutable end iterator of the item.
jet::KdTree::ConstIterator
ContainerType::const_iterator ConstIterator
Definition: kdtree.h:57
jet::KdTree::end
Iterator end()
Returns the mutable end iterator of the item.
jet::BoundingBox
Generic N-D axis-aligned bounding box class.
Definition: bounding_box.h:21
bounding_box2.h
vector3.h
jet::KdTree::beginNode
NodeIterator beginNode()
Returns the mutable begin iterator of the node.
jet::KdTree::build
void build(const ConstArrayAccessor1< Point > &points)
Builds internal acceleration structure for given points list.
jet::KdTree::ContainerType
std::vector< Point > ContainerType
Definition: kdtree.h:55
jet::KdTree::Node::initInternal
void initInternal(size_t axis, size_t it, size_t c, const Point &pt)
Initializes internal node.
bounding_box3.h
jet::KdTree::endNode
ConstNodeIterator endNode() const
Returns the immutable end iterator of the node.
jet::KdTree::endNode
NodeIterator endNode()
Returns the mutable end iterator of the node.
jet::KdTree::NodeContainerType
std::vector< Node > NodeContainerType
Definition: kdtree.h:59
jet::KdTree::Point
Vector< T, K > Point
Definition: kdtree.h:24