Das Folgende ist eine Variation des Ramer-Douglas-Peucker Algorithmus für 1.5d Graphen:
- Berechnen Sie die Liniengleichung zwischen dem ersten und letzten Punkt
- Überprüfen Sie alle anderen Punkte zu finden, was die entfernteste ist aus die Linie
- Wenn der schlechteste Punkt unterhalb der Toleranz wollen Sie gibt dann ein einzelnes Segment
- Ansonsten rekursiv ruft unter Berücksichtigung zwei Unteranordnungen, den schlechtesten Punkt als Splitter mit
In Python könnte dies
def simplify(pts, eps):
if len(pts) < 3:
return pts
x0, y0 = pts[0]
x1, y1 = pts[-1]
m = float(y1 - y0)/float(x1 - x0)
q = y0 - m*x0
worst_err = -1
worst_index = -1
for i in xrange(1, len(pts) - 1):
x, y = pts[i]
err = abs(m*x + q - y)
if err > worst_err:
worst_err = err
worst_index = i
if worst_err < eps:
return [(x0, y0), (x1, y1)]
else:
first = simplify(pts[:worst_index+1], eps)
second = simplify(pts[worst_index:], eps)
return first + second[1:]
print simplify([(0,0), (10,10), (20,20), (30,30), (50,0)], 0.1)
sein Der Ausgang ist [(0, 0), (30, 30), (50, 0)]
.
über Python Syntax für Arrays, die nicht offensichtlich sind:
x[a:b]
ist der Teil der Anordnung von Index a
bis Index b
(ausgeschlossen)
x[n:]
ist die Array-Elemente von unter Verwendung x
aus index n
zum Ende
x[:n]
ist das Array unter Verwendung erste n
Elemente x
- wenn
a
und b
Arrays sind, bedeutet Verkettungs
x[-1]
das letzte Element eines Arrays ist
Ein Beispiel für die Ergebnisse in einem Diagramm mit 100.000 Punkten mit steigenden Werten von eps
diese Umsetzung ausgeführt wird, kann sein gesehen here.
Vielleicht etwas genauer: Welche Bibliothek benutzen Sie, wie sind die Punkte gespeichert? – slhck
@slhck Ich bin auf der Suche nach einem Algorithmus, ich sehe nicht, wie die Bibliothek dies beeinflussen könnte.Die Punkte werden als eine große Liste von (x, y) -Werten gespeichert. – nc3b
Hast du wirklich "zufällig" gemeint? Oder meintest du eigentlich "willkürlich"? Oder vielleicht "unvorhersehbar"? –