Sie haben viele Segmente, keine bestimmte Reihenfolge oder Ausrichtung. Sie wissen nicht, welche tatsächlich berühren oder überlappen und welche nur nahe beieinander liegen.
Für jedes Segment ist nur der Anfangs- und Endpunkt wichtig. Das Ziel ist es, eine große Polylinie zu erstellen. Die Ausrichtung dieser Polylinie ist nicht wichtig, denke ich.
In diesem Fall würde ich eine Art Satz / Array von Segmenten erstellen, beginnend mit dem ersten, der völlig zufällig ist.
Im Pseudocode mache so etwas
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
So ähnlich? Das ist ein sehr hohes Niveau. Sie müssen Grenzfälle behandeln. Ich vermute, Sie kennen oder könnten die größtmögliche Lücke / Entfernung kennen, weil Sie in der Lage sein müssen, gefundene Punkte irgendwie auszuschließen: Wenn sich der nächstmögliche Punkt am anderen Ende der Polylinie befindet, ist dies keine Option :) Die Der einfachste Weg, dies zu handhaben, besteht darin, einen maximalen Spaltabstand zu definieren. Dies begrenzt auch die Anzahl der Punkte, die Sie für jedes Segment suchen müssen.
[EDIT: Detail die find_segment_closes_to
]
Um absolut klar zu machen, wie ich das Closes-Segment finden würde, werde ich zunächst einen sehr groben Ansatz schreiben:
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
Dies ist ein sehr grober Ansatz, der alle Segmente durchläuft und nach jedem Endpunkt sucht, der am nächsten liegt.
Idealerweise hätten Sie eine Datenstruktur, in der Sie nach allen Start- und Endpunkten fragen könnten, die in Reichweite liegen, und nur den nächstgelegenen Punkt unter diesen finden könnten.
Hilft das? Ich hoffe, es bringt Sie zum Laufen.