在Delaunay-triangulated表面中找到包含任意点的三角形

时间:2011-09-12 14:01:10

标签: java algorithm vba interpolation triangulation

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

Delaunay-triangulated hill

我知道每个三角形顶点(样本)的高度z。我希望高度z位于任意点(x,y)

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

  • 您知道现成的实现吗?也许包括插值位?我确信必须在某处开源实现。我对Java(源代码或JAR)特别感兴趣,但任何VB或其他语言都可能有用。

5 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:2)

我的算法知识有点生疏。我可能更善于使用Voronoi Diagram

,而不是我之前的答案
  

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

我无法帮助你了解具体情况,但希望这可以指出你正确的方向。


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

使用'java r-tree'快速搜索谷歌可以帮助您找到现有的库。

答案 2 :(得分:2)

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

如果这是一个非常罕见的操作,或者您的三角形数量很小,那么您可以始终遍历所有三角形。测试包含点的三角形并不是非常昂贵。您应该首先对此进行编码,看看它是否具有可接受的性能。

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

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

我在这里找到了一个有效的实施方案:http://www.cs.bgu.ac.il/~benmoshe/DT/

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

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

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