CGAL的三角形曲面网格的最短路径

        该软件包提供了一种计算三角曲面网格上测地线最短路径的算法。 

        CGAL的Surface_mesh_shortest_path的原理是基于测地线最短路径算法。测地线是连接两个点之间的最短路径,它沿着曲面的法线方向前进。在三角曲面网格上,测地线算法可以用于找到从一点到另一点的最短路径。

         使用由绿色正方形表示的一个源点的地形上的最短路径。 

1、介绍

        机器人跨越三维地形表面的运动规划是最短路径计算的一个典型应用。使用二维近似无法捕捉到我们试图跨越的地形中任何有趣的东西,并且会给出糟糕的解决方案。这个问题通常被称为离散测地线问题。尽管这个问题的更一般版本,即存在障碍物的三维中最短路径,是NP难的,但当运动被限制在物体的二维表面时,它可以有效地解决。

        该软件包中实现的算法构建了一个数据结构,可以有效地回答以下形式的查询:给定一个三角网格曲面M、M上的一组源点S和M上的目标点t,找到t和S中任意元素之间的最短路径λ,其中λ被限制在M的表面上。

        使用的算法基于 Xin 和 Wang 的论文,这是一种快速实用的算法,用于精确计算测地线最短路径。它是 Chen 和 Han  以及 Mitchell、Mount 和 Papadimitriou 早期结果的扩展。

        此软件包与“热方法”软件包相关。两者都处理测地线距离。测地线最短路径软件包计算曲面任意两点之间的精确最短路径。热方法软件包计算网格的每个顶点到一或多个源顶点的近似距离。

2、接口

2.1、曲面网格最短路径类

        此包的主要类是Surface_mesh_shortest_path。在下文中,我们描述了使用此类时的典型工作流

指定输入

        最短路径是在由 FaceListGraph 概念的模型表示的三角化表面网格上计算的。对输入表面网格的 属性、连通性或凸性没有限制。

        出于效率原因,内部使用顶点、半边和面的索引属性映射。对于每个单形类型,属性映射必须在 0 和单形数量之间提供一个索引。我们建议使用 CGAL::Surface_mesh 作为 FaceListGraph 的模型。

        如果您使用 class administrativel::Polyhedron_3,您应该将其与项类 CGAL::Polyhedron_items_with_id_3,它提供了默认的属性映射。此项目类与每个单形关联,提供了一个 O(1) 时间访问索引。请注意,属性映射的初始化需要调用 set_halfedgeds_items_id()。

        每个顶点的嵌入访问是通过使用点顶点属性映射完成的,该映射将每个顶点与一个3D点相关联。为CGAL类提供了默认值。

        如果使用的 traits 类包含一些本地状态,则必须在构造它时将其传递给类(默认提供的类则不需要)。

指定源点

        最短路径查询的源点集可以逐个填充或使用范围填充。可以使用输入曲面网格的顶点或具有某些重心坐标的输入曲面网格的面来指定源点。给定位于三角形面(A,B,C)内的点p,其重心坐标是权重三元组(b0,b1,b2),使得p=b0⋅ A+b1⋅ B+b2⋅ C,并且b0+b1+b2=1。

        为了方便起见,提供了一个函数 Surface_mesh_shortest_path::locate(),用于根据几何输入构造面位置:

        给定一个位于3D空间中的点p,该函数计算曲面上最接近p的点,并返回包含该点的面及其重心坐标;

        给定一条位于三维空间中的射线r,该函数计算射线与曲面的交点,并且(如果存在交点)返回包含该点的面,以及它的重心坐标;

构建内部序列树

        最短路径查询的耗时操作在于构建用于进行查询的内部数据结构。这个数据结构被称为序列树。当第一个最短路径查询完成时,它将自动构建,并且只要源点集不变,它将重新用于任何后续查询。每次源点集发生变化时,都需要重建序列树(如果已经构建)。请注意,它也可以通过调用 Surface_mesh_shortest_path::build_sequence_tree() 手动构建。

最短路径查询

        至于指定源点,最短路径查询的目标点可以使用输入曲面网格的顶点或输入曲面网格的面和一些重心坐标来指定。

        有三种不同类型的查询函数可以使用类 Surface_mesh_shortest_path 调用。给定一个目标点,所有这些函数计算该目标点与源点集之间的最短路径:

        Surface_mesh_shortest_path::shortest_distance_to_source_points() 提供最接近目标点的源点以及最短路径的长度。

        Surface_mesh_shortest_path::shortest_path_points_to_source_points() 提供最短路径与输入曲面网格的边和顶点的所有交点(包括源点和目标点)。该函数对于可视化目的很有用。

        Surface_mesh_shortest_path::shortest_path_sequence_to_source_points 使用 SurfaceMeshShortestPathVisitor 概念的访问者对象模型,可以访问最短路径所穿越的简单体的完整序列。

