15 using FlannIndex = flann::Index<flann::L2<double>>;
17 using indices_and_distaces = std::pair<std::vector<index_t>, std::vector<double>>;
20 flann::Matrix<double> points_mat(
const_cast<double *
>(points.data()), points.rows(), 3);
22 flann_index_ = std::make_unique<FlannIndex>(points_mat, flann::KDTreeSingleIndexParams());
23 flann_index_->buildIndex();
25 if(use_exact_search) {
26 params_knn_.checks = flann::FLANN_CHECKS_UNLIMITED;
27 params_radius_.checks = flann::FLANN_CHECKS_UNLIMITED;
31 [[nodiscard]]indices_and_distaces knn_search(
const geometry::point3d& point, index_t k)
const {
32 flann::Matrix<double> point_mat(
const_cast<double *
>(point.data()), 1, 3);
33 std::vector<std::vector<size_t>> indices_v;
34 std::vector<std::vector<double>> distaces_v;
36 (void)flann_index_->knnSearch(point_mat, indices_v, distaces_v, k, params_knn_);
38 std::vector<index_t> indices;
39 indices.reserve(indices_v[0].size());
41 for(
auto i : indices_v[0]) {
42 indices.push_back(
static_cast<index_t
>(i));
45 for(
auto &d : distaces_v[0]) {
49 RSMESH_ASSERT(indices.size() == distaces_v[0].size() and indices.size() == k);
51 return {std::move(indices), std::move(distaces_v[0])};
54 [[nodiscard]] indices_and_distaces radius_search(
const geometry::points3d& point,
double radius)
const {
55 flann::Matrix<double> point_mat(
const_cast<double *
>(point.data()), 1, 3);
56 std::vector<std::vector<size_t>> indices_v;
57 std::vector<std::vector<double>> distances_v;
59 auto radius_sq =
static_cast<float>(radius * radius);
60 (void)flann_index_->radiusSearch(point_mat, indices_v, distances_v, radius_sq, params_radius_);
62 std::vector<index_t> indices;
63 indices.reserve(indices_v[0].size());
65 for(
auto i : indices_v[0]) {
66 indices.push_back(
static_cast<index_t
>(i));
69 for(
auto &d : distances_v[0]) {
73 return {std::move(indices), std::move(distances_v[0])};
77 flann::SearchParams params_knn_;
78 flann::SearchParams params_radius_;
79 std::unique_ptr<FlannIndex> flann_index_;