如何使用JTS中的Delaunay三角剖分为点插值Z值的示例

时间:2012-11-02 21:08:52

标签: java geometry jts

这是一个相当补救的问题。我一直在查看JTS DelaunayTriangulationBuilder的文档,我不知道该如何做似乎应该是一件简单的事情。我希望得到一系列点,对它们进行三角测量,然后在该网格内插入随机点的Z值。从粗略阅读如何做到这一点并不明显。有任何想法吗?

2 个答案:

答案 0 :(得分:3)

在加载三角测量对象后,在其上调用getSubdivision()以获得三角测量。它使用quad-edge数据结构,稍后您将需要它。 (如果您知道半边缘或边缘边缘表示是什么,则更容易理解。)结果QuadEdgeSubdivision有一个方法locate,给定一个坐标,返回一个封闭的边缘之一三角形(作为四边形)。使用orig()获取其原点顶点,并使用dest()获取其目标顶点。获得oNext()的另一个边缘它的目标顶点是第三个顶点(也是dPrev()。origin()是相同的顶点)。现在您有三个顶点,将您的测试点表示为Vertex并调用interpolateZValue

例如:

public static double 
interpolateZ(DelaunayTriangulationBuilder triangulation,
             Coordinate coordinate) {
    QuadEdgeSubdivision quadEdgeSubdivision = triangulation.getSubdivision();
    QuadEdge edge = quadEdgeSubdivision.locate(coordinate);
    return new Vertex(coordinate.x, coordinate.y)
            .interpolateZValue(edge.orig(), edge.dest(), edge.oNext().dest());
}
但是,你是对的。如何通过阅读他们的API来做到这一点并不明显。

答案 1 :(得分:2)

我不熟悉JTS DelauneyTriangulationBuilder,但听起来你有一个点(x,y,z)的集合,并且你正在向三角形提交2D (x,y)对。这为您提供了(x,y)点的平面三角剖分,也是一个顶点为原始(x,y,z)点的网格。

一旦进行了三角测量,您希望在网格上找到与平面点(p,q,r)对应的点(p,q)。为此,请找到包含T的Delauney三角剖分的三角形(p,q)。找到相对于(p,q) T的{​​{3}},并使用这些来计算与{{1}的顶点对应的r值的加权平均z }}。加权平均值是您正在寻找的T值。换句话说,Z在网格上。