多くのセグメントがあり、特定の順序や向きはありません。実際に接触または重複しているのがどれで、どちらが単に近いかはわかりません。
各セグメントでは、開始と終了のみが重要です。目標は、1つの大きなポリラインを作成することです。そのポリラインの方向は重要ではないと思います。
その場合、セグメントのセット/配列を作成します。最初のセグメントから始めます。これは完全にランダムです。
擬似コードで次のようなことをしてください
all_segments = set of all segments
# take the first segment out of set
new_polyline = all_segments.pop
until all_segments.empty?
start_segm = find_segment_closest_to(new_polyline.start_point)
remove_from_all_segments(start_segm)
expand_polyline_at_begin(new_polyline, start_segm)
end_segm = find_segment_closest_to(new_polyline.end_point)
expand_polyline_at_end(new_polyline, end_segm)
remove_from_all_segments(end_segm)
end
そんな感じ?それは非常に高いレベルです。境界ケースを処理する必要があります。私はあなたが知っているか、可能な限り最大のギャップ/距離を知っていると思います、何故か見つけられたポイントを除外することができる必要があるからです:最も近い可能なポイントがオプションではないよりもポリラインの反対側にある場合:)これを処理する最も簡単な方法は、最大ギャップ距離を定義することです。これにより、各セグメントについて調べる必要があるポイントの数も制限されます。
[編集:詳細をfind_segment_closes_to
]
クローズセグメントを見つける方法を完全に明確にするために、最初に非常に大まかなアプローチを記述します。
def find_segment_closes_to(point)
closest_point = nothing
closest_distance = MAX_GAP_RANGE
all_segments.each do |segment|
if distance(segment.end_point, point) < closest_distance
closest_point = segment.end_point
closest_segment = segment
closest_distance = distance(segment.end_point, point)
else if distance(segment.start_point, point) < closest_distance
closest_point = segment.start_point
closest_segment = segment
closest_distance = distance(segment.start_point, point)
end
end
# the closest segment
return closest_segment
end
これは非常に大雑把なアプローチであり、すべてのセグメントを反復処理し、最も近い各エンドポイントをチェックします。
理想的には、範囲内にあるすべての始点と終点を要求し、それらの中から最も近い点のみを見つけることができるいくつかのデータ構造があるでしょう。
それは役に立ちますか?それがあなたが始められることを願っています。