CGAL的四叉树、八叉树、正交树

        四叉树(Quadtree):四叉树是一种用于二维空间分割的数据结构。它将一个二维区域划分为四个象限,每个象限进一步细分为四个小块,以此类推。四叉树可以用于空间索引、图形学、地理信息系统(GIS)等领域。

        八叉树(Octree):八叉树是四叉树的扩展,用于三维空间分割。它将一个三维区域划分为八个象限,每个象限进一步细分为八个小的三维体,以此类推。八叉树广泛应用于计算机图形学、虚拟现实、空间索引和机器学习等领域。

        正交树(Orthtree):正交树是一种用于二维或三维空间分割的数据结构,其特点是每个节点代表一个正交区域,即各边相互垂直。正交树的分割方式使得它对于某些特定的几何形状(如矩形或立方体)特别有效。正交树在计算机图形学、空间索引和科学计算等领域有应用。

1、介绍

        四叉树是一种树形数据结构,其中每个节点都包含一个方形空间,每个内部节点都有四个孩子。八叉树是一种类似的3D数据结构,其中每个节点都包含一个立方体空间,每个内部节点都有八个孩子。

        我们将这种数据结构的泛化称为“正交树”,因为正交体是四分体和八分体的泛化。在文献中也可以找到“超八分树”一词,用于命名4维及更高维度的此类数据结构。

        此软件包提供了一个通用的数据结构 Orthtree 以及 Quadtree 和 Octree 的别名。这些树可以用自定义点范围和分割谓词构造,并使用各种遍历方法迭代。下图是从点云构造八叉树。

2、构造

        使用一组点创建正交树。这些点不会被复制:直接使用提供的点范围,并由正交树重新排列。在创建正交树后更改点范围可能会使其处于无效状态。构造函数返回一个包含所有点的单个(根)节点的树。

        必须调用 refine() 方法来进一步细分空间。此方法使用一个 split 谓词,该谓词以节点为输入,如果该节点应该被分割,则返回 true,否则返回 false:这使得用户可以选择正交树应该细分的标准。提供了预定义的谓词,如 Maximum_depth 或 Maximum_number_of_inliers。

        创建正交树最简单的方法是使用点向量。构造函数通常需要单独的点范围和映射,但如果未提供点映射,则默认使用Identity_property_map。

        分裂谓词是一个用户定义的函子,用于确定节点是否需要分裂。如果现有谓词不符合用户需求,可以很容易地定义自定义谓词。

2.1、构建四叉树

        Orthtree 类可以用 Orthtree_traits_2 进行模板化,从而表现为四叉树。为方便起见,提供了别名 Quadtree。

        以下示例显示了如何从 Point_2 对象的向量创建四叉树对象并对其进行细化,这意味着使用最大深度 10 和每个节点的最大内含线数(桶大小)5 来构造树的空间细分本身。一旦违反其中一个条件,细化就会停止:如果节点的内含线数大于桶大小,但已经达到最大深度,则不会进行分割。同样,深度小于最大深度但内含线数小于桶大小的节点也不会进行分割。

  Quadtree quadtree(points_2d);
  quadtree.refine(10, 5);

2.2、构建八叉树

        Orthtree 类可以用 Orthtree_traits_3 模板化,从而表现为八叉树。为方便起见,提供了别名 Octree。

        以下示例显示了如何从 Point_3 对象的向量创建八叉树。

  // Create an octree from the points
  Octree octree(points);
  // Build the octree
  octree.refine(10, 20);

3、遍历

        为了简单起见,用户手册的其余部分将仅使用八叉树,但所有呈现的功能也适用于四叉树和更高维的正交树。遍历是在树的节点之间导航的行为。 Orthtree 和 Node 类为遍历树提供了许多不同的解决方案。

