Bạn có rất nhiều phân khúc, không có thứ tự hoặc định hướng cụ thể. Bạn không biết cái nào thực sự chạm hoặc chồng lên nhau, và cái nào chỉ đơn thuần là gần gũi.
Đối với mỗi phân khúc chỉ có điểm bắt đầu và điểm cuối là quan trọng. Mục tiêu là tạo ra một đa tuyến lớn, định hướng của đa tuyến đó không quan trọng, tôi đoán vậy.
Trong trường hợp đó tôi sẽ tạo một số loại tập hợp / mảng các phân đoạn, bắt đầu với phân đoạn đầu tiên, hoàn toàn ngẫu nhiên.
Trong mã giả làm một cái gì đó như
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
Một cái gì đó như thế? Đó là một mức độ rất cao. Bạn sẽ cần phải xử lý các trường hợp ranh giới. Tôi đoán bạn biết hoặc có thể khoảng cách / khoảng cách lớn nhất có thể, bởi vì bạn sẽ cần phải loại trừ một số điểm được tìm thấy: nếu điểm gần nhất có thể nằm ở đầu kia của đa tuyến thì đó không phải là một lựa chọn :) Cách dễ nhất để xử lý đó là xác định khoảng cách tối đa. Điều này cũng sẽ giới hạn số điểm bạn sẽ phải xem xét cho từng phân khúc.
[EDIT: chi tiết find_segment_closes_to
]
Để làm cho nó hoàn toàn rõ ràng làm thế nào tôi sẽ tìm thấy phân đoạn đóng, trước tiên tôi sẽ viết một cách tiếp cận rất thô thiển:
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
Đây là một cách tiếp cận rất thô sơ, sẽ lặp đi lặp lại trên tất cả các phân khúc và kiểm tra từng điểm cuối gần nhất.
Lý tưởng nhất là bạn sẽ có một số cơ sở hạ tầng nơi bạn có thể yêu cầu tất cả các điểm bắt đầu và điểm cuối nằm trong phạm vi và chỉ tìm điểm gần nhất trong số đó.
cái đó có giúp ích không? Tôi hy vọng nó sẽ giúp bạn bắt đầu.