CGAL的空间排序

1、介绍

        许多在CGAL中实现的几何算法都是增量的,因此它们的速度取决于插入顺序。此软件包提供了排序算法,可以大大提高此类算法的运行时间。

        其基本原理是沿着空间填充曲线对对象进行排序,这样在插入顺序上,几何上接近的两个对象将很有可能接近。这样,在插入过程中将要查看的数据结构的一部分很可能已经在最近的插入中被查看过,因此很可能在缓存内存中而不是主内存中。作为另一个副作用,这些排序函数通常会提高增量算法产生的数据结构的内存局部性,有时会导致使用这些数据结构的其他算法的速度加快。

        一些算法在随机假设下具有很好的复杂性,这与使用任何排序标准对输入进行排序的想法相矛盾。在这种情况下,可以引入一点随机性,以结合良好的随机复杂性和良好的局部性效果。

        此包使用的谓词是坐标之间的比较,因此这里没有涉及鲁棒性问题,例如选择内核的算法。

2、希尔伯特排序

        在二维中,可以构造空间填充曲线,即从[0,1]到单位正方形[0,1]的映射f,使得f(0)=(0,0)和f(1)=(1,0),具体方式如下:将单位正方形细分为四个正方形,使得

         然后,每个方块以同样的方式递归细分。下图说明了这一过程。

 希尔伯特映射

        现在给定一组二维点,它们可以在这样的空间填充曲线上按顺序排列。请注意,在每一步中,我们都在正中间将一个正方形分割开;我们称之为中间策略。

         如果不像上面那样在中心以固定方式对正方形进行细分,而是在中点(在x或y方向交替)进行分割,我们构建了一个适应点集的二维树。该树可以以类似的方式进行访问,我们也可以得到点的适当排序;我们称之为中点策略。

         中间策略更容易分析,并且在点集在低维度中分布良好的情况下(如果点的数量真的大于2d)在实践中很有趣。对于高维度或点集分布不规律(或未知)的情况,应首选中位数策略。由于中位数策略不会比中间策略差很多,而相反的情况可能会发生,因此中位数策略是默认行为。大多数理论结果使用中间策略。

        CGAL为二维、三维和更高维度的点提供希尔伯特排序,采用中间和中位数策略。

        我们还考虑给定球上的空间填充曲线。该方法适用于单位球,通过仿射变换适用于任何球体。假设要排序的点靠近球体。

        实际上,我们在单位球上近似一个空间填充曲线,通过在立方体(面在x、y、z=±1/3–√处)上填充空间填充曲线。大致来说,我们将原始点集分成六个子集,对应于立方体的六个面。对应于面f的子集是位于由面f的支撑平面定义的一半空间内的点集,该平面不包含原点。

        然后,我们基本上在每个子集上使用2D希尔伯特排序及其相应的策略,就像上面解释的那样,将点的投影投射到立方体的相应面上。每个面上的轴方向选择使得空间填充曲线覆盖整个立方体而不会跳跃;参见图4。一个点可以位于多个这样的半平面中,因此我们为立方体的每个面赋予优先级。优先级顺序是:首先,立方体在x=1/3–√的面;其次,立方体在y=1/3–√的面;第三,立方体在x=−1/3–√的面;第四,立方体在z=1/3–√的面;第五,立方体在y=−1/3–√的面;第六,立方体在z=−1/3–√的面。

        如果点不靠近球体,它们仍然以相同的方式排序,但不能保证这样的顺序不再有效。

立方体每个面的二维希尔伯特排序

        根据上述描述在球体上排序的点如图所示。 

球上的Hilbert排序

3、空间排序

        在将随机算法输入之前,不能直接使用希尔伯特排序。因此,诀窍是将点集组织在大小递增的随机桶中,希尔伯特排序仅在桶内使用。

        在Delaunay三角剖分的背景下,已经证明这种顺序提供了足够的随机性,可以结合随机顺序和空间填充曲线顺序的优点。

        CGAL库提供二维、三维和更高维度的点空间排序,在桶中采用 Hilbert 排序的中间和中间值策略。

        空间排序特征类提供了点类型和函子,用于比较例如两个点的x坐标。如果你想对点以外的东西进行排序,例如包含一个点的元组序列,或者点向量中的索引序列,你需要另一个间接级别。CGAL提供了由另一个空间排序特征类模板化的空间排序特征类别适配器和属性映射。这允许从你想要排序的任何东西中获得一个点。

