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

news2024/10/7 18:31:22

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

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

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

相关文章

面向对象编程的艺术:构建高效可扩展的软件

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

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

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

除了定位导航,北斗卫星还能授时?

众所周知&#xff0c;我们可以通过钟表、手机、电脑、广播以及新闻联播等方式来获取时间信息&#xff08;北京时间&#xff09;&#xff0c;那大家有没有想过&#xff0c;这些时间信息又是从哪里来的呢&#xff1f;为啥我们随时随地都能获取准确的时间信息呢&#xff1f;今天咱…

centos上安装并持久化配置LVS

1 实验背景 1&#xff09;系统版本&#xff1a;centos7.8 2&#xff09;虚拟机&#xff1a;3个centos虚拟机&#xff0c;&#xff08;其中一个做Director Server,另外两个做Real Server) 3) LVS大致有NAT ,DR ,Tun这三种模式&#xff0c;这里搭建一个典型的DR模式的LVS Direc…

[二分查找]LeetCode1964:找出到每个位置为止最长的有效障碍赛跑路线

本文涉及的基础知识点 二分查找算法合集 作者推荐 动态规划LeetCode2552&#xff1a;优化了6版的1324模式 题目 你打算构建一些障碍赛跑路线。给你一个 下标从 0 开始 的整数数组 obstacles &#xff0c;数组长度为 n &#xff0c;其中 obstacles[i] 表示第 i 个障碍的高度…

nvidia安装出现7-zip crc error解决办法

解决办法&#xff1a;下载network版本&#xff0c;重新安装。&#xff08;选择自己需要的版本&#xff09; 网址&#xff1a;CUDA Toolkit 12.3 Update 1 Downloads | NVIDIA Developer 分析原因&#xff1a;local版本的安装包可能在下载过程中出现损坏。 本人尝试过全网说的…

PT读spef报PARA-006如何解决?

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 There are multiple causes that can trigger PARA-006 errors. Here is a checklist. 1) SPEF reading order Functionally, the parasitic files can be read in any order. For best stitching…

许战海战略文库|重回大众视野的健力宝如何重生

摘要&#xff1a;销售额连续7年没有增长;产业主品牌定位不清晰;产品不协同缺少产品战略;子品牌无法形成合力新产品共性不足;过度差异化缺少渠道战略;被渠道能力更强的品牌挤压。火遍世界的“东方魔水”从第一品牌到被人遗忘&#xff0c;健力宝该如何重生? 健力宝诞生于1984年&…

Flutter学习(七)GetX offAllNamed使用的问题

背景 使用GetX开发应用的时候&#xff0c;也可能有人调用过offAllNamed&#xff0c;会发现所有controller的都被销毁了 环境 win10 getx 4.6.5 as 4 现象 从A页面&#xff0c;跳转到B页面&#xff0c;然后调用offAllNamed进行回到A页面&#xff0c;观察controller声明周期…

企业如何进行数据资产化?

首先我们要了解什么是数据资产 关于数据资产的定义&#xff0c;最开始是有一些的。比如在国民经济核算领域&#xff0c;认为资产是根据所有权原则界定的经济资产&#xff0c;即资产必须为某个或某些经济单位所拥有&#xff0c;其所有者因持有或使用它们而获得经济利益。更多强调…

WordPress采集器自动采集发布的工具

WordPress作为最受欢迎的内容管理系统之一&#xff0c;其强大的功能和灵活性使其成为许多网站、博客和电子商务平台的首选。WordPress采集器自动采集发布内置采集规则是一项备受关注的功能&#xff0c;让用户可以轻松收集并发布内容。WordPress采集器自动采集发布内置采集规则的…

3.3 路由器的远程配置

实验3.3 路由器的远程配置 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施&#xff08;一&#xff09;、配置通过Telnet登录系统1.RA的基本配置2.RB的基本配置3.在RA上配置Telnet用户登录界面 &#xff08;二&#xff09;、配置通过STelnet登录系统1.RA的基本配…

让SaaS盈利的两个驱动力

内容来自演讲&#xff1a;张星亮 | 六度人和&#xff08;EC&#xff09;| 创始人兼CEO 摘要 文章主要介绍了 SaaS 行业的发展趋势和盈利的两个驱动力&#xff1a;分工和AI。 首先&#xff0c;分工是提高效率和降低成本的关键。文章提到了 SaaS 行业正在从一体化向组合型销售…

用通俗的方法讲解:大模型微调训练详细说明(附理论+实践代码)

本文内容如下 介绍了大模型训练的微调方法&#xff0c;包括prompt tuning、prefix tuning、LoRA、p-tuning和AdaLoRA等。 介绍了使用deepspeed和LoRA进行大模型训练的相关代码。 给出了petals的介绍&#xff0c;它可以将模型划分为多个块&#xff0c;每个用户的机器负责其中一…

基于SpringBoot校园周边美食探索及分享平台的设计与实现

摘要&#xff1a; 美食一直是与人们日常生活息息相关的产业。传统的电话订餐或者到店消费已经不能适应市场发展的需求。随着网络的迅速崛起&#xff0c;互联网日益成为提供信息的最佳俱渠道和逐步走向传统的流通领域&#xff0c;传统的美食业进而也面临着巨大的挑战&#xff0c…

Todesk 无法登录,无法联网

前言 我习惯用todesk远程ubuntu&#xff0c;但是突然发现掉线了&#xff0c;但是ssh还能连接 问题查找 1.ping 一下主机ip 2.ssh连接后&#xff0c;ping 一下百度&#xff0c;查看是否外网正常 3.输入一下命令 ps -ef | grep todesk #查看todesk 进程 sudo kill -9 ....…

红队攻防实战之某商城Getshell

此后如竟没有炬火&#xff0c;我便是唯一的光 信息收集 端口扫描 nmap -T4 -A -p 1-65535 可以看到目标系统开放22、80、888、3306、8800端口 敏感文件扫描 http:///admin/login.html 后台登陆地址泄露 漏洞挖掘 phpinfo信息泄露 phpinfo信息泄露&#xff0c;此站为Linu…

Linux环境下ARM开发

目录 前言ARM启动及开发基础1.Cortex-A架构2.启动方式3.汇编基础4.Makefile语法基础5.Makefile补充6.编译下载 结语 前言 主要介绍基于linux开发环境下&#xff0c;如何开发ARM A7 ARM启动及开发基础 1.Cortex-A架构 1&#xff09;Cortex-A7运行模式 模式说明User(USR)用户模…

element中el-input限制只输入正整数或保留两位小数

文章目录 一、前言二、实现2.1、HTML2.2、只输入正整数2.3、只能输入数字或小数点 三、最后 一、前言 常见的el-input可能会限制用户只能输入正整数或保留两位小数&#xff0c;达到输入金额的需求&#xff0c;点击【跳转】访问el-input的官方文档 element-ui是有el-input-numb…

Git的介绍和下载安装

Git的介绍和下载安装 概述 Git是一个分布式版本控制工具, 通常用来管理项目中的源代码文件(Java类、xml文件、html页面等)进行管理,在软件开发过程中被广泛使用 Git可以记录文件修改的历史记录并形成备份从而实现代码回溯, 版本切换, 多人协作, 远程备份的功能Git具有廉价的…