额外的便利功能

        提供了一些方便的函数来计算:

        指定为输入曲面网格的面的输入曲面网格上的点和一些重心坐标。

        输入表面网格上距离给定3D点最近的点(指定为输入表面网格的面和一些重心坐标)。这些函数使用类CGAL::AABB_tree。

2.2、内核建议

        简而言之,我们建议使用具有精确谓词的CGAL内核,例如CGAL::Exact_predicates_inexact_constructions_kernel。

        如果你需要精确的构造(例如最短路径点计算),你应该使用具有精确构造的内核。虽然该算法使用平方根运算,但它也可以在不支持平方根的几何内核上工作,方法是首先使用std::sqrt将内核的数字类型转换为double,然后再转换回来。请注意,最好使用直接支持平方根的内核,以获得最精确的最短路径计算。

        使用此软件包中的一个内核,如CGAL::Exact_predicates_exact_constructions_kernel_with_sqrt,确实可以提供精确的最短路径,但速度非常慢。

        事实上,为了计算沿表面的距离,有必要将面序列展开,边对边,展开到一个公共平面。 SurfaceMeshShortestPath Traits::Construct_triangle_3_to_triangle_2_projection 函子通过将给定面旋转到 xy 平面,提供了序列中第一个面的初始布局。

        SurfaceMeshShortestPath Traits::Construct_triangle_3_along_segment_2_flattening 使用指定的段作为基底,将三角形展开到平面中。由于这会在平面上产生一系列构造的三角形,因此使用此内核(CORE::Expr 或 leda_real)的精确表示类型将处理非常慢,即使在非常简单的输入上。这是因为精确表示将有效地为每次计算增加一个 O(n) 因数。

3、基准

        这些基准测试是在多次试验中使用随机生成的源点和目的点运行的。在Cygwin 1.7.32下,使用CGAL 4.5执行测量,使用Gnu C++编译器版本4.8.3,选项-O3-DNDEBUG。使用的系统是64位Intel Core i3 2.20GHz处理器,具有6GB RAM

3.1、单一源点

ModelNumber of VerticesAverage Construction Time (s)Average Queries Per SecondPeak Memory Usage (MB)
ellipsoid.off1620.002588051.21972e+060.39548
anchor.off5190.05802622304613.88799
rotor.off6000.03866333261753.10571
spool.off6490.04183052997663.75773
handle.off11650.09761672273437.66706
couplingdown.off18410.13846724683310.1731
bones.off21540.01011251.31834e+060.865896
mushroom.off23370.20603420258222.5804
elephant.off27750.13617731378514.0987
cow.off29040.25910420651517.4796
knot1.off32000.27945520708425.314
retinal.off36430.25578824761729.8031
femur.off38970.2533226482521.4806
knot2.off57600.29565530959322.5549
bull.off62000.51350620999434.983
fandisk.off64750.60950719876871.3617
lion-head.off83561.2386314581086.6908
turbine.off92102.2375593079.5172.072
man.off174951.59015187519148.358

3.2、十个源点

ModelNumber of VerticesAverage Construction Time (s)Average Queries Per SecondPeak Memory Usage (MB)
ellipsoid.off1620.003210179110250.245674
anchor.off5190.036013530623.19274
rotor.off6000.0158648054161.97554
spool.off6490.01657438027012.09675
handle.off11650.02945646460574.62122
couplingdown.off18410.1260452724657.80517
bones.off21540.0554345366464.0203
mushroom.off23370.13928529042511.462
elephant.off27750.16726928507611.2743
cow.off29040.1543232854913.0676
knot1.off32000.11405145464016.1735
retinal.off36430.23320828786918.6274
femur.off38970.12809745711216.8295
knot2.off57600.41354826019533.484
bull.off62000.37171329756030.522
fandisk.off64750.54592922386539.5607
lion-head.off83560.7009722944959.6597
turbine.off92101.3570315730190.7139
man.off174951.75936185194122.541

3.3、多源点的构建和查询时间比较

        以下数字跟踪了随着源点数量的增加,各种测试模型的建设时间、查询时间和峰值内存使用情况。请注意,随着源点数量的增加,这些值都没有显著增加。事实上,在大多数情况下,运行时间和内存会下降。这是因为源点数量的增加往往会导致序列树更加平坦,从而降低运行时间和内存成本。

