cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
kdtree.hpp
Go to the documentation of this file.
1#pragma once
2
6#include <nanoflann.hpp>
7
8namespace toolbox::pcl
9{
10
11// Generic KD-tree implementation
12template<typename Element, typename Metric = toolbox::metrics::L2Metric<typename Element::value_type>>
13class CPP_TOOLBOX_EXPORT kdtree_generic_t : public base_knn_generic_t<kdtree_generic_t<Element, Metric>, Element, Metric>
14{
15public:
18 using element_type = typename traits_type::element_type;
19 using metric_type = typename traits_type::metric_type;
20 using distance_type = typename traits_type::distance_type;
23 using value_type = typename Element::value_type;
24
25 kdtree_generic_t() = default;
26 ~kdtree_generic_t() = default;
27
32
33 // Set input data implementations
34 std::size_t set_input_impl(const container_type& data);
35 std::size_t set_input_impl(const container_ptr& data);
36
37 // Set metric implementations
38 void set_metric_impl(const metric_type& metric);
39 void set_metric_impl(std::shared_ptr<toolbox::metrics::IMetric<value_type>> metric);
40
41 // KNN search implementations
42 bool kneighbors_impl(const element_type& query,
43 std::size_t num_neighbors,
44 std::vector<std::size_t>& indices,
45 std::vector<distance_type>& distances);
46
47 bool radius_neighbors_impl(const element_type& query,
48 distance_type radius,
49 std::vector<std::size_t>& indices,
50 std::vector<distance_type>& distances);
51
52 void set_max_leaf_size(std::size_t max_leaf_size) { m_max_leaf_size = max_leaf_size; }
53 [[nodiscard]] std::size_t get_max_leaf_size() const noexcept { return m_max_leaf_size; }
54
55private:
56 // Dataset adaptor for nanoflann - generic version
57 struct data_adaptor_t
58 {
59 const container_ptr& data;
60 static constexpr std::size_t dims = 3; // Assuming 3D points for now
61
62 data_adaptor_t(const container_ptr& data_) : data(data_) {}
63
64 inline std::size_t kdtree_get_point_count() const { return data->size(); }
65
66 inline value_type kdtree_get_pt(const std::size_t idx, const std::size_t dim) const
67 {
68 const auto& element = (*data)[idx];
69 if (dim == 0) return element.x;
70 else if (dim == 1) return element.y;
71 else return element.z;
72 }
73
74 template<class BBOX>
75 bool kdtree_get_bbox(BBOX& /*bb*/) const { return false; }
76 };
77
78 // Metric adaptor to bridge between our metrics and nanoflann
79 template<typename NanoflannMetric>
80 struct metric_adaptor_t
81 {
82 metric_type m_metric;
83
84 metric_adaptor_t(const metric_type& metric) : m_metric(metric) {}
85
86 template<typename U, typename V>
87 inline distance_type operator()(const U* a, const V& b, std::size_t size) const
88 {
89 // For nanoflann compatibility, we need to convert array to element
90 element_type elem_a;
91 elem_a.x = a[0];
92 elem_a.y = a[1];
93 elem_a.z = a[2];
94
95 return m_metric(elem_a, b);
96 }
97 };
98
99 // KD-tree type definitions using nanoflann's L2_Simple
100 using kd_tree_t = nanoflann::KDTreeSingleIndexAdaptor<
101 nanoflann::L2_Simple_Adaptor<value_type, data_adaptor_t>,
102 data_adaptor_t,
103 3, // dimensions
104 std::size_t
105 >;
106
107 void build_tree();
108 bool validate_metric() const;
109
110 container_ptr m_data;
111 std::unique_ptr<data_adaptor_t> m_adaptor;
112 std::unique_ptr<kd_tree_t> m_kdtree;
113 metric_type m_compile_time_metric;
114 std::shared_ptr<toolbox::metrics::IMetric<value_type>> m_runtime_metric;
115 bool m_use_runtime_metric = false;
116 std::size_t m_max_leaf_size = 10;
117};
118
119// Type aliases for common use cases
120template<typename DataType>
122
123} // namespace toolbox::pcl
124
Definition metric_factory.hpp:23
Definition vector_metrics.hpp:18
KNN算法的基类(CRTP模式) / Base class for KNN algorithms (CRTP pattern)
Definition base_knn.hpp:69
std::shared_ptr< container_type > container_ptr
Definition base_knn.hpp:76
std::vector< element_type > container_type
Definition base_knn.hpp:75
Definition kdtree.hpp:14
typename base_type::container_ptr container_ptr
Definition kdtree.hpp:22
kdtree_generic_t(kdtree_generic_t &&)=delete
typename traits_type::distance_type distance_type
Definition kdtree.hpp:20
typename base_type::container_type container_type
Definition kdtree.hpp:21
kdtree_generic_t(const kdtree_generic_t &)=delete
typename traits_type::element_type element_type
Definition kdtree.hpp:18
typename Element::value_type value_type
Definition kdtree.hpp:23
kdtree_generic_t & operator=(kdtree_generic_t &&)=delete
typename base_type::traits_type traits_type
Definition kdtree.hpp:17
std::size_t get_max_leaf_size() const noexcept
Definition kdtree.hpp:53
void set_max_leaf_size(std::size_t max_leaf_size)
Definition kdtree.hpp:52
typename traits_type::metric_type metric_type
Definition kdtree.hpp:19
kdtree_generic_t & operator=(const kdtree_generic_t &)=delete
Definition base_correspondence_generator.hpp:18
KNN算法的特征定义 / KNN algorithm traits definition.
Definition base_knn.hpp:23