11#ifndef CUBBYFLOW_KDTREE_IMPL_HPP
12#define CUBBYFLOW_KDTREE_IMPL_HPP
18template <
typename T,
size_t K>
23 child = std::numeric_limits<size_t>::max();
27template <
typename T,
size_t K>
37template <
typename T,
size_t K>
43template <
typename T,
size_t K>
46 m_points.resize(points.
Length());
47 std::copy(points.
begin(), points.
end(), m_points.begin());
63template <
typename T,
size_t K>
65 const Point& origin,
T radius,
66 const std::function<
void(
size_t,
const Point&)>&
callback)
const
68 const T r2 = radius * radius;
76 const Node*
node = m_nodes.data();
78 while (
node !=
nullptr)
80 if (
node->item != std::numeric_limits<size_t>::max() &&
81 (
node->point - origin).LengthSquared() <=
r2)
103 const Node* firstChild =
node + 1;
129template <
typename T,
size_t K>
132 const T r2 = radius * radius;
142 while (
node !=
nullptr)
144 if (
node->item != std::numeric_limits<size_t>::max() &&
145 (
node->point - origin).LengthSquared() <=
r2)
195template <
typename T,
size_t K>
208 while (
node !=
nullptr)
263template <
typename T,
size_t K>
270template <
typename T,
size_t K>
273 return m_points.begin();
276template <
typename T,
size_t K>
279 return m_points.end();
282template <
typename T,
size_t K>
285 return m_points.begin();
288template <
typename T,
size_t K>
291 return m_points.end();
294template <
typename T,
size_t K>
297 return m_nodes.begin();
300template <
typename T,
size_t K>
303 return m_nodes.end();
306template <
typename T,
size_t K>
309 return m_nodes.begin();
312template <
typename T,
size_t K>
315 return m_nodes.end();
318template <
typename T,
size_t K>
323 m_nodes.emplace_back();
328 m_nodes[
nodeIndex].InitLeaf(std::numeric_limits<size_t>::max(), {});
339 for (
size_t i = 0; i <
nItems; ++i)
344 const size_t axis =
static_cast<size_t>(d.DominantAxis());
349 return m_points[
a][
axis] < m_points[b][
axis];
362 return std::max(
d0,
d1);
void Build(const ConstArrayView1< Point > &points)
Builds internal acceleration structure for given points list.
Definition KdTree-Impl.hpp:44
void Reserve(size_t numPoints, size_t numNodes)
Reserves memory space for this tree.
Definition KdTree-Impl.hpp:264
typename NodeContainerType::const_iterator ConstNodeIterator
Definition KdTree.hpp:60
size_t GetNearestPoint(const Point &origin) const
Returns index of the nearest point.
Definition KdTree-Impl.hpp:196
void ForEachNearbyPoint(const Point &origin, T radius, const std::function< void(size_t, const Point &)> &callback) const
Definition KdTree-Impl.hpp:64
typename ContainerType::const_iterator ConstIterator
Definition KdTree.hpp:56
NodeIterator EndNode()
Returns the mutable end iterator of the node.
Definition KdTree-Impl.hpp:301
Iterator begin()
Returns the mutable begin iterator of the item.
Definition KdTree-Impl.hpp:271
typename ContainerType::iterator Iterator
Definition KdTree.hpp:55
bool HasNearbyPoint(const Point &origin, T radius) const
Definition KdTree-Impl.hpp:130
typename NodeContainerType::iterator NodeIterator
Definition KdTree.hpp:59
Vector< T, K > Point
Definition KdTree.hpp:25
NodeIterator BeginNode()
Returns the mutable begin iterator of the node.
Definition KdTree-Impl.hpp:295
Iterator end()
Returns the mutable end iterator of the item.
Definition KdTree-Impl.hpp:277
BoundingBox< T, K > BBox
Definition KdTree.hpp:26
ValueType Length() const
Definition MatrixExpression-Impl.hpp:278
Iterator begin()
Definition Matrix-Impl.hpp:272
Pointer data()
Definition Matrix-Impl.hpp:298
Iterator end()
Definition Matrix-Impl.hpp:285
Definition pybind11Utils.hpp:21
Matrix< T, Rows, 1 > Vector
Definition Matrix.hpp:738
Simple K-d tree node.
Definition KdTree.hpp:30
Point point
Point stored in the node.
Definition KdTree.hpp:51
size_t item
Item index.
Definition KdTree.hpp:48
void InitLeaf(size_t it, const Point &pt)
Initializes leaf node.
Definition KdTree-Impl.hpp:19
size_t child
Right child index. Note that left child index is this node index + 1.
Definition KdTree.hpp:45
void InitInternal(size_t axis, size_t it, size_t c, const Point &pt)
Initializes internal node.
Definition KdTree-Impl.hpp:28
bool IsLeaf() const
Returns true if leaf.
Definition KdTree-Impl.hpp:38
size_t flags
Split axis if flags < K, leaf indicator if flags == K.
Definition KdTree.hpp:41