3.1、手动遍历

        因为我们的正则树是一种连接的无环无向图,所以可以在任意两个节点之间导航。这在实践中意味着,给定树上的一个节点,可以使用正确的操作集访问任何其他节点。Node类提供了一些函数,使用户能够访问它的每个子节点以及它的父节点(如果存在的话)。

        从根节点开始,可以使用下标运算CGAL::Orthtree::Node::operator[]()访问子节点。对于八叉树,0-7的值可以访问不同的子节点。

        对于非根节点,可以使用 parent() 访问器访问父节点。

  std::cout << "the root node: " << std::endl;
  std::cout << octree.root() << std::endl;
  std::cout << "the first child of the root node: " << std::endl;
  std::cout << octree.root()[0] << std::endl;
  std::cout << "the fifth child: " << std::endl;
  std::cout << octree.root()[4] << std::endl;
  std::cout << "the fifth child, accessed without the root keyword: " << std::endl;
  std::cout << octree[4] << std::endl;
  std::cout << "the second child of the fourth child: " << std::endl;
  std::cout << octree.root()[4][1] << std::endl;
  std::cout << "the second child of the fourth child, accessed without the root keyword: " << std::endl;
  std::cout << octree[4][1] << std::endl;
  std::cout << std::endl;

3.2、前序遍历

        能够以特定的顺序遍历树的节点通常很有用。例如,流运算符<<使用遍历来打印出每个节点。提供了几种遍历,其中包括Preorder_traversal和Postorder_traversal。以预序遍历树是立即访问每个父节点,然后访问其子节点,而在后序中,首先访问子节点。

  Octree octree(points, points.point_map());
  octree.refine();
  for (Octree::Node node : octree.traverse<Preorder_traversal>()) {
    std::cout << node << std::endl;
  }

3.3、自定义遍历

        用户可以通过创建 OrthtreeTraversal 概念的模型来定义自己的遍历方法。

3.4、图解

        显示了根据所使用的遍历方法访问节点的顺序。

        四叉树以图形形式显示。每个节点都根据遍历访问的顺序进行标记。使用叶子和级别遍历时,四叉树仅被部分遍历。 

4、任务加速

        一旦构建了正交树,它的结构就可以用来加速不同的任务。

4.1、寻找点的最近邻

        找到一个点的最近邻的朴素方法需要找到到每个其他点的距离。正交树可以在更短的时间内完成相同的任务。对于大量的点,这可能是一个足够大的差异,超过了构建树所花费的时间。

        请注意,kd-tree在这个任务上预计会优于orthtree,除非需要orthtree特有的功能,否则应该首选kd-tree。

4.2、分级

        如果每对叶子之间相邻两片叶子之间的深度差最多为1,则正树是分级的。

        使用 grade 方法消除 orthtree 中深度的大幅跳跃。

        一棵树的创建方式是,一个节点的分裂次数比它相邻的节点多得多。 grade() 拆分八叉树的节点,使相邻节点的深度差不超过 1。在分级前后打印树,以便可以看到差异。

5、性能

5.1、构建性能

        树构建基准是通过随机生成一组点来完成的,然后对创建包含这些点的完全精炼树的过程进行计时。由于其简单性,八叉树可以比kd树更快地构建。

5.2、查找最近邻的性能

        正交树节点是均匀的,因此正交树往往比等效的kd树具有更深的层次结构。因此,正交树在最近邻搜索方面的性能通常较差。两种最近邻算法的理论复杂度均为O(log(n)),但正交树通常可以预期具有更高的系数。

        这两棵树之间的性能差异很大,但与涉及将每个点与搜索点进行比较的朴素方法的线性复杂度相比,这两种算法都非常有利。

        使用正交树进行最近邻计算而不是kd树,可以在需要很少查询时(因为构造更快)或正交树也需要其他用途时进行证明。 

         对于大数量级的点计数,朴素方法的计算时间远远超过正交树或kd树的计算时间。

CGAL 5.6 - Quadtrees, Octrees, and Orthtrees: User Manual

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp uview u-input在app(运行在安卓基座上)上不能动态控制type类型(显隐密码)

开发密码显隐功能时&#xff0c;在浏览器h5上功能是没问题的 <view class"login-item-input"><u-input:type"showPassWord ? password : text"style"background: #ecf0f8"placeholder"请输入密码"border"surround&quo…

