2011-11-02 24 views
19

Mam listę punktów, które tworzą krzywą, i chciałbym zmniejszyć liczbę punktów, ale nadal zachować ogólny kształt krzywej.Jak zmniejszyć liczbę punktów na krzywej przy zachowaniu jej ogólnego kształtu?

Zasadniczo, chcę iść z tego:

enter image description here

do tego:

enter image description here

Więc algorytm usunie punkty, które są zbędne, ale zachować te, które naprawdę zdefiniować kształt (jak punkty u dołu krzywej). Czy jest jakiś znany algorytm do tego? Oczekuję, że tak jest, ale nie jestem pewien, czego szukać w Google. Każda pomoc będzie doceniona.

+5

nie mam żadnych algorytmy dla ciebie, ale zazwyczaj odnoszą się do tego procesu jako 'wierzchołka decimation'. Być może to pomoże w twoim Googlingu. –

Odpowiedz

23
+0

Dzięki, skończyłem używając algorytmu Douglasa-Peuckera, który działa świetnie. –

+1

@ this.lau_ Czy możesz podzielić się swoją implementacją dla tego algorytmu. – EmptyData

13

Istnieje kilka algorytmów do tego.

Najprostszy to najprawdopodobniej po prostu usuwanie punktu, którego kąt pomiędzy sąsiednimi punktami jest najbliższy 180 stopni, do pewnego progu, lub do momentu osiągnięcia pożądanej liczby punktów.

Jeśli krzywa jest gładka jak na zdjęciu, prawdopodobnie uzyskasz lepsze przybliżenia (lub mniej punktów, jeśli sobie tego życzysz), stosując na przykład krzywe Beziera.

+0

Dzięki, ale myślę, że pierwsza sugestia nie zadziałałaby dla mnie, ponieważ moje dane nie są tak czyste, jak w przykładzie. Mogą istnieć małe ruchy punktów bardzo blisko siebie, które powinny być zredukowane do jednego punktu niezależnie od kąta. Użycie krzywej Beziera prawdopodobnie spowodowałoby, że problem byłby bardziej złożony, zamiast upraszczać go i spowalniało renderowanie. –