Rastern Sie ein 2D-polygon
Brauche ich zum erstellen einer binären bitmap aus einer geschlossenen 2D-polygon dargestellt als eine Liste von Punkten. Könnten Sie bitte zeigen Sie mir auf eine effiziente und ausreichend einfache algorithmen zu tun, dass, oder, noch besser, einige C++ - code?
Vielen Dank!
PS: ich möchte vermeiden, das hinzufügen einer Abhängigkeit zu meinem Projekt. Allerdings, wenn Sie vorschlagen, eine open-source-Bibliothek, kann ich immer betrachten Sie den code, so kann es nützlich sein, auch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Magic google die phrase, die Sie wollen, ist entweder "non-zero-winding-Regel" oder "ungerade polygon fill".
Finden Sie auf der wikipedia-Einträge für:
Beide sind sehr einfach zu implementieren und ausreichend schnell für die meisten Zwecke. Mit etwas Geschick, kann man Sie geglättet als gut.
Können Sie das polygon fill-routine in Pygame. Blick auf die
draw_fillpoly
Funktion.Der Algorithmus ist ziemlich einfach. Es findet alle Positionen, die jedes segment schneidet entlang der Y-Achse. Diese Schnittpunkte werden sortiert und dann horizontal füllt jedes paar von Kreuzungen.
Dieser wird mit komplexen und sich überschneidenden Formen, aber offensichtlich konnte man crush dieser Algorithmus mit großen Mengen von Segmenten.
Komplexität ist O(Fläche in Pixel)
Für eine robuste Umsetzung der "gerade-ungerade-Regel"
Sehen Darel Rex Finley die Effiziente Polygon Füllen, oder Blender version es.
Dies ist eine ungerade/sogar füllen-Methode, die unterstützt sich selbst schneidenden Linien, ohne komplexen code zu erkennen, solche Situationen, und nicht davon abhängig, Wicklung (das polygon kann Umgekehrt werden, und die gleichen Ergebnisse liefern).
Update habe ich gemacht, eine optimierte version von Darel Rex ' s Methode, die verhindert, dass Schleifen über alle Koordinaten für jedes y-pixel.
Stand-alone-Implementierungen:
Während speedup wird wahrscheinlich exponentiell sein, Von einem schnellen test, rund 7,5 x schneller (11x beim entfernen
round
nennen), mit einem beliebigen handgezeichneten scribble über eine 2540x1600 region, YMMV.