Tiene muchos segmentos, sin un orden u orientación específicos. No sabes cuáles se tocan o se superponen, y cuáles son simplemente cercanas.
Para cada segmento, solo el comienzo y el punto final son importantes. El objetivo es hacer una gran polilínea, supongo que la orientación de esa polilínea no es importante.
En ese caso, haría algún tipo de conjunto / matriz de segmentos, comience con el primero, que es completamente aleatorio.
En pseudocódigo hacer algo como
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
¿Algo como eso? Ese es un nivel muy alto. Necesitará manejar casos límite. Supongo que sabe o podría la mayor brecha / distancia posible, porque necesitará poder excluir de alguna manera los puntos encontrados: si el punto más cercano posible está en el otro extremo de la polilínea, entonces no es una opción :) La forma más fácil de manejar eso es definir una distancia máxima de separación. Esto también limitará el número de puntos que tendrá que mirar para cada segmento.
[EDITAR: detalle el find_segment_closes_to
]
Para dejar absolutamente claro cómo encontraría el segmento de cierre, primero escribiré un enfoque muy burdo:
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
Este es un enfoque muy burdo, que iterará sobre todos los segmentos y verificará cada punto final que sea el más cercano.
Idealmente, tendría una estructura de datos en la que podría solicitar todos los puntos de inicio y finalización que se encuentran dentro del rango y solo encontrar el punto más cercano entre ellos.
¿Eso ayuda? Espero que te ayude a comenzar.