数据结构——四叉树

news2024/12/23 6:13:46

四叉树(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); // 插入点1
    quadtree.insert(point2); // 插入点2

    Point searchPoint(80.0f, 90.0f);
    bool found = quadtree.search(searchPoint); // 搜索点2
    if (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.coloradmin.cn/o/1019583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vector使用和模拟实现

&#x1f493;博主个人主页:不是笨小孩&#x1f440; ⏩专栏分类:数据结构与算法&#x1f440; C&#x1f440; 刷题专栏&#x1f440; C语言&#x1f440; &#x1f69a;代码仓库:笨小孩的代码库&#x1f440; ⏩社区&#xff1a;不是笨小孩&#x1f440; &#x1f339;欢迎大…

2.6W字系统总结,带你实现 Linux 自由!

以前就聊过大多数应届生入职后会遇到的两大拦路虎分别是Git和Linux&#xff0c;其中关于Git&#xff0c;前段时间已经分享过自己工作两年多以来用过的比较实用的一些命令了&#xff0c;这些命令可能不是最花哨的&#xff0c;但绝对是最实用的。 今天分享一份很全面的Linux常用…

springboot+canal+mysql+redis缓存双写一致性

canal官网地址&#xff1a;https://github.com/alibaba/canal/wiki/QuickStart 基本上按照官网的步骤来就行 准备 首先服务器上要安装好jdk&#xff0c;因为canal运行需要jdk,同时把canal对应的端口在服务中开放&#xff0c;否则连接不上 对于自建 MySQL , 需要先开启 Binl…

linux安装python3.x版本

linux安装python3.x版本 ① 安装依赖环境② 下载python版本包③ 安装python④ 建立软链接⑤ 加入path⑥ 验证 官网版本地址&#xff1a;https://www.python.org/ftp/python/ ① 安装依赖环境 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel…

Vue 使用vue-pdf 显示pdf文件 切换页面 缩放 全屏 自动播放等

<template><div id"container"><!-- 上一页、下一页--><div class"right-btn"><div click"toFullOrExit" class"turn-btn"><span>{{ isFull 1 ? "取消全屏" : "全屏" }}&l…

GLTF-pipeline

gltf-pipeline可用作命令行工具或 Node.js 模块。 开始 安装 Node.js如果还没有&#xff0c;然后&#xff1a; npm install -g gltf-pipeline使用 gltf-pipeline 作为命令行工具&#xff1a; 将 glTF 转换为 glb gltf-pipeline -i model.gltf -o model.glb gltf-pipeline…

python萌新爬虫学习笔记【建议收藏】

文章目录 1. 如何何请求解析url2. 如何获取标签里面的文本3. 如何解析JSON格式4. 如何添加常用的header5. 如何合并两个div6. 如何删除html dom的部分结构7. 如何一次性获取所有div标签里的文本8. python爬虫如何改变响应文本字符集编码9. 如何进行字符集转码11. response.text…

骨髓小游戏

欢迎来到程序小院 骨髓 玩法&#xff1a; 骨髓推塔小游戏&#xff0c;敌方士兵进入到我方高塔会毁坏建筑&#xff0c;我方可派兵前去迎战&#xff0c;我方&#xff1a;骑兵、长枪兵、弓兵、敌法&#xff1a;骷髅骑兵、骷髅长枪兵、 骷髅弓兵,快去消灭敌人吧^^。开始游戏https:…

利用爬虫技术自动化采集汽车之家的车型参数数据

导语 汽车之家是一个专业的汽车网站&#xff0c;提供了丰富的汽车信息&#xff0c;包括车型参数、图片、视频、评测、报价等。如果我们想要获取这些信息&#xff0c;我们可以通过浏览器手动访问网站&#xff0c;或者利用爬虫技术自动化采集数据。本文将介绍如何使用Python编写…

flutter开发实战-长按TextField输入框cut、copy设置为中文复制、粘贴

flutter开发实战-长按TextField输入框cut、copy设置为中文复制、粘贴 在开发过程中&#xff0c;需要长按TextField输入框cut、copy设置为中文“复制、粘贴”&#xff0c;这里记录一下设置的代码。 一、pubspec.yaml设置flutter_localizations 在pubspec.yaml中设置flutter_l…

教你制作简单的洪水淹没模型

制作思路&#xff1a; 利用GIS软件将地形图通过高程垂直夸大&#xff0c;显示出其地形地貌&#xff0c;绘制一个面&#xff0c;使面从下向上移动&#xff0c;因地形高程的不同&#xff0c;面穿过地形图的面积不同&#xff0c;从而视觉上模拟出了水淹没的过程。 前期准备&…

facechain环境部署

环境安装 # 创建虚拟环境facechain conda create -n facechain python3.8 conda activate facechain # 克隆 GIT_LFS_SKIP_SMUDGE1 git clone https://github.com/modelscope/facechain.git --depth 1 # 安装第三方库 cd facechain pip install -r requirements.txt pip insta…

【JavaEE】操作系统内核中的进程

文章目录 &#x1f490;什么叫做进程&#x1f490;进程在系统中是如何进行管理的&#x1f490;PCB中一些比较重要的属性&#x1f490;进程持有的CPU资源——进程调度&#x1f490;内存分配——内存管理 &#x1f490;什么叫做进程 进程概念&#xff1a;一个已经跑起来的程序就…

Scrum和Kanban方法的结合:Scrumban的实施指南

如果没有有效的项目管理&#xff0c;团队成员将不得不处理尽可能多的程序&#xff0c;而这种方法不会导致成功。有几种著名的项目管理方法&#xff0c;例如 Scrum 和看板。但是有一种方法可以结合他们的最佳实践。 Scrum 和看板的优势结合在称为 Scrumban 的混合方法中。它非常…

chales 重写/断点/映射/手机代理/其他主机代理

1 chales 安装和代理配置/手机代理配置/电脑代理配置 chales 安装和代理配置/手机代理配置/电脑代理配置 2 转载:Charles Rewrite重写(详解&#xff01;必懂系列) Charles Rewrite重写(详解&#xff01;必懂系列) 1.打开charles&#xff0c;点击菜单栏的Tools选中Rewrite2.…

企业架构LNMP学习笔记59

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

区域图片上色

目录 下图中&#xff0c;记得点击Apply&#xff0c;然后再点击Symbology 实际选择的时候&#xff0c;不选1Categorized&#xff0c;因为其分段不方便。

js中如何判断两个对象是否相等?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 浅相等&#xff08;Shallow Equality&#xff09;⭐ 深相等&#xff08;Deep Equality&#xff09;⭐ 自定义深相等函数⭐ 使用第三方库⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接…

电路原理图字母缩写表示什么?

很多小白问&#xff0c;电路原理图上这些字母缩写都是些啥玩意儿啊&#xff1f; &#xff08;一&#xff09;EN :Enable&#xff0c;使能&#xff0c;使芯片能够工作。要用的时候&#xff0c;就打开 en 脚&#xff0c;不用的时候就关闭。有些芯片是高使能&#xff0c;有些是低…

SQLSERVER 数据库恢复挂起的解决办法

USE master GO ALTER DATABASE KH_Curve SET SINGLE_USER GO ALTER DATABASE KH_Curve SET EMERGENCY GO DBCC CHECKDB(KH_Curve,REPAIR_ALLOW_DATA_LOSS) go ALTER DATABASE KH_Curve SET ONLINE GO ALTER DATABASE KH_Curve SET MULTI_USER GO