ラインの配列があり、それを使用してマップにベクトルを描画しています。
重なった 2 つの線 (またはそれらの間の距離が短い) を 1 つの線に置き換えたい。それを行うアルゴリズムを教えてください。
この問題を理解するのに役立つ図を次に示します。
入力行:
アルゴリズムを実行した後、次の図に示す出力を取得したいと思います。
PS: Line はポイントの ArrayList です。
互いに一定の距離内にある任意の頂点のペアをマージします (それらの位置が等しくなるように設定します)。
各線上で各頂点に最も近い点を見つけます。十分に近い場合は、その点で線を分割し、点をマージします。
始点と終点がまったく同じ重複行を削除します。
たとえば、点 A と B で定義された線と、点 C で定義された別の線があるとします (左上の図)。点 D は、点から線への最短距離関数を使用して見つけることができます。D が C から遠すぎる場合は無視します。そうでない場合は、線 AB を 2 つの線 AD と DB に分割し、位置 C のすべての点を位置 D に移動して、右側の図を取得します。
この質問は、「2 つの範囲が交差しますか?交差しない場合、それらの間の距離は?」という質問に似ています。答えは、どの範囲が最小であるかをすでに知っているかどうか、および範囲内のポイントが正しく順序付けられているかどうか (つまり、線が同じ方向を持っているかどうか) によってわずかに異なります。
したがって、予備的なアルゴリズムのアプローチは次のようになります。
if (a.start < b.start) {
first = a;
second = b;
} else {
first = b;
second = a;
}
今すぐ距離を見つけてみましょう:
distance = max(0, second.start - first.end);
これで、最短距離の値の範囲が必要になりました。これは、線を 1 に重ね合わせる方法に応じて異なります。と呼ばれる配列にそれらを保持しているとしましょう:
arrayRange[];
今なら、
for(int 1=0;i<arrayRange.length;i++)
{
if(distance is one of the elements of the arrayRange)
then,
callFunctionSuperImposeLines(distance,a,intersectionPoint,a.end,b,b.end);
}