根据不同数量的源点绘制施工时间图。 

 根据不同数量的源点绘制查询时间。

 针对不同数量的源点绘制峰值内存使用情况图。

4、实施细节

4.1、定义

测量路径

        测地线是某些流形表面上局部最短路径,也就是说,它不能通过一些局部扰动变得更短。在曲面网格上,这转化为一条曲线,当曲线所穿过的面展开到平面时,曲线形成一条直线。另一种描述方法是,在曲线沿线的每个点上,两侧都有π个曲面角(可能除了曲线的端点)。

        两点之间的测地线不一定是最短路径,但曲面网格上的所有最短路径都是由一个或多个测地线路径的序列组成的,其连接点要么是网格边界上的顶点,要么是鞍点。我们称这种网格曲面上的曲线为其两个端点之间的潜在最短路径。

        简单曲面网格表面上的测地线。 

同一条测地线,其面展开到平面中。注意,在展开过程中,测地线形成一条直线。 

可视化窗口

        可见性窗口(或可见性锥)是一对共享一个公共源点并包围曲面网格的局部平坦区域的测地线。局部平坦意味着在窗口内的每对点之间,它们之间恰好有一条测地线路径,该路径也保持在窗口的边界内。因此,在窗口内,可以使用正常的二维欧几里德操作进行距离计算等操作。当可见性窗口遇到顶点(曲面的非平坦部分)时,会出现分支,形成两侧的子窗口。

在遇到顶点之前的单个可见性窗口。

遇到凸顶点后,可见性窗口分支到任意一侧(左侧为蓝色,右侧为红色)。请注意,两个新窗口在顶点的另一侧立即重叠,因为周围的表面积小于2π。该重叠区域内的点从原点可能有两条最短的路径。

鞍形顶点

        曲面网格上的鞍点是一个顶点 v,在该点处,所有面与 v 相交的曲面角度之和大于 2π,或者更简单地说,不能将所有与 v 相交的面无重叠地展平到平面中。识别和处理鞍点在最短路径算法中很重要,因为它们形成了单个测地线曲线无法到达的盲点。

        为了解决这个问题,我们必须创建一组新的子可见窗口,这些窗口在鞍点周围分支。通过这些子窗口的路径将首先到达鞍点,然后沿着一个新的可见窗口(在曲面上形成一种折线)。请注意,当我们到达非闭合曲面网格的边界顶点时,需要类似的行为。

        可见性窗口(蓝色阴影)遇到鞍形顶点;顶点后面的红色阴影区域无法通过来自源点的测地线曲线到达(假设测地线必须位于初始窗口内)。 

        为了越过鞍形顶点创建的盲点,我们创建了一个从鞍形顶点发出的可见性窗口的分支集。注意,我们的算法只需要覆盖父可见性窗口盲点的分支。 

序列树

        为了计算最短路径,我们从每个源点构建一个序列树(或锥树)。序列树通过将所有潜在的最短路径组织成一个可见窗口的层次结构,描述了源自单个源点的所有潜在最短路径的组合结构。

        每当遇到曲面网格的顶点时,序列树中就会出现一个分支。如果该顶点是一个非鞍点,则只会创建两个子节点,每个子节点对应当前面上与该顶点相交的边。如果该顶点是一个鞍点,除了上述两个子节点外,还会创建一个称为伪源的特殊节点,该节点从该顶点分支出来。

        一旦构建了序列树,就可以计算从源点到给定可见窗口内每个点的潜在最短路径。沿着树每个分支的面序列被逐个排列到一个公共平面上,这样,使用单个二维欧几里德距离计算就可以得到从曲面上任何点到其最近源点的测地距离。请注意,如果窗口属于伪源,则距离是从目标到伪源测量的,然后测量从伪源到其父级的距离,以此类推,直到原始源。

4.2、整体

        从任何源点开始的序列树的大小在理论上都是无限的,但我们只关心深度最多为N的树,其中N是表面网格中的面数(因为没有最短路径可以穿过相同的面两次)。即使这样,这个截断的序列树的大小可能是表面网格大小的指数,因此简单的广度优先搜索是不可行的。相反,我们应用技术来消除可以证明不能包含源点最短路径的整个分支。 Xin和Wang [3]的一篇论文中详细介绍了所使用的技术,该论文本身扩展了Chen和Han [1]以及Mitchell、Mount和Papadimitriou [2]的早期工作。

        处理多个源点很简单,只需要使用类似于多源Dijsktra算法的方法同时构建多个序列树。

