数据结构——四叉树

2023-10-29

四叉树(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;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构——四叉树 的相关文章

  • Java中ArrayList的交集和并集

    有什么方法可以做到这一点吗 我正在寻找 但没有找到 另一个问题 我需要这些方法 以便我可以过滤文件 有些是AND过滤器 有些是OR过滤器 就像集合论中的那样 所以我需要根据所有文件和保存这些文件的联合 相交 ArrayList 进行过滤 我
  • 如何将本机库链接到 IntelliJ 中的 jar?

    我正在尝试在 IntelliJ 中设置 OpenCV 但是我一直在弄清楚如何告诉 IntelliJ 在哪里可以找到本机库位置 在 Eclipse 中 添加 jar 后 您可以在 Build Config 屏幕中设置 Native 库的位置
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • 如何在 Spring 中禁用使用 @Component 注释创建 bean?

    我的项目中有一些用于重构逻辑的通用接口 它看起来大约是这样的 public interface RefactorAwareEntryPoint default boolean doRefactor if EventLogService wa
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db

随机推荐

  • SVN下载、安装、配置及使用方法

    文章目录 SVN是什么 相关概念 为什么需要SVN SVN的特点 TortoiseSVN VisualSVN Subversion 以及 VisualSVN Server的区别 为什么不直接使用Subversion SVN下载 SVN服务端
  • 策略模式与外观模式

    1 策略 定义不同的算法族 并且之间可以互相替换 让算法的变化独立于使用算法的客户 以动态的改变对象的行为 2 例子 随机生成宠物 并统计各种宠物生成数量 a 抽象类 PetCreator 用于随机生成宠物 package context
  • 【毕设中期报告总结】MMGEN-FaceStylor的环境配置总结

    MMGEN FaceStylor的环境配置总结 0 引言 1 Python环境配置 2 安装步骤 2 1 创建虚拟环境 2 2 安装MMCV和MMGEN 2 3 克隆存储库并准备数据和权重 3 Play with MMGEN FaceSty
  • 【Keil编译问题】RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT

    Keil编译问题 RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT Keil编译信息提示内容 然而在Keil软件file菜单 license manage许可菜单里面查看信息 又是注册成功
  • automount和autofs

    参考 http hi baidu com dfjlaicqjlbafnd item 6db9af719cc2fe5f0d0a07ac 摘要 automount 和 autofs是易于使用的文件系统管理工具 功能强大 它允许同一台机器上的所有
  • Buck电路的原理及器件选型指南

    Buck电路工作原理 电源闭合时电压会快速增加 当断开时电压会快速减小 如果开关速度足够快的话 是不是就能把负载 控制在想要的电压值以内呢 假设12V降压到5V 也就意味着 MOS管开关需要42 时间导通 58 时间断开 当42 时间MOS
  • 华为机试题(一) 最高分是多少

    老师想知道从某某同学当中 分数最高的是多少 现在请你编程模拟老师的询问 当然 老师有时候需要更新某位同学的成绩 输入描述 输入包括多组测试数据 每组输入第一行是两个正整数N和M 0 lt N lt 30000 0 lt M lt 5000
  • win11怎么更新22H2?不要错过这两个Win11升级22H2的好方法!

    Win11年度大版本更新22H2已经推送 心里是否有些蠢蠢欲动 Windows11系统的22H2版本是微软将大规模更新的系统版本 因此它将对计算机硬件设施有一定的要求 下面小编将为您带来两个个Win11升级22H2的好方法 快来学习一下Wi
  • 在jsp页面的url链接传递中文参数的乱码问题

    已知项目中配置如下 strust2里面 在web xml文件配置了如下
  • 从 Java 到 Go:云服务接口开发详解(AWS、GCP、Azure)

    目录 一 Go 与 Java 简要对比 二 使用 Go 语言开发 AWS 云服务接口 三 使用 Go 语言开发 GCP 云服务接口 lt
  • 在Windows上安装Python

    Windows安装Python 在这篇在Windows上安装Python的文章中 我们将了解在Windows上设置和安装Python是多么容易 它包括几个简单的步骤 让您快速开始使用适用于Windows的Python Python简介 Py
  • 进程间通讯方式以及各个方式的优缺点

    进程间通讯方式以及各个方式的优缺点 进程通信的含义 进程是转入内存并准备执行的程序 每个程序都有私有的虚拟地址空间 由代码 数据以及它可利用的系统资源 如文件 管道 组成 多进程 多线程是windows操作系统的一个基本特征 Linux系统
  • getInstance()方法的作用

    getInstance 方法的作用 getInstance 指实例化 与new类似 但是于new又有很大的区别 实例化 public static DBConnect instance public static DBConnect get
  • 服务器中单个文件夹无法打开,无法在服务器端打开文件

    您将需要一个 App Data 文件夹 该文件夹定义为 IIS 中的虚拟文件夹 或者您的网站项目中名为 App Data 的文件夹 如 表示转到网站的根目录 如果您在 Windows 中查找用户配置文件中存在的 App Data 文件夹 那
  • Day31——单个拦截器中三个方法的执行顺序以及时机

    一 回顾 前面拦截器简介用实现HandlerInterceptor接口实现了自定义拦截器 可以知道它有三个需要实现的方法 分别是preHandle postHandle afterCompletion 二 知识储备 2 1 单个拦截器中三个
  • 从Qt简单的例子理解析构

    看下面一段代码 MainWindow MainWindow QWidget parent QMainWindow parent ui new Ui MainWindow ui gt setupUi this MainWindow MainW
  • Nacos注册中心14-raft协议选举与心跳

    0 环境 nacos版本 1 4 1 Spring Cloud 2020 0 2 Spring Boot 2 4 4 Spring Cloud alibaba 2 2 5 RELEASE 测试代码 github com hsfxuebao
  • 使用克拉默法则进行三点定圆(二维)

    目录 1 二维圆 2 python代码 3 计算结果 本文由CSDN点云侠原创 爬虫网站请自重 1 二维圆 已知不共线的三个点 设其坐标为 x 1 y 1
  • JSTL 1.2 - The absolute uri: http://java.sun.com/jstl/core cannot be resolved

    序 上周五 公司临时决定把一个老项目要部署到外边 事前我也没有接到通知 下午要下班的时候 突然跟我说要部署项目 而且那边很着急用 没办法 只能加班等待部署完成了 背景 简单的说一下项目的背景 之所以说是老项目 是因为这个项目是从别的公司接过
  • 数据结构——四叉树

    四叉树 Quadtree 是一种用于表示和管理二维空间的树状数据结构 它将二维空间递归地分割成四个象限 每个象限可以继续分割 以实现对空间的更精细的划分 四叉树通常用于解决空间搜索和查询问题 例如碰撞检测 图像压缩 地理信息系统等领域 特别