ViewDesignEngine  3.1.0
高性能 CAD 计算几何引擎
kd_tree.h
浏览该文件的文档.
1 
11 #pragma once
13 #include <vector>
14 
15 namespace vde::spatial {
16 using core::AABB3D;
17 using core::Point3D;
18 using core::Vector3D;
19 using core::Ray3Dd;
20 using core::Triangle3D;
21 
47 template <typename T>
48 class KDTree : public SpatialIndex<T> {
49 public:
58  void build(const std::vector<T>& items) override;
59 
65  void insert(const T& item) override;
66 
73  bool remove(const T& item) override;
74 
83  std::vector<T> query_range(const AABB3D& range) const override;
84 
95  std::vector<T> query_knn(const Point3D& point, size_t k) const override;
96 
103  std::vector<T> query_ray(const Ray3Dd& ray) const override;
104 
108  void clear() override;
109 
115  size_t size() const override { return items_.size(); }
116 
117 private:
121  struct Node {
122  AABB3D bounds;
123  int item_idx = -1;
124  int split_axis = 0;
125  int left = -1;
126  int right = -1;
127  };
128 
129  std::vector<T> items_;
130  std::vector<Node> nodes_;
131  int root_ = -1;
139  static Point3D get_position(const T& item);
140 
147  static AABB3D get_aabb(const T& item);
148 
156  static bool ray_hits_item(const T& item, const Ray3Dd& ray);
157 
165  int build_recursive(int start, int end);
166 
174  void query_range_recursive(int node_idx, const AABB3D& range,
175  std::vector<T>& result) const;
176 
184  void query_ray_recursive(int node_idx, const Ray3Dd& ray,
185  std::vector<T>& result) const;
186 };
187 
188 } // namespace vde::spatial
k-d 树空间索引
Definition: kd_tree.h:48
std::vector< T > query_ray(const Ray3Dd &ray) const override
射线查询
size_t size() const override
对象数量
Definition: kd_tree.h:115
std::vector< T > query_range(const AABB3D &range) const override
范围查询
bool remove(const T &item) override
删除对象
void insert(const T &item) override
插入单个对象
std::vector< T > query_knn(const Point3D &point, size_t k) const override
K 近邻查询
void clear() override
清空 k-d 树
void build(const std::vector< T > &items) override
批量构建 k-d 树
空间索引抽象基类
Definition: spatial_index.h:44
Ray3D< double > Ray3Dd
双精度三维射线
Definition: line.h:141
Triangle< double > Triangle3D
双精度三维三角形
Definition: triangle.h:105
AABB< double > AABB3D
双精度三维包围盒
Definition: aabb.h:131
foundation::Vector3D Vector3D
双精度三维向量(重新导出)
Definition: point.h:49
foundation::Point3D Point3D
双精度三维点(重新导出)
Definition: point.h:31
空间索引抽象基类