Anda memiliki banyak segmen, tanpa urutan atau orientasi tertentu. Anda tidak tahu mana yang benar-benar menyentuh atau tumpang tindih, dan mana yang dekat.
Untuk setiap segmen hanya titik awal dan titik akhir yang penting. Tujuannya adalah untuk membuat satu polyline besar, orientasi polyline itu tidak penting, kurasa.
Dalam hal ini saya akan membuat beberapa set / array segmen, mulai dengan yang pertama, yang sepenuhnya acak.
Dalam pseudocode, lakukan sesuatu seperti
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
Sesuatu seperti itu? Itu adalah level yang sangat tinggi. Anda harus menangani kasus batas. Saya kira Anda tahu atau mungkin celah / jarak terbesar yang mungkin, karena Anda akan perlu untuk entah bagaimana mengecualikan poin yang ditemukan: jika titik terdekat yang mungkin adalah di ujung polyline daripada itu bukan pilihan :) The Cara termudah untuk menanganinya adalah dengan menentukan jarak gap maksimum. Ini juga akan membatasi jumlah poin yang harus Anda perhatikan untuk setiap segmen.
[EDIT: detailkan find_segment_closes_to
]
Untuk membuatnya sangat jelas bagaimana saya akan menemukan segmen yang ditutup, saya akan menulis terlebih dahulu pendekatan yang sangat kasar:
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
Ini adalah pendekatan yang sangat kasar, yang akan mengulangi semua segmen dan memeriksa setiap titik akhir yang terdekat.
Idealnya Anda akan memiliki beberapa struktur data di mana Anda bisa meminta semua titik awal dan akhir yang berada dalam jangkauan dan hanya menemukan titik terdekat di antara mereka.
Apakah itu membantu? Saya harap ini memulainya.