4.3、连续Dijkstra

        连续Dijkstra算法只是将图搜索算法应用于非离散设置。当我们构建搜索树时,新创建的节点被标记为距离度量,并被插入到优先队列中,这样最短距离节点总是排在第一位。

4.4、一个角度,一个拆分

        Chen和Han的观察表明,在曲面网格的任意给定顶点处出现的所有分支中,只有有限数量的分支具有多个可以定义最短路径的子节点。这是通过为每个顶点维护序列树的所有节点来实现的,这些节点可以在其可见窗口内包含该顶点。

        对于每个顶点,每个与该顶点相交的面只能出现一个双向分支,具体来说,就是与该顶点相交的最近节点。我们将该最近节点称为该顶点的占据者。

        如果顶点是鞍点,则该顶点只能建立一个伪源,这次是由距离该顶点最近的绝对节点建立的。

        仅此方法就可以将序列树构造的构造运行时间减少到多项式时间。

4.5、距离过滤

        Xin和Wang提出的另一个距离滤波器通过将当前节点的距离与当前面上三个顶点中迄今为止最接近的距离进行比较,有助于进一步修剪搜索树。

4.6、定位最短路径

        为了定位从目标点到源点的最短路径,我们必须选择正确的可见性窗口。一个简单的方法是跟踪所有与f相交的窗口的每个面f。在实践中,最多有恒定数量的窗口与任何给定的面相交,因此为了简单起见,这是我们使用的方法。另一种选择是在每个面上构造类似Voronoi的结构,其中每个单元表示一个可见性窗口。我们没有尝试这种方法,但它似乎没有计算效益。

5、其他

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

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

相关文章

【linux】如何查看服务器磁盘IO性能

查看服务器磁盘IO性能 在服务器运维过程中,了解服务器的磁盘IO性能是非常重要的。磁盘IO性能直接影响到服务器的响应速度和处理能力。本文将介绍如何使用dd命令来查看服务器磁盘IO性能。 1. 什么是dd命令? dd命令是Linux系统中的一个非常强大的工具&a…

Appium+python自动化(二)- 环境搭建—下(超详解)

简介 宏哥的人品还算说得过去,虽然很久没有搭建环境了,但是换了新电脑设备,一气呵成,将android的测试开发环境已经搭建准备完毕。上一篇android测试开发环境已经准备好, 那么接下来就是appium的环境安装和搭建了。 嘿…

关于数据变更控制思路与实现

先看一设备需求,用于验证计费模型是否有变化,如题: 这里涉及的就是 “计费模型编号”,业务需求就是价格变化了,编号应该也变更,常用的实现方法: 1,如果通过版本控制,要增…

Flink Job 执行流程

Flink On Yarn 模式 ​ 基于Yarn层面的架构类似 Spark on Yarn模式,都是由Client提交App到RM上面去运行,然后 RM分配第一个container去运行AM,然后由AM去负责资源的监督和管理。需要说明的是,Flink的Yarn模式更加类似Spark on Ya…

C语言 linux文件操作(一)

一、linux文件权限 字符表示法 二进制 十进制 说明 r - - 100 4 仅可读 - w - 010 2 仅可写 - - x 001 1 仅可执行 r w - 110 6 可读可写 r - x 101 5 可读可执行 - w x 011 …

卷积神经网络 反向传播

误差的计算 softmax 经过softmax处理后所有输出节点概率和为1 损失(激活函数) 多分类问题:输出只可能归于某一个类别,不可能同时归于多个类别。 误差的反向传播 求w的误差梯度 权值的更新 首先是更新输出层和隐藏层之间的权重…

oracle下载

前言: 官网上提供都是最新的什么19c 21c这些版本,我要的是 11g 12c 或者更老的 8i 9i 这些版本。 准备下载一个oracle12c 版本,但是找了很久,最终…详情请看下面 oracle 数据库版本介绍 Oracle数据库有多个长期支持版本&#x…

模式识别与机器学习-SVM(带软间隔的支持向量机)

SVM(带软间隔的支持向量机) 软间隔思想的由来软间隔的引入 谨以此博客作为复习期间的记录。 软间隔思想的由来 在上一篇博客中,回顾了线性可分的支持向量机,但在实际情况中,很少有完全线性可分的情况,大部分线性可分…

OpenHarmony城市技术论坛武汉站:探索大模型时代的终端操作系统创新