4、并行空间排序

        在二维(三维)中,希尔伯特或空间排序递归地将输入范围细分为四个(八个)子范围。因此,并行化排序算法的一个自然方法是将初始范围细分为四个(八个)子范围,并让单个线程处理给定子范围的任何进一步细分和排序。这种并行算法仅在使用中位数策略策略时可用(默认情况下是这样),因为该策略确保了所有子范围之间的平衡。对于中间策略,情况不一定如此,其中子范围大小可能差异很大。

        通过指定模板参数CGAL::Parallel_tag启用算法的并行版本。如果不确定TBB是否可用且已与CGAL链接,则可以使用CGAL::Parallel_if_available_tag。默认情况下,使用顺序版本。

5、其他

        空间排序可以降低,三角剖分的时间

        希尔伯特排序和空间排序是两种不同的概念,它们分别用于不同的应用场景,并且各自有不同的特性和目标。

        希尔伯特排序是一种排序算法,主要用于对数字进行排序。它利用了递减增量的策略,将序列划分为一个个小序列,每个小序列使用直接插入排序,完成后增量递减,每个小序列变大,继续进行直接插入排序,直到增量递减为1,进行最后的直接插入排序。希尔伯特排序的主要思想是利用直接插入排序的优点和消灭直接插入排序的缺点来进行排序。

        空间顺序是指在三维空间中,事物的位置排列和分布的方式。它是通过观察和感知事物在空间中的相对位置和关系而形成的。空间顺序不仅仅涉及物体的位置,还包括它们的大小、形状和颜色等属性。在建筑设计、城市规划、艺术创作等应用中,空间顺序是一个关键概念。它涉及到建筑物内部和外部空间的组织和布局,以及不同空间之间的联系和转换。通过合理的空间顺序设计,可以创造出舒适、高效的使用环境,提升建筑物的功能性和美学价值。

        因此,希尔伯特排序是一种算法,主要用于数字排序;而空间顺序是一个描述物体在空间中的位置和关系的概念,广泛应用于建筑设计、城市规划等领域。

        CGAL::hilbert_sort是CGAL库中的一个函数,用于对点集进行Hilbert排序。Hilbert排序是一种基于Hilbert曲线的方法,用于对二维平面上的点进行排序。

        CGAL::hilbert_sort_on_sphere是CGAL库中的一个函数,用于在球面上进行Hilbert排序。

        Hilbert排序是一种基于Hilbert曲线的方法,用于对球面上的点进行排序。球面上的点可以用它们的经度和纬度来表示。CGAL::hilbert_sort_on_sphere函数使用Hilbert曲线对球面上的点进行排序,使得在排序后的结果中,相邻的点在球面上具有尽可能大的角度差。

        使用CGAL::hilbert_sort_on_sphere函数的一般步骤如下:

  1. 创建一个球面上的点集,每个点由其经度和纬度表示。
  2. 调用CGAL::hilbert_sort_on_sphere函数,并将点集作为参数传递给它。
  3. 函数会对点集进行排序,并返回排序后的结果。

        通过使用CGAL::hilbert_sort_on_sphere函数,可以对球面上的点进行有效的排序,这在处理地理信息系统、地图绘制、空间索引等应用中非常有用。

        CGAL::hilbert_sort是一个用于对球面上的点进行排序的函数,它使用Hilbert曲线进行排序。关于中间策略和中点策略的区别,可以从以下几个方面进行比较:

  1. 定义:

    • 中间策略:在排序过程中,将元素分成两部分,中间元素作为基准,然后将其他元素与基准进行比较和交换。
    • 中点策略:在排序过程中,将元素分成两部分,中间位置(中位数)的元素作为基准,然后将其他元素与基准进行比较和交换。
  2. 算法复杂度:

    • 中间策略:由于需要选择一个中间元素作为基准,因此算法复杂度较高。
    • 中点策略:由于只需要找到中间位置的元素作为基准,算法复杂度较低。
  3. 稳定性:

    • 中间策略:不稳定,因为中间元素的选择可能会影响排序结果。
    • 中点策略:稳定,因为中位数是唯一确定的基准元素。
  4. 适用场景:

    • 中间策略:适用于快速排序、堆排序等基于比较的排序算法。
    • 中点策略:适用于快速选择、归并排序等基于比较和合并的排序算法。

        总结:中间策略和中点策略的区别主要在于选择基准元素的方式不同。中间策略选择一个中间元素作为基准,而中点策略选择中位数作为基准。在算法复杂度、稳定性和适用场景方面也存在差异。在实际应用中,可以根据具体需求选择适合的策略。

        CGAL::spatial_sort是CGAL库中的一个函数,用于对几何对象进行空间排序。该函数可以用于对点、线段、多边形等几何对象进行排序,以便在几何计算中按照特定的顺序处理这些对象。

        CGAL::spatial_sort函数基于四叉树数据结构,它可以在高维空间中高效地进行排序。通过将空间划分为四个象限,然后递归地对每个象限进行排序,该函数能够快速地确定对象的相对位置关系。

        CGAL::spatial_sort和CGAL::hilbert_sort是CGAL库中的两个不同函数,它们用于不同的排序目的。

        CGAL::spatial_sort是一个用于对几何对象进行空间排序的函数。它基于四叉树数据结构,可以将空间划分为四个象限,然后递归地对每个象限进行排序。空间排序的目的是确定对象的相对位置关系,以便在几何计算中按照特定的顺序处理这些对象。

        而CGAL::hilbert_sort是一个用于对球面上的点进行排序的函数,它使用Hilbert曲线进行排序。Hilbert曲线是一种将二维平面上的点按照顺序映射到一条曲线上的方法,使得相邻的点在曲线上具有尽可能大的角度差。球面上的点可以用它们的经度和纬度来表示,因此CGAL::hilbert_sort可以用于对球面上的点进行排序。

        总结:CGAL::spatial_sort和CGAL::hilbert_sort的区别在于它们的排序目的和应用场景不同。CGAL::spatial_sort用于对几何对象进行空间排序,而CGAL::hilbert_sort用于对球面上的点进行排序。在实际应用中,需要根据具体需求选择适合的排序函数。

