C#几何算法:空间索引——Quadtree四叉树及应用(一)

这篇具有很好参考价值的文章主要介绍了C#几何算法:空间索引——Quadtree四叉树及应用(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

什么是四叉树?

四叉树的原理

结语


前言

        最近在CAD中开发拓扑检查和空间分析功能时发现,传统的双层递归法会极大的降低程序运行速度,就比如:图上有1000个图形,我们要求图形之间的交点,传统的作法就是遍历两次图形,在两次循环中分别对图形求交处理,对于图形较少的情况,传统的双层递归法也不会太多的影响程序的效率,但是如果图上有10000个图形,或者更多图形呢?按照传统的双层递归法来运算显然是不太可能的,可能会直接导致CAD无响应,大幅度影响计算效率。为了解决这个问题,针对大量图形进行空间运算的时候就必须用到空间索引了。

        我们用过GIS软件的小伙伴就能感受到GIS的空间分析功能远比CAD强大,最直观的就是GIS软件的运算速度,很多小伙伴就很好奇为什么它会这么快,正是因为所有的GIS软件都使用了空间索引,常见的空间索引有很多,比较成熟的有:Rtree、Kdtree、Quadtree等,我们今天要讲的就是Quadtree,中文名称叫:四叉树。

什么是四叉树?

        本文中使用的编程语言为C#,C#为面向对象语言,我们开始写代码之前一定得搞懂对象的定义,我们要写四叉树,首先得明白四叉树是什么,首先我们来看看四叉树的理论模型图(图片源自知乎):

四叉树,算法

        是不是看不太懂?没关系,笔者最开始也是看不懂这套模型图,相对于网上晦涩难懂的解释,对于大多数新手朋友来说都是不太友好的,笔者在此将会以自己的理解跟大家进行一个解读。

