Ich brauche einen Algorithmus, der (ein bisschen) langsamer sein kann als der Bresenham line drawing algorithm, muss aber viel genauer sein. Mit 'genau' meine ich: Jeder berührte Pixel sollte gedruckt werden. Nicht mehr, aber auch nicht weniger! Das bedeutet, dass die Verwendung einer dickeren Linie oder ähnlichem keine Option ist, da zu viele Pixel beteiligt sind. Auch brauche ich kein Grafikframework oder ähnliches wie es war asked, ich brauche den Algorithmus! Die Anwendung ist nicht wirklich in "Grafiken" ist es in der geography area, wo Pixel "Kacheln" sind.Präziser Subpixel-Linienzeichnungsalgorithmus (Rasterisierungsalgorithmus)
Das Hauptproblem für mich ist, dass ich Subpixel-Präzision brauche, was bedeutet, dass eine Linie bei 0,75/0,33 und nicht nur bei 0/0 beginnen könnte, wie es bei ganzzahligen Werten der Fall ist. Ich habe versucht, eine funktionierende Lösung für die letzten Stunden zu erstellen, kann aber nicht funktionieren - es gibt zu viele Randfälle.
Zuerst dachte ich, eine Anti-Alias-Version wie der Algorithmus von Wu sollte es machen, aber es druckt zu viele Pixel (vor allem für Start- und Endpunkte) und in bestimmten Fällen fehlen noch einige Pixel z. für sehr kurze Zeilen.
Dann habe ich versucht, Bresenham arbeiten, wo ich das zweite "wenn" mit "else if" ersetzt, wie here, und es ist näher, aber immer noch nicht da. Dann habe ich versucht, den Bresenham von Integer- auf Float-Präzision zu bewegen, was zu einer Endlosschleife führte (als die x, y-Werte über die Endbedingung if (y1 == y2 && x1 == x2)
gesprungen sind).
Ich könnte die naive line drawing Lösung verwenden, aber welche delta
sollte ich verwenden? Z.B. Wenn ich 0.1 verwende, verpasse ich immer noch einige Pixel und benutze kleinere Werte, es wird wahrscheinlich zu lange dauern (und immer noch Pixel vermissen).
Eine funktionierende Lösung in C/Java/... wäre willkommen. Zumindest sollte es für Octant 1 funktionieren, aber eine ausgewachsene Lösung wäre noch schöner.
Update: Ich kam auf folgende Idee: Mit der naiven Linienrasterisierung können Sie für jeden Punkt 4 Pixel-Kandidaten berechnen. Überprüfen Sie dann diese 4 Pixel, wenn die Linie sie wirklich kreuzt. Aber ich bin mir nicht sicher, ob die Linie/Kasten-Kreuzung schnell genug sein kann.
"jedes berührte Pixel sollte gedruckt werden", auch wenn 0,01 von einem Pixel oder weniger mit der Linie schneidet? Welche Form haben beide Enden der Linie (rund, konkav, konvex, flach)? – Tarik
ja, wenn es eine mathematische Schnittmenge gibt, sollte sie enthalten sein (natürlich können wir die üblichen Rundungsfehler annehmen). Die Enden der Linie sollten flach sein (kein Flaum oder Antialiasing, nur das 'mathematische' Ende) – Karussell
was ist mit Farbe? ist die Linie Farbkonstante oder sollte entsprechend der verwendeten Fläche von Pixel wie Anti-Aliasing interpoliert werden? – Spektre