gtsam_points
Loading...
Searching...
No Matches
kdtreex_impl.hpp
1// SPDX-License-Identifier: MIT
2// Copyright (c) 2025 Kenji Koide (k.koide@aist.go.jp)
3
4#include <gtsam_points/ann/kdtreex.hpp>
5
6#include <nanoflann.hpp>
7
8namespace gtsam_points {
9
10template <int D>
11KdTreeX<D>::KdTreeX(const Eigen::Matrix<double, D, 1>* points, int num_points)
12: num_points(num_points),
13 points(points),
14 search_eps(-1.0),
15 index(new Index(dim(), *this, nanoflann::KDTreeSingleIndexAdaptorParams(10))) {
16 index->buildIndex();
17}
18
19template <int D>
21
22template <int D>
23size_t KdTreeX<D>::knn_search(const double* pt, size_t k, size_t* k_indices, double* k_sq_dists, double max_sq_dist) const {
24 if (search_eps > 0.0) {
25 nanoflann::KNNResultSet<double, size_t> result_set(k);
26 result_set.init(k_indices, k_sq_dists);
27 nanoflann::SearchParams search_params;
28 search_params.eps = search_eps;
29 index->findNeighbors(result_set, pt, search_params);
30 return result_set.size();
31 }
32
33 return index->knnSearch(pt, k, k_indices, k_sq_dists);
34}
35
36template <int D>
37size_t KdTreeX<D>::radius_search(const double* pt, double radius, std::vector<size_t>& indices, std::vector<double>& sq_dists, int max_num_neighbors)
38 const {
39 nanoflann::SearchParams params;
40 std::vector<std::pair<size_t, double>> indices_dists;
41 size_t num_found = index->radiusSearch(pt, radius * radius, indices_dists, params);
42
43 indices.resize(num_found);
44 sq_dists.resize(num_found);
45 for (size_t i = 0; i < num_found; i++) {
46 indices[i] = indices_dists[i].first;
47 sq_dists[i] = indices_dists[i].second;
48 }
49
50 return num_found;
51}
52
53} // namespace gtsam_points
Definition intensity_kdtree.hpp:17
KdTree with arbitrary dimension.
Definition kdtreex.hpp:27
virtual size_t radius_search(const double *pt, double radius, std::vector< size_t > &indices, std::vector< double > &sq_dists, int max_num_neighbors=std::numeric_limits< int >::max()) const override
Radius search.
Definition kdtreex_impl.hpp:37
KdTreeX(const Eigen::Matrix< double, D, 1 > *points, int num_points)
Constructor.
Definition kdtreex_impl.hpp:11
virtual size_t knn_search(const double *pt, size_t k, size_t *k_indices, double *k_sq_dists, double max_sq_dist=std::numeric_limits< double >::max()) const override
k-nearest neighbor search
Definition kdtreex_impl.hpp:23