MySQL- CRUD-单表查询

一、INSERT 添加 公式 INSERT INTO table_name [(column [, column...])] VALUES (value [, value...]); 示例&#xff1a; CREATE TABLE goods (id INT ,good_name VARCHAR(10),price DOUBLE ); #添加数据 INSERT INTO goods (id,good_name,price ) VALUES (20,华为手机,…

使用autodl服务器,两个3090显卡上运行, Yi-34B-Chat-int4模型,并使用vllm优化加速,显存占用42G,速度23 words/s

1&#xff0c;演示视频地址 https://www.bilibili.com/video/BV1Hu4y1L7BH/ 使用autodl服务器&#xff0c;两个3090显卡上运行&#xff0c; Yi-34B-Chat-int4模型&#xff0c;用vllm优化&#xff0c;增加 --num-gpu 2&#xff0c;速度23 words/s 2&#xff0c;使用3090显卡 和…

(11_29)畅捷通的 Serverless 探索实践之路

作者&#xff1a;计缘 畅捷通介绍 畅捷通是中国领先的小微企业财税及业务云服务提供商&#xff0c;成立于2010年。畅捷通在2021年中国小微企业云财税市场份额排名第一&#xff0c;在产品前瞻性及行业全覆盖方面领跑市场&#xff0c;位居中国小微企业云财税厂商矩阵领军象限前…

算法通关村第十四关-青铜挑战认识堆

大家好我是苏麟 , 今天带大家认识认识堆 . 堆 堆是将一组数据按照完全二叉树的存储顺序&#xff0c;将数据存储在一个一维数组中的结构。 堆有两种结构&#xff0c;一种称为大顶堆&#xff0c;一种称为小顶堆 : 大顶堆 大顶堆的任何一个父节点的值&#xff0c;都大于或等于…

道可云会展元宇宙平台全新升级,打造3D沉浸式展会新模式

随着VR虚拟现实、人工智能、虚拟数字人等元宇宙技术的快速发展&#xff0c;各个行业正试图通过元宇宙技术寻求新的发展突破口&#xff0c;会展行业也不例外。会展作为经贸领域的重要产业形态&#xff0c;越来越多的企业和组织开始寻求通过元宇宙技术为展会赋能&#xff0c;以满…

【MySQL】视图 + 用户管理

视图 前言正式开始视图用户管理user表创建新用户修改用户密码权限管理给用户赋权剥夺权限 前言 本篇所讲的视图和我上一篇事务中所讲的读视图不是一个东西&#xff0c;二者没有任何关系&#xff0c;如果看过我前一篇博客的同学不要搞混了。 其实视图和用户管理本来是想着分开…

集简云语聚AI新增模型测试,支持多模型同时进行交互,快速评估不同模型性能

语聚AI模型测试 在ChatGPT爆火的推动下&#xff0c;由生成式 AI 掀起的全球人工智能新浪潮就此拉开了序幕&#xff0c;人工智能也成为越来越多企业提升业务效率、优化业务流程的首选方案。 然而&#xff0c;面对层出不穷的AI模型&#xff0c;每个模型在完善度、功能性、易用性…

php5构造无字母数字的webshell实现任意命令执行

目录 引言 如果是在php7 如果是在php5 现在我们来上传文件 最后的结果&#xff1a; 看本篇前可以先看这一篇&#xff1a;利用异或、取反、自增bypass_webshell_waf-CSDN博客 引言 上一篇介绍了如何构造出一个无字母数字的webshell&#xff0c;但是如果后端的代码变成了这…

MIT线性代数笔记-第20讲-克拉默法则,逆矩阵,体积

目录 20.克拉默法则&#xff0c;逆矩阵&#xff0c;体积求逆公式克拉默法则用行列式关联体积 打赏 20.克拉默法则&#xff0c;逆矩阵&#xff0c;体积 求逆公式 考虑二阶方阵&#xff0c;有 [ a b c d ] − 1 1 a d − b c [ d − b − c a ] \begin{bmatrix} a & b \\ …

