gtsam_points
Loading...
Searching...
No Matches
kdtree2.hpp
1// SPDX-License-Identifier: MIT
2// Copyright (c) 2021 Kenji Koide (k.koide@aist.go.jp)
3
4#pragma once
5
6#include <memory>
7#include <iostream>
8#include <Eigen/Core>
9
10#include <gtsam_points/config.hpp>
11#include <gtsam_points/ann/small_kdtree.hpp>
12#include <gtsam_points/types/frame_traits.hpp>
13#include <gtsam_points/ann/nearest_neighbor_search.hpp>
14#include <gtsam_points/util/parallelism.hpp>
15
16namespace gtsam_points {
17
21template <typename Frame>
23public:
24 using Index = UnsafeKdTree<Frame>;
25
26 KdTree2(const std::shared_ptr<const Frame>& frame, int build_num_threads = 1)
27 : frame(frame),
28 search_eps(-1.0),
29 index(
30 is_omp_default() || build_num_threads == 1 ? //
31 new Index(*this->frame, KdTreeBuilderOMP(build_num_threads)) //
32 : //
33#ifdef GTSAM_POINTS_USE_TBB //
34 new Index(*this->frame, KdTreeBuilderTBB()) //
35#else //
36 new Index(*this->frame, KdTreeBuilder())
37#endif
38 ) {
39 if (frame::size(*frame) == 0) {
40 std::cerr << "error: empty frame is given for KdTree2" << std::endl;
41 std::cerr << " : frame::size() may not be implemented" << std::endl;
42 }
43 }
44 virtual ~KdTree2() override {}
45
52 virtual size_t knn_search(
53 const double* pt,
54 size_t k,
55 size_t* k_indices,
56 double* k_sq_dists,
57 double max_sq_dist = std::numeric_limits<double>::max()) const override {
58 KnnSetting setting;
59 setting.max_sq_dist = max_sq_dist;
60 return index->knn_search(Eigen::Map<const Eigen::Vector3d>(pt), k, k_indices, k_sq_dists, setting);
61 }
62
74 virtual size_t radius_search(
75 const double* pt,
76 double radius,
77 std::vector<size_t>& indices,
78 std::vector<double>& sq_dists,
79 int max_num_neighbors = std::numeric_limits<int>::max()) const override {
80 KnnSetting setting;
81 setting.max_nn = max_num_neighbors;
82 return index->radius_search(Eigen::Map<const Eigen::Vector3d>(pt), radius, indices, sq_dists, setting);
83 }
84
85public:
86 const std::shared_ptr<const Frame> frame;
87
88 double search_eps;
89
90 std::unique_ptr<Index> index;
91};
92
93} // namespace gtsam_points
KdTree-based nearest neighbor search.
Definition kdtree2.hpp:22
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 kdtree2.hpp:74
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
Find k nearest neighbors.
Definition kdtree2.hpp:52
Kd-tree builder with OpenMP.
Definition small_kdtree.hpp:189
Single thread Kd-tree builder.
Definition small_kdtree.hpp:124
K-nearest neighbor search setting.
Definition knn_result.hpp:11
int max_nn
Maximum number of neighbors to search.
Definition knn_result.hpp:20
double max_sq_dist
Maximum squared distance to search.
Definition knn_result.hpp:21
Nearest neighbor search interface.
Definition nearest_neighbor_search.hpp:16