Frage

Ich habe ein 2D geschlossen Polylinie, die nach vernünftigem Ermessen glatt ist. Die Ecken, die die Polylinie definieren jedoch nicht gleichmäßig beabstandet. Manchmal werden zwei sehr nahe sein, manchmal so viele wie vier wird sehr nah beieinander sein.

Ich mag die Polylinie glätten, sondern ein regelmäßiger Mittelungsalgorithmus neigt dazu, den Bereich zu verkleinern:

for (int i = 0; i < (V.Length-1); i++)
{
   PointF prev = V[i-1]; //I have code that wraps the index around.
   PointF next = V[i+1];       
   PointF pt = V[i];

   float ave_x = one_third * (prev.X + next.X + pt.X);
   float ave_y = one_third * (prev.Y + next.Y + pt.Y);

   smooth_polyline[i] = new PointF(ave_x, ave_y);
}

Meine Polylinien enthalten Tausende von Punkten und der Winkel zwischen zwei benachbarten Segmenten ist in der Regel weniger als 1 Grad.

Gibt es einen besseren Weg, um diese Kurven zu glätten, etwas das wird Raum die Ecken mehr gleichmäßig, ohne den Bereich zu beeinflussen zu viel?

War es hilfreich?

Lösung

Sie könnten die „Kurve simplication“ Literatur sehen, wie der Douglas-Peucker-Algorithmus oder dieses Papier http://www.cs.ait.ac.th/~guha/papers/simpliPoly.pdf .

Dies wird wahrscheinlich nicht gut funktionieren, wenn Sie sogar gleichmäßigen Abstand Ecken müssen, wenn die benachbarten Liniensegmente definieren sie fast kollinear sind.

Andere Tipps

Ich glaube, Sie suchen Chaikins Algorithmus . Es gibt eine Variante dieser Idee, dass die geglättete Kurve (anstelle von „innen“ von) den Kontrollpunkt passiert direkt durch macht, aber ich habe Probleme es im Moment googeln.

Sie können auch Splines zu interpolieren - nur in Wikipedia suchen

Jemand hat portiert 2 Glättungsalgorithmen zu C #, mit einer CPOL (kostenlos) Lizenz finden Sie hier:

https://github.com/RobinCK/smooth-polyline

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top