天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 166|回复: 0

简单的八叉树算法的C++实现

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-3-15 21:13:31 | 显示全部楼层 |阅读模式
  1. 以下是一个简单的八叉树算法的C++实现:
  2. ```cpp
  3. #include <iostream>
  4. #include <vector>
  5. using namespace std;
  6. class Point {
  7. public:
  8.     float x, y, z;
  9.     Point(float x, float y, float z) : x(x), y(y), z(z) {}
  10. };
  11. class Bounds {
  12. public:
  13.     float min采用x, max采用x, min采用y, max采用y, min采用z, max采用z;
  14.     Bounds(float min采用x, float max采用x, float min采用y, float max采用y, float min采用z, float max采用z)
  15.         : min采用x(min采用x), max采用x(max采用x), min采用y(min采用y), max采用y(max采用y), min采用z(min采用z), max采用z(max采用z) {}
  16.     bool contains(const Point& point) const {
  17.         return point.x >= min采用x && point.x <= max采用x && point.y >= min采用y && point.y <= max采用y && point.z >= min采用z && point.z <= max采用z;
  18.     }
  19. };
  20. class OctreeNode {
  21. public:
  22.     vector<Point> data;
  23.     Bounds bounds;
  24.     int depth;
  25.     OctreeNode* children[8];
  26.     OctreeNode(const Bounds& bounds, int depth = 0) : bounds(bounds), depth(depth) {
  27.         for (int i = 0; i < 8; i++) {
  28.             children[i] = nullptr;
  29.         }
  30.     }
  31.     void insert(const Point& point) {
  32.         if (!bounds.contains(point)) {
  33.             return;
  34.         }
  35.         if (children[0] == nullptr) {
  36.             data.push采用back(point);
  37.             if (data.size() > 8 && depth < 3) {
  38.                 subdivide();
  39.             }
  40.             return;
  41.         }
  42.         for (int i = 0; i < 8; i++) {
  43.             children[i]->insert(point);
  44.         }
  45.     }
  46.     void subdivide() {
  47.         float mid采用x = (bounds.min采用x + bounds.max采用x) / 2;
  48.         float mid采用y = (bounds.min采用y + bounds.max采用y) / 2;
  49.         float mid采用z = (bounds.min采用z + bounds.max采用z) / 2;
  50.         children[0] = new OctreeNode(Bounds(bounds.min采用x, mid采用x, bounds.min采用y, mid采用y, bounds.min采用z, mid采用z), depth + 1);
  51.         children[1] = new OctreeNode(Bounds(mid采用x, bounds.max采用x, bounds.min采用y, mid采用y, bounds.min采用z, mid采用z), depth + 1);
  52.         children[2] = new OctreeNode(Bounds(bounds.min采用x, mid采用x, mid采用y, bounds.max采用y, bounds.min采用z, mid采用z), depth + 1);
  53.         children[3] = new OctreeNode(Bounds(mid采用x, bounds.max采用x, mid采用y, bounds.max采用y, bounds.min采用z, mid采用z), depth + 1);
  54.         children[4] = new OctreeNode(Bounds(bounds.min采用x, mid采用x, bounds.min采用y, mid采用y, mid采用z, bounds.max采用z), depth + 1);
  55.         children[5] = new OctreeNode(Bounds(mid采用x, bounds.max采用x, bounds.min采用y, mid采用y, mid采用z, bounds.max采用z), depth + 1);
  56.         children[6] = new OctreeNode(Bounds(bounds.min采用x, mid采用x, mid采用y, bounds.max采用y, mid采用z, bounds.max采用z), depth + 1);
  57.         children[7] = new OctreeNode(Bounds(mid采用x, bounds.max采用x, mid采用y, bounds.max采用y, mid采用z, bounds.max采用z), depth + 1);
  58.         for (const Point& point : data) {
  59.             for (int i = 0; i < 8; i++) {
  60.                 children[i]->insert(point);
  61.             }
  62.         }
  63.         data.clear();
  64.     }
  65. };
  66. ```
复制代码

 

 

 

 

简单的八叉树算法的C++实现
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 08:37 , Processed in 0.133452 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表