四叉树的原理

        首四叉树的原理就是将图形区域的最大矩形范围(根节点)不断向下四等分,矩形每划分一次就形成四个新的矩形范围(子节点直到满足设定条件为止就停止划分最终形成成无数个矩形区域,如下图:

        第一步,首先确定出目标区域的最大矩形范围(根节点):

四叉树,算法

         第二步,由最大矩形区域不断向下四等分,形成每一层的子节点

四叉树,算法

四叉树,算法

        笔者在这里一共划分了三次,每次划分形成了一层子节点(多个矩形区域),那么这个矩形区域划分出来到底有什么作用呢?

        矩形区域的作用就是将庞大的空间范围进行划分,四叉树检索图形其实就是检索矩形区域对应的图形,什么意思呢?如下图所示:

四叉树,算法

        从实例出发,如上图所示,图中一共有四个矩形,六个图形,那么矩形和图形是什么关系呢?

        首先我们要判断每个图形的外包矩形(上图中的青色部分)和四个矩形区域相交关系确定每个区域所包含的图形,上图的相交与包含关系图下:

相交关系:

  •         图形1外包矩形矩形一相交,所以矩形一包含图形1
  •         图形2外包矩形矩形一相交,所以矩形一包含图形2
  •         图形3外包矩形矩形一相交,所以矩形一包含图形3
  •         图形4外包矩形矩形一、矩形二、矩形三、矩形四相交,所以矩形一、矩形二、矩形三、矩形四同时包含图形4
  •         图形5外包矩形矩形四相交,所以矩形五包含图形5
  •         图形6外包矩形矩形三相交,所以矩形三包含图形6

包含关系:

  •         矩形一包含:图形1、图形2、图形3、图形4
  •         矩形二包含:图形4
  •         矩形三包含:图形4、图形6
  •         矩形四包含:图形4、图形5

        确定好相交与包含关系之后,我们就可以进行范围搜索了,还是以上图为例,我们以图形1的外包矩形进行搜索:

        首先判断图形1四个矩形区域的相交关系,得出图形1仅与矩形一相交 ,然后根据上一步的包含关系即可以拿到图形1所在区域所包含的所有图形:图形1图形2图形3图形4,通过这样的方式进行检索,我们的图形运算就可以按照区域进行,无需再全图双层递归对比了。

        四叉树的工作原理就是将指定的图形范围进行划分,每次划分判断图形外包矩形子节点的关系,从而形成一个位置关系树结构,后期直接通过给定的矩形范围逐节点进行判断指定的矩形范围属于哪个矩形分区,最后拿出对应矩形分区所对应的图形即可。

结语

        本章内容咱们先理解四叉树的原理,下一章我们再详细的教学如何用C#代码去编写一个四叉树并进行应用。如对本章内容有任何疑问可扫描下方二维码,联系作者微信。

 

        

 

 

 

     文章来源地址https://www.toymoban.com/news/detail-740729.html

到了这里,关于C#几何算法:空间索引——Quadtree四叉树及应用(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【树】从二叉树到空间索引树

    这里主要介绍满二叉树、完全二叉树、二叉搜索树、平衡二叉树、红黑树等。首先通过形象图来记录一下这几种二叉树之间的图形关系,随后再谈谈这些树的注意事项。 满二叉树 满二叉树是一个每层的结点数都达到最大值的二叉树,其定义和树型结构如下: 如果一个二叉树

    2023年04月09日
    浏览(33)
  • 数据结构——四叉树

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

    2024年02月07日
    浏览(46)
  • Unity四叉树地图

            当使用Unity构建大规模的游戏地图或场景时,使用四叉树数据结构可以提高性能和效率。四叉树是一种基于分割的数据结构,将空间划分为四个相等的子区域,并以递归方式构建树结构。在游戏开发中,四叉树常用于空间分区、碰撞检测和可视化剔除等方面。  

    2024年02月07日
    浏览(36)
  • 数据结构:二叉树及相关操作

    在实现二叉树前,我们要先对树产生一些基本的认识,才可以去实现它。树的用途非常广泛,向文件系统的目录树结构等。 树是一种 非线性的数据结构 ,它是由n(n=0)个有限结点组成一个具有层次关系的集合。 有一个特殊的结点,称为根结点,根节点没有前驱结点。 除根

    2024年02月11日
    浏览(46)
  • unity四叉树和视锥体剔除

    这个最好还是看代码,项目有注释放在这里: GetbadEarlyup/Quadtree-cone-scene: 这是一个unity四叉树场景视锥体剔除的Demo (github.com) https://github.com/GetbadEarlyup/Quadtree-cone-scene 国内地址: Quadtree-cone-scene: unity四叉树和视锥体剔除的一个示例项目 (gitee.com) https://gitee.com/dontgetupearly/Quadtre

    2024年02月08日
    浏览(37)
  • 【数据结构】树及二叉树的概念

    😛 作者:日出等日落 📘 专栏:数据结构 一次失败,只是证明我们成功的决心还够坚强。                                        ——博 维 目录  🎄树概念及结构: ✔树的概念: ✔树的相关概念 :​编辑  ✔树的表示: ✔树在实际中的运用: 🎄二叉树概念及结构 ✔概念

    2023年04月23日
    浏览(56)
  • DS:树及二叉树的相关概念

                                                     创作不易,兄弟们来波三连吧!!            树是一种非线性的数据结构,它是由n(n=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

    2024年03月13日
    浏览(68)
  • 四叉树图像模糊(C代码及实现思路)

    原创文章,参考文章见末尾,仅供学习交流使用,如果对你有帮助,请一键三连~ 代码如有需要会整理上传~ 能够正确的对图像建立四叉树; 对于输入的图像,四叉树能够输出模糊的结果 对颜色相近的区域进行模糊 背景知识理解 PPM文件格式理解 PPM 是通过RGB三种颜色显现的图

    2024年02月02日
    浏览(41)
  • cocos creator 四叉树碰撞系统Demo

    先挂上demo链接,目前测试的是2000个节点的碰撞 Cocos Creator | QuadTree (myqcloud.com) 检测的节点越多,优化效果越明显。 优化的原理大致就是将屏幕划分成一个个小区域,每个小区域保存着这个小区域的碰撞节点,只检测这个小区域里面的节点碰撞,不在同一区域内不进行检测,

    2023年04月11日
    浏览(44)
  • 链式二叉树及相关操作(前,中,后,层序遍历)

    欢迎来到 Claffic 的博客  💞💞💞 “春来无事,只为花忙。” 前言: 上一期给大家介绍了二叉树的一种顺序结构:堆,这一期承接上一期,给大家继续介绍二叉树的另一种结构:链式结构。 目录 🐽Part1:链式二叉树?  1.前情提要  2.创建一颗二叉树 🐷Part2:相关操作实现 1

    2023年04月16日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包