CGAL的空间排序

news2024/11/26 19:39:36

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.coloradmin.cn/o/1349595.html

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

相关文章

Seata服务搭建与模式实现

日升时奋斗,日落时自省 目录 1、简述 2、Seata优越性 3、Seata组成 4、Seata模式 4.1、XA 模式 4.2、AT 模式(默认模式) 4.3、TCC 模式 4.4、SAGA 模式 4.5、XA协议 5、Seata服务部署 5.1、文件数据源部署 5.1.1、下载并安装Seata 5.1.2、启动Seata服…

oracle 9i10g编程艺术-读书笔记2

配置Statspack 安装Statspack需要用internal身份登陆,或者拥有SYSDBA(connect / as sysdba)权限的用户登陆。需要在本地安装或者通过telnet登陆到服务器。 select instance_name,host_name,version,startup_time from v$instance;检查数据文件路径及磁盘空间&…

springboot基于Java的小区物业管理系统设计与实现

springboot基于Java的小区物业管理系统设计与实现 源码获取: https://docs.qq.com/doc/DUXdsVlhIdVlsemdX

Couchdb 垂直权限绕过漏洞(CVE-2017-12635)

一、漏洞描述 Apache CouchDB是一个开源数据库,专注于易用性和成为”完全拥抱web的数据库”。它是一个使用JSON作为存储格式,JavaScript作为查询语言,MapReduce和HTTP作为API的NoSQL数据库。应用广泛,如BBC用在其动态内容展示平台…

常见网络设备及功能详解

网络设备 - 交换机 交换机:距离终端用户最近的设备,用于终端用户接入网络、对数据帧进行交换等。 交换机的功能: 终端设备(PC、服务器等)的网络接入二层交换(Layer 2 Switching) 网络设备 - …

ctf_show(web入门笔记)持续更新中

信息收集 1-2:查看源代码 3:bp抓包 4:robots.txt(这个文件里会写有网站管理者不想让爬虫的页面或其他) 5:网站源代码泄露index.phps 6:同样也是源码泄露,(拿到以后还…

redis 从0到1完整学习 (十四):RedisObject 之 ZSet 类型

文章目录 1. 引言2. redis 源码下载3. redisObject 管理 ZSet 类型的数据结构4. 参考 1. 引言 前情提要: 《redis 从0到1完整学习 (一):安装&初识 redis》 《redis 从0到1完整学习 (二):re…

windows和linux操作Git(序章2)

Git 分布式版本控制系统(序章1) ## Linux 下安装 Git🔺 ​ ## Git命令大全🔺 windows和linux通用 安装完 Git 后,需要进行配置,如姓名、Email 等 git config --global user.name "你的名字"git config --global us…

CSS 纵向底部往上动画

<template><div class"container" mouseenter"startAnimation" mouseleave"stopAnimation"><!-- 旋方块 --><div class"box" :class"{ scale-up-ver-bottom: isAnimating }"><!-- 元素内容 --&g…

Nginx 反向代理负载均衡

Nginx 反向代理负载均衡 普通的负载均衡软件&#xff0c;如 LVS&#xff0c;其实现的功能只是对请求数据包的转发、传递&#xff0c;从负载均衡下的节点服务器来看&#xff0c;接收到的请求还是来自访问负载均衡器的客户端的真实用户&#xff1b;而反向代理就不一样了&#xf…

[Echarts使用]:bug记录

问题1&#xff1a; z / z2 / zlevel of displayable is invalid, which may cause unexpected errors // 在series 选项中设置zlevel、z 属性即可解决 let option: echarts.EChartsCoreOption {...,series: {name: data.name,type: "line",smooth: true,showSymbol:…

计算机毕业设计——springboot养老院管理系统 养老院后台管理

1&#xff0c;绪论 1.1 背景调研 养老院是集医疗、护理、康复、膳食、社工等服务服务于一体的综合行养老院&#xff0c;经过我们前期的调查&#xff0c;院方大部分工作采用手工操作方式,会带来工作效率过低&#xff0c;运营成本过大的问题。 院方可用合理的较少投入取得更好…

【zookeeper选举源码分析】

文章目录 为什么要看源码&#xff1a; 1、提升技术功底&#xff1a;学习源码里的优秀设计思想&#xff0c;比如一些疑难问题的解决思路&#xff0c;还有一些优秀的设计模式&#xff0c;整体提升自己的技术功底 2、深度掌握技术框架&#xff1a;源码看多了&#xff0c;对于一个新…

2024-01-01 力扣高频SQL50题目 练习笔记

1. 1661求机器平均运行时间 在做这道题的时候&#xff0c;我遇到了4个问题 # 求平均的问题 如何找到个数? -> 相减对应列值后,直接average 就行。因为avg就是自动确定要除的个数&#xff08;当然要联合正确的group by 分组&#xff09; # 怎么根据machine_id和process_id…

解决npm,pnpm,yarn等安装electron超时等问题

我在安装electron的时候&#xff0c;出现了超时等等各种问题&#xff1a; &#xff08;RequestError: connect ETIMEDOUT 20.205.243.166:443&#xff09; npm yarn&#xff1a;Request Error: connect ETIMEDOUT 20.205.243.166:443 RequestError: socket hang up npm ER…

ThreadLocal共享变量

一、ThreadLocal 我们知道多线程访问同一个共享变量时&#xff0c;会出现线程安全问题&#xff0c;为了保证线程安全开发者需要对共享变量的访问操作进行适当的同步操作&#xff0c;如加锁等同步操作。 除此之外&#xff0c;Java提供了ThreadLocal类&#xff0c;当一个共享变…

python实现Ethernet/IP协议的客户端(三)

Ethernet/IP是一种工业自动化领域中常用的网络通信协议&#xff0c;它是基于标准以太网技术的应用层协议。作为工业领域的通信协议之一&#xff0c;Ethernet/IP 提供了一种在工业自动化设备之间实现通信和数据交换的标准化方法。python要实现Ethernet/IP的客户端&#xff0c;可…

Spring Cloud Gateway + Nacos 灰度发布

前言 本文将会使用 SpringCloud Gateway 网关组件配合 Nacos 实现灰度发布&#xff08;金丝雀发布&#xff09; 环境搭建 创建子模块服务提供者 provider&#xff0c;网关模块 gateway 父项目 pom.xml 配置 <?xml version"1.0" encoding"UTF-8"?…

数据结构OJ实验9-图存储结构和遍历

A. 图综合练习--构建邻接表 题目描述 已知一有向图&#xff0c;构建该图对应的邻接表。 邻接表包含数组和单链表两种数据结构&#xff0c;其中每个数组元素也是单链表的头结点&#xff0c;数组元素包含两个属性&#xff0c;属性一是顶点编号info&#xff0c;属性二是指针域n…

数据结构期末复习(fengkao课堂)

学习数据结构时&#xff0c;以下建议可能对您有所帮助&#xff1a; 理解基本概念&#xff1a;首先&#xff0c;确保您理解数据结构的基本概念&#xff0c;例如数组、链表、栈、队列、树、图等。了解它们的定义、特点和基本操作。 学习时间复杂度和空间复杂度&#xff1a;了解如…