←返回论文目录

P2M: A Fast Solver for Querying Distance from Point to Mesh Surface

P2M: A Fast Solver for Querying Distance from Point to Mesh Surface算法总流程筛选拦截凸多面体R-tree实现图解方法评价性能优缺点

读论文。

论文内容:使用KDT,构建拦截表放入R-tree的筛选方法进行预处理,加速查询过程。

算法总流程

预处理部分:

  1. 计算 的KD-Tree与Voronoi图。
  2. 对于 计算拦截器,填到拦截表中,并计算外边框。
  3. 对于每个 ,将能够拦截器的元素(的外边框)插入R-tree中。

整体是 的,其中 为点的数量, 为边与面的数量。

查询部分:

  1. 在KDT中找到距离 最近的点
  2. 在R-tree中遍历 能够拦截的元素,更新距离最小值。

常数很小。

筛选

通过KDT来找到最近的顶点后,需要找到最近的网格面,我们可以通过预处理一些筛选加快这个过程。

拦截

image-20230917175409027

如图,实线表示三条边的Voronoi图的边,虚线表示两个点的Voronoi图的边。对于查询点

差别在于边Voronoi图的顶点完全在点Voronoi边的一侧。于是可以看成对边的一个筛选?

这样的筛选称为 拦截了边 ,数学地表述就是 ,称 的拦截器,然后可以列出上面的拦截表。

以上是二维情况,推广到三维情况,有:

这里 表示垂直于 的子空间, 解释见图解 Fig.5, 表示 所在直线。

凸多面体

三维空间中还有面元的存在,直接使用上面的定义会比较难以表示。

我们注意到 是一个凸多面体,而 是凸的抛物面,如果判断在内部,可以直接判断顶点就可以了。

于是我们定义 ,记其 个顶点为 ,于是 就等价于 ,也就是 ,其中 表示点 的距离。

这样定义就很好实现,也方便推广到面的情况:

个顶点为 ,若 ,则 不能拦截 ,其中 表示点 到平面 的距离。

R-tree

通过上面方法可以计算出拦截表,但是直接对拦截表进行遍历太低效了。

由上一节内容知, 能拦截 (也可以替换为 )可以写为 (注意这里 取边所在的部分),我们将左边的式子定义为 。但可惜这个区域不一定是凸的,很难直接判断在内部或外部,于是可以用边界盒来包住 ,然后对于一个点建立R-tree。

实现

使用泛洪算法:

image-20230918172609882

图解

个人感觉这篇论文的图很帅。

Fig.3

image-20230917181307817

Fig.4

image-20230917182026933

描述边和面交接处 的形状:面 的边垂直于面。边 的形状取决于相邻的平面。

Fig.5

image-20230917182145429

点到直线和点到平面的平分面(点到点为平面),记为

Fig.6

image-20230917182606356

 

图中 所在的虚线为 ,垂直于 的两条虚线表示 的边界;黄色部分表示 ;粉色部分表示 ;灰色实线表示 的边界的一部分,其左侧部分为此

用来解释定理3:若 ,则 不能 拦截 ,也就是 在的 恰好在抛物面内部。

Fig.8

image-20230918165206912

上文定义的 部分,使用了外边框来包住,放入R-tree中。

Fig.9

image-20230918171142209

每个边的拦截元素数量不相同,对于1500K个面的物体,拦截元素数量统计如上。

Fig.10

image-20230918171333293

拦截数量的平均值与最大值随三角形数变化的曲线图(龙模型),可见平均拦截数相当少,算法期望运行时间还是很优秀的(

剩下表格基本为性能测试,这里不作解释。

方法评价

性能

预处理过程中计算拦截表的部分占用了 以上的时间:

image-20230918171536734

但查询时间相当优秀,比现有方法如 PQP、FCPW 要优秀得多:

image-20230918171657484

且对于较差的三角面上仍有较好的性能:

image-20230918171722265

优缺点

作者给出的改进方向:由于大部分顶点都无法被拦截,可以考虑改进过滤技术。