#pragma once #include #include #include namespace meshless { class KDTree { private: typedef nanoflann::KDTreeSingleIndexAdaptor, PointCloud, 3, int> kd_tree_t; PointCloud points_; kd_tree_t tree; public: explicit KDTree(const std::vector& points) :points_(points), tree(3, points_, nanoflann::KDTreeSingleIndexAdaptorParams(20)) { tree.buildIndex(); } KDTree() :points_(), tree(3, points_, nanoflann::KDTreeSingleIndexAdaptorParams(20)) {} void reset(const std::vector& points) { points_.setPts(points); tree.buildIndex(); } std::pair, std::vector> query(const Eigen::Vector3d& point, int k = 1)const; std::pair, std::vector> query(const Eigen::Vector3d& point, const double& radius_squared) const; Eigen::Vector3d get(int index) const { return points_.get(index); } std::vector get(const std::vector& indexes) const { const int n = indexes.size(); std::vector result(n); for(int i = 0; i < n; i++) { result[i] = points_.get(indexes[i]); } return result; } int size() const { return points_.kdtree_get_point_count(); } }; };