2023年12月23日下午,OpenHarmony城市技术论坛(以下简称“技术论坛”)——第6期(武汉站)于华中科技大学梧桐语问学中心明德报告厅圆满举办。本次技术论坛聚焦“大模型时代的系统软件”,旨在探索AI大模型在终端操作系统领域的创新趋势和挑战。论坛从“终端操作系统十大技术挑战”…

事务管理解析:掌握Spring事务的必备技能!

AOP事务管理 1.1 Spring事务简介1.1.1 相关概念介绍1.1.2 转账案例-需求分析1.1.3 转账案例-环境搭建步骤1:准备数据库表步骤2:创建项目导入jar包步骤3:根据表创建模型类步骤4:创建Dao接口步骤5:创建Service接口和实现类步骤6:添加jdbc.properties文件步骤7:创建JdbcConfig配置…

相机内参标定理论篇------相机模型选择

相机种类&#xff1a; 当拿到一款需要标定内参的相机时&#xff0c;第一个问题就是选择那种的相机模型。工程上相机类型的划分并不是十分严格&#xff0c;一般来说根据相机FOV可以把相机大概分为以下几类&#xff1a; 长焦相机&#xff1a;< 标准相机&#xff1a;~&…

某验第四代滑块逆向快速破解

本期地址如下&#xff0c;使用base64解码获得网址 aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v 破解某验&#xff0c;某盾已经是司空见惯的事情了&#xff0c;网上也有很多资料查阅&#xff0c;但是大多数都是繁琐、冗长&#xff0c;本文以最直接快速理解的方法讲解&#xff0c;稍微认真…

想要学会JVM调优,先掌握JVM内存模型和JVM运行原理

1、前言 今天将和你一起探讨Java虚拟机&#xff08;JVM&#xff09;的性能调优。 JVM算是面试中的高频问题了&#xff0c;通常情况下总会有人问到&#xff1a;请你讲解下 JVM 的内存模型&#xff0c;JVM 的 性能调优做过&#xff1f; 2、为什么 JVM 在 Java 中如此重要 首…

IT安全:实时网络安全监控

了解庞大而复杂的网络环境并非易事&#xff0c;它需要持续观察、深入分析&#xff0c;并对任何违规行为做出快速反应。这就是为什么实时网络安全监控工具是任何组织 IT 安全战略的一个重要方面。 网络攻击和合规性法规是 IT 安全的两个主要驱动因素。同时&#xff0c;数据泄露…

LaTeX论文排版

LaTeX论文排版 LaTeX 简介与使用为什么选择使用LaTeX进行论文排版&#xff1f;LaTeX下载与安装LaTeX环境安装——TeX Live(Windows、Linux)安装IDE——TeXstudio LaTeX软件界面 BIT-thesis模板BIT-Thesis&#xff1a;主控文件demo.tex&#xff1a; 公式、图片、表格的排版使用L…

c语言用四种方式求解成绩之中最高分和最低分的差值

文章目录 一&#xff0c;题目二&#xff0c;方法1&#xff0c;方法一2&#xff0c;方法二3&#xff0c;方法三4&#xff0c;方法四 三&#xff0c;示例结果 一&#xff0c;题目 最高分最低分之差 输入n个成绩&#xff0c;换行输出n个成绩中最高分数和最低分数的差 输入 : 两行…

安防视频监控系统EasyCVR实现H.265视频在3秒内起播的注意事项

可视化云监控平台/安防视频监控系统EasyCVR视频综合管理平台&#xff0c;采用了开放式的网络结构&#xff0c;可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;同时…

Java中XML的解析

1.采用第三方开元工具dom4j完成 使用步骤 1.导包dom4j的jar包 2.add as lib.... 3.创建核心对象, 读取xml得到Document对象 SAXReader sr new SAXReader(); Document doc sr.read(String path); 4.根据Document获取根元素对象 Element root doc.getRootElement(); …

Bean 生命周期 和 SpringMVC 执行过程

这里简单记录下 Bean 生命周期的过程&#xff0c;方便自己日后面试用。源码部分还没看懂&#xff0c;这里先贴上结论 源码 结论

Spring Boot 中的虚拟线程

在本文中&#xff0c;我将讨论 Spring Boot 中的虚拟线程。 什么是虚拟线程&#xff1f; 虚拟线程作为 Java 中的一项功能引入&#xff0c;旨在简化并发性。 Virtual threads 是 轻量级的线程&#xff0c;由 Java Virtual Machine 而不是操作系统管理。它们被设计为易于使用且…