セグメント S とポリゴン P が与えられた場合、ポリゴン P と交差する S のサブセグメントの全長を返す高速なアルゴリズムはありますか?
注: P は、閉じた LineString (つまり、最初と最後の点が等しい点の配列) によって定義されます。P には「穴」はありませんが、凹型および/または自己交差する可能性があります。
注: 最終的な目標は、交差するすべてのサブセグメントの合計の長さです。これらすべての明示的な配列を取得せずにこれをより高速に実行できれば、なおさらです。
ボーナス ポイント: 上記のアルゴリズムの Java 実装。結果として得られるソリューションが高速である限り、JTS のようなライブラリを使用しても問題ありません。
JTS を使用した単純なソリューションは既に存在しますが、自己交差ポリゴンをサポートしておらず、最速ではないと思います。このソリューションでは、Polygon オブジェクト (P の場合)、2 ポイントの LineString オブジェクト (S の場合) を作成し、結果の交点の長さを取得します。
これを行うコードは次のとおりです。
GeometryFactory fact = new GeometryFactory();
WKTReader wktRdr = new WKTReader(fact);
String wktP = "POLYGON((40 100, 40 20, 120 20, 120 100, 60 40, 40 100))";
String wktS = "LINESTRING(20 60, 160 60)";
Geometry pl = wktRdr.read(wktP);
Geometry ls = wktRdr.read(wktS);
Geometry in = pl.intersection(ls);
System.out.println("P = " + pl);
System.out.println("S = " + ls);
System.out.println("P intersection S = " + in);
System.out.println("S length = " + ls.getLength());
System.out.println("P intersection S length = " + in.getLength());
編集: 自己交差ポリゴンに関する考慮事項: 解決策は、最速ではないかもしれませんが、自己交差ポリゴンを複数の非自己交差ポリゴンに分割して前処理することを含む可能性があります。
この問題に関するいくつかの説明と疑似コードは次のとおりです。 自己交差したPath2Dを複数の自己交差しないパスに分割するアルゴリズム?