读论文。
论文内容:使用KDT,构建拦截表放入R-tree的筛选方法进行预处理,加速查询过程。
预处理部分:
整体是 的,其中 为点的数量, 为边与面的数量。
查询部分:
常数很小。
通过KDT来找到最近的顶点后,需要找到最近的网格面,我们可以通过预处理一些筛选加快这个过程。
如图,实线表示三条边的Voronoi图的边,虚线表示两个点的Voronoi图的边。对于查询点 :
差别在于边Voronoi图的顶点完全在点Voronoi边的一侧。于是可以看成对边的一个筛选?
这样的筛选称为 拦截了边 ,数学地表述就是 ,称 是 的拦截器,然后可以列出上面的拦截表。
以上是二维情况,推广到三维情况,有:
这里 表示垂直于 的子空间, 解释见图解 Fig.5, 表示 所在直线。
三维空间中还有面元的存在,直接使用上面的定义会比较难以表示。
我们注意到 是一个凸多面体,而 是凸的抛物面,如果判断在内部,可以直接判断顶点就可以了。
于是我们定义 ,记其 个顶点为 ,于是 就等价于 ,也就是 ,其中 表示点 到 的距离。
这样定义就很好实现,也方便推广到面的情况:
令 的 个顶点为 ,若 ,则 不能拦截 ,其中 表示点 到平面 的距离。
通过上面方法可以计算出拦截表,但是直接对拦截表进行遍历太低效了。
由上一节内容知, 能拦截 (也可以替换为 )可以写为 (注意这里 取边所在的部分),我们将左边的式子定义为 。但可惜这个区域不一定是凸的,很难直接判断在内部或外部,于是可以用边界盒来包住 ,然后对于一个点建立R-tree。
使用泛洪算法:
个人感觉这篇论文的图很帅。
Fig.3
Fig.4
描述边和面交接处 的形状:面 的边垂直于面。边 的形状取决于相邻的平面。
Fig.5
点到直线和点到平面的平分面(点到点为平面),记为 。
Fig.6
图中 所在的虚线为 ,垂直于 的两条虚线表示 的边界;黄色部分表示 ;粉色部分表示 ;灰色实线表示 的边界的一部分,其左侧部分为此 。
用来解释定理3:若 ,则 不能 拦截 ,也就是 在的 恰好在抛物面内部。
Fig.8
上文定义的 部分,使用了外边框来包住,放入R-tree中。
Fig.9
每个边的拦截元素数量不相同,对于1500K个面的物体,拦截元素数量统计如上。
Fig.10
拦截数量的平均值与最大值随三角形数变化的曲线图(龙模型),可见平均拦截数相当少,算法期望运行时间还是很优秀的(
剩下表格基本为性能测试,这里不作解释。
预处理过程中计算拦截表的部分占用了 以上的时间:
但查询时间相当优秀,比现有方法如 PQP、FCPW 要优秀得多:
且对于较差的三角面上仍有较好的性能:
优点:快。
缺点:
作者给出的改进方向:由于大部分顶点都无法被拦截,可以考虑改进过滤技术。