これはかなり是正的な質問です。私はJTSDelaunayTriangulationBuilderのドキュメントを見てきましたが、それが単純なことであると思われることをどのように行うかについて途方に暮れています。一連のポイントを取得し、それらを三角測量してから、そのメッシュ内のランダムなポイントのZ値を補間したいと思います。これを行う方法をざっと読んでも、それは自明ではありません。何か案は?
2 に答える
三角形分割オブジェクトをロードしたら、それを呼び出しgetSubdivision()
て三角形分割を取得します。後で必要になるクアッドエッジデータ構造を使用します。(ハーフエッジまたはウィングエッジ表現が何であるかを知っていると、理解しやすくなります。)結果には、座標が与えられると、囲んでいる三角形のエッジの1つを(クワッドエッジとして)返すQuadEdgeSubdivision
メソッドがあります。locate
で起点の頂点を取得し、で終点の頂点を取得orig()
しdest()
ます。デスティネーション頂点が3番目の頂点である別のエッジを取得しますoNext()
(dPrev()。origin()も同じ頂点です)。これで3つの頂点ができたので、テストポイントをaとして表し、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を読んでこれを行う方法は明らかではありません。
私はJTSDelauneyTriangulationBuilderに精通していませんが、ポイントのコレクションがあり(x,y,z)
、2D(x,y)
ペアを三角測量器に送信しているようです。これにより、ポイントの平面三角形分割が得られますが、(x,y)
頂点が元の(x,y,z)
ポイントであるメッシュも得られます。
三角形分割ができたら(p,q,r)
、平面点に対応するメッシュ上の点を見つけたいと思います(p,q)
。これを行うには、T
を含むDelauney三角形分割の三角形を見つけます(p,q)
。に相対的な重心座標を見つけ、これらを使用して、の頂点に対応する値の加重平均を計算します。その加重平均はあなたが探している値です。言い換えれば、はメッシュ上にあります。(p,q)
T
r
z
T
Z
(p,q,r)