我想对一个不规则采样的函数 z(x,y)
进行线性插值,并基于德劳内三角剖分。假设我有一座山丘,我已经获得了一个德劳内三角剖分:
我知道每个三角形顶点(样本)处的高度z
。我想知道在任意点 (x,y)
处的高度 z
。
如何确定包含点
(x,y)
的三角形?一旦知道这一点,我想在三角形的三个顶点之间进行插值应该是相当简单的。你知道是否有现成的实现吗?可能包括插值部分?我相信肯定有某个开源实现这种方法。我特别感兴趣 Java(源代码或 JAR),但其他语言的版本也可能有用。
我想对一个不规则采样的函数 z(x,y)
进行线性插值,并基于德劳内三角剖分。假设我有一座山丘,我已经获得了一个德劳内三角剖分:
我知道每个三角形顶点(样本)处的高度z
。我想知道在任意点 (x,y)
处的高度 z
。
如何确定包含点 (x,y)
的三角形?一旦知道这一点,我想在三角形的三个顶点之间进行插值应该是相当简单的。
你知道是否有现成的实现吗?可能包括插值部分?我相信肯定有某个开源实现这种方法。我特别感兴趣 Java(源代码或 JAR),但其他语言的版本也可能有用。
如果你不经常使用的话,你可能会发现第二种和第三种方法的预处理时间比通过穷举搜索找到三角形的时间更长。
您可以使用Delaunay分层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
可以在 Voronoi 图上建立一个点定位数据结构,以回答最近邻查询,其中需要找到距离给定查询点最近的对象。最近邻查询具有众多应用场景。例如,可能想要找到最近的医院或数据库中最相似的对象。
我无法帮助您解决具体问题,但希望这能指引您走向正确的方向。
我猜您也可以使用R-tree,并将其链接到三角形上。
在谷歌上快速搜索“java r-tree”应该会帮助您找到现有的库。
我在这里找到了一个可行的实现:http://www.cs.bgu.ac.il/~benmoshe/DT/
find
方法可以找到包含给定点的三角形,而z
方法则进行平面插值。
不幸的是,它是一个已编译的JAR文件,所以我不知道算法是什么,但我感觉它会像@Jiri和@DJClayworth建议的那样“遍历三角剖分”。
同样不幸的是,这个JAR使用的命名方式相当不常规。我可能最终会编写一个具有更好命名方式的包装类。
我对此很新,但如果您能够引用每个2D三角形,并使用哈希映射将键作为唯一数字编码为图像中的颜色,那么您可以用该实心颜色绘制三角形。
要找到三角形,您可以通过解码所请求位置处的颜色来检索键。
绘制三角形时会有成本,但查找应该很快。
我认为这个想法可以抽象到3D网格中。