在 Delaunay 三角化曲面中定位包含任意点的三角形

Posted

技术标签:

【中文标题】在 Delaunay 三角化曲面中定位包含任意点的三角形【英文标题】:Locate triangle containing arbitrary point in Delaunay-triangulated surface 【发布时间】:2011-11-15 09:21:55 【问题描述】:

我希望基于 Delaunay 三角剖分对不规则采样函数 z(x,y) 进行线性插值。假设我有一座山丘,我已经获得了 Delaunay 三角测量:

我知道每个三角形顶点(样本)的高度z。我想要在任意点(x,y) 的高度z

如何判断哪个三角形包含点(x,y)?一旦我知道了这一点,我想在三角形的三个顶点之间进行插值是相当简单的。

你知道这个的现成实现吗?也许还包括插值位?我确信在某个地方一定有一个开源实现。我对 Java(源代码或 JAR)特别感兴趣,但任何风格的 VB 或其他语言也可能有用。

【问题讨论】:

【参考方案1】:

您可以通过walking through the triangulation 向搜索点找到目标三角形。这假设您可以在恒定时间内访问相邻的三角形,如果三角剖分存储在双向连接的边列表或类似结构中,情况就是如此。实现很简单,因为您不需要任何额外的数据结构。

添加细节:设P为搜索点。取任意三角形 T0 和 T0 中的一个点 P0。如果P在T0,你就完成了。否则找到与线 P0-P 相交的 T0 的边 E0。转到边 E0 上 T 的相邻三角形 T1,并在 T1 中取点 P1。现在重复直到三角形 Tn 包含 P。

【讨论】:

D(s,n) 值得一提:"此过程保证仅在 Delaunay 三角剖分中终止。对于任意三角剖分,它可能会进入无限循环" .... "但是,无限循环可以通过在选择下一个访问哪个相邻单纯形时引入随机性来打破,对于所有实际目的" @Steven:好评。幸运的是,步行总是以 Delanay 三角剖分结束,我们不需要担心任何随机性。【参考方案2】:

这不是一个容易回答的问题,它取决于您需要从查找中获得什么性能,以及您准备交换多少内存来获得该性能。

如果这是一个非常罕见的操作,或者您的三角形数量很少,那么您总是可以遍历所有三角形。测试包含一个点的三角形并不是很昂贵。您可能应该先编写代码,看看它是否提供了可接受的性能。

如果不可接受,您可以尝试walking through the triangulation - 基本上从一个三角形开始,然后找到离您要查找的点最近的下一个。这确实假设您对简单的三角形列表有一些额外的信息 - 特别是您可以找到使用给定顶点的三角形(或从其相邻三角形中找到一个三角形,这在复杂性上大致相当)。如果你没有计算这个,那么它几乎和找到一个点一样昂贵。

如果这还不够快,您需要设置某种R-Tree。这使您可以非常快速地从它们的位置找到三角形,但确实需要大量的预处理和树的大量内存。

如果您不经常这样做,您可能会发现计算第二种和第三种方法的预处理的时间比通过穷举搜索找到三角形的时间要长。

【讨论】:

步行不需要关于顶点的信息。唯一需要的信息是每条边相对侧的相邻三角形。这通常是可用的。例如如果三角测量存储在 DCEL 中。 是的,从技术上讲,你是对的。但是相邻三角形的信息和vertex->triangle map一样大和一样复杂,所以论点完全一样。【参考方案3】:

我的算法知识有点生疏。而不是我之前的答案,您可能最好使用Voronoi Diagram。

可以在 Voronoi 之上构建点位置数据结构 图表,以回答最近邻查询,其中一个想要 找到最接近给定查询点的对象。最近的 邻居查询有很多应用。例如,一个可能 想找到最近的医院,或者在某地里最相似的物体 数据库。

我无法为您提供具体的帮助,但希望这可以为您指明正确的方向。


我猜你也可以使用R-tree 链接到你的三角形。

使用“java r-tree”在 google 上快速搜索应该可以帮助您找到现有的库。

【讨论】:

另一个相关关键字:Planar point location【参考方案4】:

您可以使用 Delaunay Hierarchy http://hal.inria.fr/inria-00166711 这个想法是获取点的一个子集,对其进行三角剖分,并在两层之间的顶点之间建立链接。然后在小三角剖分中执行“行走”,然后一个人从一层跳到下一层,然后一个人继续行走。这是在 CGAL 的三角剖分中实现的:http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Triangulation_2/Chapter_main.html#Section_37.10

【讨论】:

【参考方案5】:

我在这里找到了一个可行的实现:http://www.cs.bgu.ac.il/~benmoshe/DT/

find method 查找包含给定点的三角形,z method 执行平面插值。

不幸的是,它是一个编译的 JAR,所以我不知道算法是什么,但我感觉到它“通过三角测量”,正如 @Jiri 和 @DJClayworth 所建议的那样。

同样不幸的是这个 JAR 中使用的非常规的命名法。我最终可能会编写一个具有更好命名法的包装类。

【讨论】:

以上是关于在 Delaunay 三角化曲面中定位包含任意点的三角形的主要内容,如果未能解决你的问题,请参考以下文章

高效的 Delaunay 三角剖分

谁对opencv里面的delaunay三角剖分方法比较熟悉的

什么是德洛内三角网(Delaunay triangulation)

Voronoi图和Delaunay三角形和凸包

在 delaunay 三角剖分中考虑公共边来减少空间

计算几何---曲面三角形差值公式