数据结构——四叉树

四叉树(Quadtree)是一种用于表示和管理二维空间的树状数据结构。它将二维空间递归地分割成四个象限,每个象限可以继续分割,以实现对空间的更精细的划分。四叉树通常用于解决空间搜索和查询问题,例如碰撞检测、图像压缩、地理信息系统等领域。
在这里插入图片描述
特别适合大规模的广阔室外场景管理。一般来说如果游戏场景是基于地形的(甚至没有高度)(如城市、平原、2D场景),那么适合用四叉树来管理。而如果游戏场景在高度轴上也有大量物体需要管理(如太空、高山),那么适合用八叉树来管理。

#include <iostream>// 定义二维点的结构体
struct Point {float x;float y;Point(float _x, float _y) : x(_x), y(_y) {}
};// 定义四叉树节点
struct QuadTreeNode {Point point;QuadTreeNode* topLeft;QuadTreeNode* topRight;QuadTreeNode* bottomLeft;QuadTreeNode* bottomRight;QuadTreeNode(Point _point) : point(_point), topLeft(nullptr), topRight(nullptr), bottomLeft(nullptr), bottomRight(nullptr) {}
};class QuadTree {
private:QuadTreeNode* root;int maxDepth; // 最大深度// 在指定深度下递归插入节点QuadTreeNode* insert(QuadTreeNode* node, Point point, int depth) {if (node == nullptr) {return new QuadTreeNode(point);}// 根据点的位置选择象限if (point.x < node->point.x && point.y < node->point.y) {node->bottomLeft = insert(node->bottomLeft, point, depth + 1);} else if (point.x >= node->point.x && point.y < node->point.y) {node->bottomRight = insert(node->bottomRight, point, depth + 1);} else if (point.x < node->point.x && point.y >= node->point.y) {node->topLeft = insert(node->topLeft, point, depth + 1);} else {node->topRight = insert(node->topRight, point, depth + 1);}return node;}// 在指定深度下递归搜索节点bool search(QuadTreeNode* node, Point point, int depth) {if (node == nullptr) {return false;}if (node->point.x == point.x && node->point.y == point.y) {return true;}// 根据点的位置选择象限if (point.x < node->point.x && point.y < node->point.y) {return search(node->bottomLeft, point, depth + 1);} else if (point.x >= node->point.x && point.y < node->point.y) {return search(node->bottomRight, point, depth + 1);} else if (point.x < node->point.x && point.y >= node->point.y) {return search(node->topLeft, point, depth + 1);} else {return search(node->topRight, point, depth + 1);}}public:QuadTree(float minX, float minY, float maxX, float maxY, int depth) : root(nullptr), maxDepth(depth) {}// 插入一个点void insert(Point point) {root = insert(root, point, 0);}// 搜索一个点是否存在bool search(Point point) {return search(root, point, 0);}
};int main() {QuadTree quadtree(0.0f, 0.0f, 100.0f, 100.0f, 4); // 创建四叉树,定义边界和最大深度Point point1(10.0f, 20.0f);Point point2(80.0f, 90.0f);quadtree.insert(point1); // 插入点1quadtree.insert(point2); // 插入点2Point searchPoint(80.0f, 90.0f);bool found = quadtree.search(searchPoint); // 搜索点2if (found) {std::cout << "Point found in the quadtree." << std::endl;} else {std::cout << "Point not found in the quadtree." << std::endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/111704.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java常用类之 Java比较器、System类、Math类、BigInteger与BigDecimal

Java常用类 文章目录 五、Java比较器5.1、Comparable 接口的使用5.1.1、自然排序&#xff1a;Comparable接口5.1.2、定制排序&#xff1a;Comparator接口 六、System类七、Math类八、BigInteger与BigDecimal 五、Java比较器 提出背景&#xff1a; Java中的对象&#xff0c;正常…

【群晖NAS】Synology drive套件安装设置与结合内网穿透实现远程访问——“cpolar内网穿透”

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…

企业架构LNMP学习笔记59

目录介绍&#xff1a; bin&#xff1a;存放的是启动和关闭tomcat的脚本文件&#xff1b; conf&#xff1a;存放tomcat服务器的各种全局配置文件&#xff0c;其中最重要的是server.xml和web.xml lib: 存放的是tomcat服务器所需要的各种jar文件。java打包类库。 logs&#xff…

【Linux】编辑器 vim

1、vim的基本概念 vi/vim【一款文本编辑器】vim【一款多模式编辑器】vi/vim 的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是 vim 是 vi 的升级版本&#xff0c;它不仅兼容vi的所有指令&#xff0c;而且还有一些新的特性在里面。例如语法加亮&#xff0…

ubuntu安装k8s(docker版)

&#xff08;一&#xff09;简介 k8s是什么就不介绍了&#xff0c;下面是k8s的官方文档&#xff0c;这里仅演示安装的过程&#xff0c;使用一主一从的结构 传送门 PS&#xff1a;推荐安装可以先使用云服务器把环境搭起来&#xff0c;这样系统比较干净&#xff0c;不然不知道会…

Java与MySQL的绝妙结合:打造高效审批流程

是流程思路等分析&#x1f431;‍&#x1f464; 审批流程&#x1f431;‍&#x1f4bb; 1️⃣.串行流程 当前节点审批完成后&#xff0c;下一次节点才能进行操作&#xff0c;例如经理通过之后&#xff0c;总监才能审批&#xff1b; 2️⃣.并行流程 一个审批节点需要多人联审。…

为什么Python赢了,别的语言都干嘛去了?

人工智能时代&#xff0c;为什么Python大放异彩&#xff0c;别的语言都干嘛去了&#xff1f; 为什么不是使用者众多的Java&#xff1f;也许是Java啰里啰唆&#xff0c;不如Python那么简洁&#xff1f; 为什么不是Ruby&#xff1f; 和Python一样简洁&#xff0c;但是更加优雅。…

【谢希尔 计算机网络】第1章 计算机网络概述

目录 1.1.1计算机网络概念&#xff0c;功能&#xff0c;组成&#xff0c;分类 计算机网络的概念 计算机网络的功能 计算机网络的组成 计算机网络的分类 1.1.2标准化工作 1.1.3速率相关的性能指标 速率 带宽 吞吐量 时延 时延带宽积​编辑 往返时延RTT 利用率 1.…

Python:函数和代码复用

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方&#xff0c;赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备好了&#xff0c;直接在文末名片自取就可 1、关于递归函…

深度学习:cross-attention介绍以及与self-attention的区别

1.Cross-attention vs Self-attention Cross-attention的输入来自不同的序列&#xff0c;Self-attention的输入来自同序列&#xff0c;也就是所谓的输入不同&#xff0c;但是除此之外&#xff0c;基本一致。 具体而言&#xff0c; self-attention输入则是一个单一的嵌入序列。 …

Open3D 点云配准——可视化匹配点对之间的连线

点云配准 一、算法原理1、概述2、主要函数二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、概述 可视化源点云和目标点云中匹配点对之间的连线,这对于点云配准,尤…

MySQL基础终端命令与Python简单操作MySQL

文章目录 MySQL终端命令1. 进入mysql2. 创建数据库3. 选择数据库4. 创建数据表1. 主键约束2. 外键约束3. 非空约束4. 唯一约束5. 使用默认约束6. 设置id为自增列 5. 查看数据表6. 修改数据表1. 修改表名2. 修改表的字段类型3. 修改表的字段名4. 为表添加字段5. 删除字段6. 调整…