Ce qui suit est une variante de l'algorithme Ramer-Douglas-Peucker pour les graphes 1.5D:
- Calculer l'équation de la ligne entre le premier et le dernier point
- Vérifiez tous les autres points pour trouver ce qui est le plus éloigné de la ligne
- Si le pire moment est inférieure à la tolérance que vous voulez alors sortir un seul segment
- Sinon, appeler récursive considérant deux sous-réseaux, en utilisant le pire moment que séparateur
En python cela pourrait être
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)
La sortie est [(0, 0), (30, 30), (50, 0)]
.
A propos de la syntaxe python pour les tableaux qui peuvent être non évidente:
x[a:b]
est la partie du tableau à partir index a
jusqu'à l'indice b
(exclu)
x[n:]
est le tableau fait en utilisant des éléments de x
de n
index à la fin
x[:n]
est la matrice faite en utilisant les premiers éléments de n
x
a+b
lorsque a
et b
sont des tableaux signifie concaténation
x[-1]
est le dernier élément d'un tableau
Un exemple des résultats de l'exécution de cette mise en œuvre sur un graphique avec 100,000 points avec les valeurs croissantes de eps
peut être vu here.
Peut-être un peu plus précis: Quelle bibliothèque utilisez-vous, comment sont stockés les points? – slhck
@slhck Je suis à la recherche d'un algorithme, je ne vois pas comment la bibliothèque pourrait affecter cela.Les points sont stockés sous la forme d'une grande liste de valeurs (x, y). – nc3b
Vouliez-vous vraiment dire "au hasard"? Ou avez-vous réellement voulu dire "arbitraire"? Ou peut-être "imprévisible"? –