四叉树算法

四叉树算法title 四叉树算法 date 2016 1 1115 10categories IOStags 算法小小程序猿我的博客 http daycoding com 转载 http blog csdn net zhanxinhang article details 高德 iOS 聚合实例高德 Android 聚合实例四叉树或四元树也被称为 Q 树 Q T

tags: 算法

转载:http://blog.csdn.net/zhanxinhang/article/details/

高德iOS聚合实例

高德Android聚合实例

四叉树或四元树也被称为Q树(Q-Tree)。四叉树广泛应用于图像处理、空间数据索引、2D中的快速碰撞检测、存储稀疏数据等,而八叉树(Octree)主要应用于3D图形处理。对游戏编程,这会很有用。本文着重于对四叉树与八叉树的原理与结构的介绍,帮助您在脑海中建立四叉树与八叉树的基本思想。本文并不对这两种数据结构同时进行详解,而只对四叉树进行详解,因为八叉树的建立可由四叉树的建立推得。

四叉树算法

四叉树算法

/* 一个矩形区域的象限划分:: UL(1) | UR(0) ----------|----------- LL(2) | LR(3) 以下对该象限类型的枚举 */ typedef enum { UR = 0, UL = 1, LL = 2, LR = 3 }QuadrantEnum; /* 矩形结构 */ typedef struct quadrect_t { double left, top, right, bottom; }quadrect_t; /* 四叉树节点类型结构 */ typedef struct quadnode_t { quadrect_t rect; //节点所代表的矩形区域 list_t *lst_object; //节点数据, 节点类型一般为链表,可存储多个对象 struct quadnode_t *sub[4]; //指向节点的四个孩子 }quadnode_t; /* 四叉树类型结构 */ typedef struct quadtree_t { quadnode_t *root; int depth; // 四叉树的深度 }quadtree_t; 

四叉树的建立

利用四叉树分网格,如本文的第一张图
<四层完全四叉树结构示意图>
,根据左图的网格图形建立如右图所示的完全四叉树。

伪码:

Funtion QuadTreeBuild ( depth, rect ) { QuadTree->depth = depth; /*创建分支,root树的根,depth深度,rect根节点代表的矩形区域*/ QuadCreateBranch ( root, depth, rect ); } Funtion QuadCreateBranch ( n, depth,rect ) { if ( depth!=0 ) { n = new node; //开辟新节点 n ->rect = rect; //将该节点所代表的矩形区域存储到该节点中 将rect划成四份 rect[UR], rect[UL], rect[LL], rect[LR]; /*创建各孩子分支*/ QuadCreateBranch ( n->sub[UR], depth-1, rect [UR] ); QuadCreateBranch ( n->sub[UL], depth-1, rect [UL] ); QuadCreateBranch ( n->sub[LL], depth-1, rect [LL] ); QuadCreateBranch ( n->sub[LR], depth-1, rect [LR] ); } } 

假设在一个矩形区域里有N个对象,如下左图一个黑点代表一个对象,每个对象的坐标位置都是已知的,用四叉树的一个节点存储一个对象,构建成如下右图所示的四叉树。

四叉树算法

Funtion QuadtreeBuild() { Quadtree = {empty}; For (i = 1;i 
  

用四叉树查找某一对象

1、采用盲目搜索,与二叉树的递归遍历类似,可采用后序遍历或前序遍历或中序遍历对其进行搜索某一对象,时间复杂度为O(n)。

2、根据对象在区域里的位置来搜索,采用分而治之思想,时间复杂度只与四叉树的深度有关。比起盲目搜索,这种搜索在区域里的对象越多时效果越明显

四叉树算法

Funtion find ( n, pos, ) { If (n节点所存的对象位置为 pos所指的位置 ) Return n; If ( pos位于第一象限 ) temp = find ( n->sub[UR], pos ); else if ( pos位于第二象限) temp = find ( n->sub[UL], pos ); else if ( pos位于第三象限 ) temp = find ( n->sub[LL], pos ); else //pos 位于第四象限 temp = find ( n->sub[LR], pos ); return temp; } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226218.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午7:35
下一篇 2026年3月17日 上午7:35


相关推荐

  • Ubuntu远程桌面修改

    Ubuntu远程桌面修改Ubuntu 远程桌面修改问题解决办法之一 ubuntu 中的远程桌面组成那么如何切换呢 问题 xfce 属于轻量级的远程桌面 但是在使用的过程中 一段时间未使用后 之前在里面启动的进程都被杀了 而我之前在这台机器上部署了一个私有 pub 服务来满足公司里的 flutterpub 库的拉取 以前一直很正常 现在非常不稳定 解决办法之一切换回原来的 ubuntu 桌面 防止多个远程桌面 session 的存在 u

    2025年11月11日
    4
  • vwmare 15“无权输入许可证密钥…”与出现新问题hadoop集群无法启动

    vwmare 15“无权输入许可证密钥…”与出现新问题hadoop集群无法启动1 您无权输入许可证密钥 请使用系统管理员帐户重试 问题与解决方法 2 导入 Hadoop 文件后 hadoop 集群无法成功启动问题与解决方法

    2026年2月3日
    12
  • 国产AI大模型的“五虎上将”:2025年中全方位深度对比报告

    国产AI大模型的“五虎上将”:2025年中全方位深度对比报告

    2026年3月15日
    5
  • leetcode-7整数反转「建议收藏」

    leetcode-7整数反转「建议收藏」原题链接给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。示例 1:输入:x = 123输出:321示例 2:输入:x = -123输出:-321示例 3:输入:x = 120输出:21示例 4:输入:x = 0输出:0class Solution {public: int rever

    2022年8月8日
    7
  • SFM原理简介「建议收藏」

    SFM原理简介「建议收藏」StructureFromMotionSFM简介通过相机的移动来确定目标的空间和几何关系,是三维重建的一种常见方法。它与Kinect这种3D摄像头最大的不同在于,它只需要普通的RGB摄像头即可,因此成本更低廉,且受环境约束较小,在室内和室外均能使用。SFM基本原理小孔相机模型在计算机视觉中,最常用的相机模型就是小孔成像模型,它将相机的透镜组简化为一个小孔…

    2022年6月20日
    32
  • 使用httpclient实现http接口调用实例[通俗易懂]

    使用httpclient实现http接口调用实例[通俗易懂]使用httpclient实现http接口调用实例假设服务接口如下:接口地址:http://192.168.0.1/service/sendsms请求方式:post需要传递参数:c={“uid”:”10000″,”title”:”testatitle”,”content”:”thisisatest”}参数内容为json格式输出:{result:0,cod

    2022年5月24日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号