若依项目前后端部署记录

前言 本文较乱&#xff0c;用于笔者记录项目部署过程&#xff0c;对于想学习若依项目部署的同学看文章可能会导致误导&#xff0c;建议读者多查资料&#xff0c;保持疑问并谨慎验证。 项目官方指导&#xff1a; 环境部署 | RuoYi 1、环境部署相关 JDK > 1.8 (推荐1.8版本…

堆排序算法

我们之前学了堆&#xff1a; 数据结构---堆-CSDN博客 数据结构&#xff1a;堆的实现-CSDN博客 我们知道堆有小堆和大堆之分&#xff0c;根节点不是最小就是最大的&#xff0c;我们可以利用这个特点实现堆排序 思路&#xff1a; 为什么我们要选择堆排序呢 它的效率相比于冒泡…

【Java】浅析FutureTask的核心方法get

前言 在进行多线程编程时&#xff0c;我们离不开两个重要的任务接口&#xff1a;Runnable、Callable。一个线程想要运行&#xff0c;首先它得知道它的任务是什么&#xff08;它要做什么&#xff09;&#xff0c;而这两个接口恰好是用于表示一个线程需要执行的任务。 Runnable和…

Vmware安装Centos7

CentOs7镜像文件下载 centos7 镜像文件下载-CSDN博客 配置虚拟机 打开Vmware&#xff0c;点击新建虚拟机 典型安装与自定义安装 典型安装&#xff1a;VMware会将主流的配置应用在虚拟机的操作系统上&#xff0c;对于新手来很友好。 自定义安装&#xff1a;自定义安装可以针…

【Python表白系列】如何实现爱心光波的表白效果(完整代码)

文章目录 爱心光波环境需求完整代码详细分析系列文章爱心光波 环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)【注】 python环境搭建请见:https://w…

如何下载IEEE出版社的Journal/Conference/Magazine的LaTeX/Word模板

当你准备撰写一篇学术论文或会议论文时&#xff0c;使用IEEE&#xff08;电气和电子工程师协会&#xff09;的LaTeX或Word模板是一种非常有效的方式&#xff0c;它可以帮助你确保你的文稿符合IEEE出版的要求。无论你是一名研究生生或一名资深学者&#xff0c;本教程将向你介绍如…

【C/PTA —— 13.指针2(课内实践)】

C/PTA —— 13.指针2&#xff08;课内实践&#xff09; 一.函数题6-1使用函数实现字符串部分复制6-2 拆分实数的整数部分和小数部分6-3 存在感 二.编程题7-1 单词反转 一.函数题 6-1使用函数实现字符串部分复制 void strmcpy(char* t, int m, char* s) {int len 0;char* ret …

Python过滤掉特定区域内的矩形框

Python过滤掉特定区域内的矩形框 前言前提条件相关介绍实验环境过滤掉特定区域内的矩形框方法一&#xff1a;直接法&#xff08;for循环遍历&#xff09;代码实现输出结果 方法二&#xff1a;列表推导式代码实现输出结果 前言 由于本人水平有限&#xff0c;难免出现错漏&#x…

Vue2+echarts 实现图表的简单绘制

Echarts是一个基于JavaScript的开源可视化库&#xff0c;由百度开发和维护。它通过简单的配置方式&#xff0c;就可以实现各种复杂的数据可视化和图表展示。Echarts支持多种图表类型&#xff0c;包括柱状图、折线图、饼图、散点图、漏斗图等&#xff0c;同时还支持地图可视化和…

zabbix6.4.0配置邮件及企微机器人群聊告警

一、邮件告警 根据公司邮箱自行配置&#xff0c;电子邮件、用户账号密码填自己的邮箱账号密码 动作本次使用的默认的&#xff0c;如果为了更加美观可自行修改。 二、企业微信机器人告警 首先在企微上创建群聊&#xff0c;之后添加群聊机器人 将地址复制&#xff0c;后面用 …