CGAL 5.6 - Spatial Sorting: User Manual

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.net8 AOT编绎-跨平台调用C#类库的新方法-函数导出

VB.NET AOT无法编绎DLL,微软的无能,正是你的机会 .net8 AOT编绎-跨平台调用C#类库的新方法-函数导出 1,C#命令行创建工程:dotnet new classlib -o CSharpDllExport 2,编写一个静态方法,并且为它打上UnmanagedCallersO…

Linux - 设置虚拟机和主机IP在同一网段(桥接)

1.查看主机ip地址等相关信息。 ipconfig -all 2.设置虚拟网络编辑器 打开虚拟网络编辑器 设置虚拟网络编辑器,设置为桥接模式。(记得以管理员方式打开VMware)。 3.修改虚拟机网卡文件 查看虚拟机ip,我们的目标是将其修改为与主机同一网段…

postman使用-04响应

文章目录 响应响应界面说明Pretty:格式化显示,以便查看Raw:不进行任何处理,显示响应数据的原始格式Preview:预览响应体,会自动换行,不会格式化(有时候是数据,有时候是页面…

什么是缓存、为什么要用缓存、缓存分类、缓存测试、缓存更新、缓存设计考虑点、缓存测试点

一、缓存 缓存是一种将数据存储在高速缓存中的技术,它可以提高应用程序的性能和响应速度。 二、 为什么要用缓存 1. 高性能(主要目的) 查询耗时,但变化少,又有很多读请求情况下,可以将查询结果放到缓存中。减少对数据库的压力&…

Java位运算及移位运算

java中能表示整数数据类型的有byte、short、char、int、long,在计算机中占用的空间使用字节描述,1个字节使用8位二进制表示。 数据类型字节数二进制位数表示范围默认值byte18-27 – 27-10char2160 – 216-1\u0000 (代表字符为空 转成int就是0)short216-…

Word 将页面方向更改为横向或纵向

文章目录 更改整个文档的方向更改部分页面的方向方法1:方法2: 参考链接 更改整个文档的方向 选择“布局”>“方向”,选择“纵向”或“横向”。 更改部分页面的方向 需要达到下图结果: 方法1: 选:中你要在横向页面…

帆软报表中定时调度中的最后一步如何增加新的处理方式

在定时调度中,到调度执行完之后,我们可能想做一些别的事情,当自带的处理方式不满足时,可以自定义自己的处理方式。 产品的处理方式一共有如下这些类型: 我们想在除了上面的处理方式之外增加自己的处理方式应该怎么做呢? 先看下效果: 涉及到两方面的改造,前端与后端。…

C++日期类的实现

前言:在类和对象比较熟悉的情况下,我们我们就可以开始制作日期表了,实现日期类所包含的知识点有构造函数,析构函数,函数重载,拷贝构造函数,运算符重载,const成员函数 1.日期类的加减…

【产品设计】信息建设三驾马车:PLM系统拆解

本篇文章将介绍PLM的基础信息、发展及模块功能等内容,让大家对PLM有一个全面、完整地了解,方便在后期的工作中能快速地使用其解决方案,希望本篇文章能对你有所帮助。 PLM系统主要实现产品模块业务,既包含产品的创意设计、样品打样…

【源码】-MyBatis-如何系统地看源码

写在前面 前段时间做过一个项目,期间用到了动态数据源dynamic-datasource,经历了dbcp2的数据库连接池没有生效到排查定位、MyBatis多种数据库产品兼容、手写MyBatis拦截器等事情。 花费了好久,一直在打磨这篇文章(不知道花费这么长…

thinkphp6.0升级到8.0

目录 一:升级过程 二:报错处理 最近写的项目需要使用thinkphp8.0,之前的老项目需要从php6.0升级到8.0,特此记录下升级过程。 一:升级过程 查看版本: php think version,我目前的版本是6.1.4 生成thin…

WPF+Halcon 培训项目实战(8-9):WPF+Halcon初次开发

文章目录 前言相关链接项目专栏运行环境匹配图片WPF Halcon组件HSmartWindowControlWPF绑定读取图片运行代码运行结果 抖动问题解决运行结果 绘制矩形绘制图像会消失 绘制对象绑定事件拖动事件 前言 为了更好地去学习WPFHalcon,我决定去报个班学一下。原因无非是想…

C/C++面向对象(OOP)编程-回调函数详解(回调函数、C/C++异步回调、函数指针)

本文主要介绍回调函数的使用,包括函数指针、异步回调编程、主要通过详细的例子来指导在异步编程和事件编程中如何使用回调函数来实现。 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:C/C精进之路 &…

Spark魔力:招聘网站数据深度分析系统

Spark魔力:招聘网站数据深度分析系统 简介数据集技术栈功能特点创新点 简介 在本文中,我们将介绍一款基于Spark的招聘网站数据分析系统,该系统使用爬取的前程无忧招聘数据。通过结合Flask、Pandas、PySpark、以及MySQL等技术,实现…

【汇编笔记】初识汇编-内存读写

汇编语言的由来: CPU是计算机的核心,由于计算机只认识二进制,所以CPU执行的指令是二进制。 我们要想让CPU工作,就得给他提供它认识的指令,这一系列的指令的集合,称之为指令集。 指令集: 不同的体…

单片机键盘程序设计举例

1、键盘与的连接 图3键盘连接 图4单片机与键盘接口图 2、通过1/0口连接。将每个按钮的一端接到单片机的I/O口,另一端接地,这是最简单的办法,如图3所示是实验板上按钮的接法,四个按钮分别接到P3.2 、P3.3、P3.4和P3.5。对于这种键…

css 设置鼠标覆盖显示菜单

鼠标覆盖到“全部分类”效果如下 鼠标放到“精品推荐”效果如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&g…

【CF比赛记录】—— Good Bye 2023(A、B、C)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;CF比赛记录 &#x1f48c;其他专栏&#xff1a; &#x1f534;每日一题 &#x1f7e1; cf闯关练习 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓…

mysql基础-表操作

环境&#xff1a; 管理工具&#xff1a;Navicat 数据库版本&#xff1a;5.7.37 mysql的版本&#xff0c;我们可以通过函数&#xff0c;version()进行查看&#xff0c;本次使用的版本如下&#xff1a; 目录 1.管理工具 1.1创建表 1.2.修改表名 1.3.复制表 1.4.删除表 2…

C#上位机与欧姆龙PLC的通信08----开发自己的通讯库读写数据

1、介绍 前面已经完成了7项工作&#xff1a; C#上位机与欧姆龙PLC的通信01----项目背景-CSDN博客 C#上位机与欧姆龙PLC的通信02----搭建仿真环境-CSDN博客 C#上位机与欧姆龙PLC的通信03----创建项目工程-CSDN博客 C#上位机与欧姆龙PLC的通信04---- 欧姆龙plc的存储区 C#上…