Você tem muitos segmentos, nenhuma ordem ou orientação específica. Você não sabe quais realmente tocam ou se sobrepõem e quais são apenas próximas.
Para cada segmento, apenas o ponto inicial e o ponto final são importantes. O objetivo é fazer uma grande polilinha, a orientação dessa polilinha não é importante, eu acho.
Nesse caso, eu faria algum tipo de conjunto / matriz de segmentos, começando com o primeiro, que é inteiramente aleatório.
No pseudocódigo, faça 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 parecido? Esse é um nível muito alto. Você precisará lidar com casos de fronteira. Suponho que você conheça ou possa ter a maior distância / distância possível, porque será necessário excluir de alguma forma os pontos encontrados: se o ponto mais próximo possível estiver na outra extremidade da polilinha, isso não é uma opção :) A maneira mais fácil de lidar com isso é definir uma distância de intervalo máxima. Isso também limitará o número de pontos que você terá que procurar para cada segmento.
[EDIT: detalhe o find_segment_closes_to
]
Para deixar absolutamente claro como eu encontraria o segmento de fechamentos, escreverei primeiro uma abordagem muito grosseira:
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
Essa é uma abordagem muito grosseira, que irá percorrer todos os segmentos e verificar cada ponto final mais próximo.
Idealmente, você teria alguma estrutura de dados na qual poderia solicitar todos os pontos de partida e pontos finais que estão dentro do alcance e encontrar apenas o ponto mais próximo entre eles.
Isso ajuda? Espero que você comece.