Bresenham's line drawing algorithm ist bekannt und recht einfach zu implementieren.Wie kann man Bresenhams Linienzeichnungsalgorithmus mit Sub-Pixel-Bias verwenden?
Während es fortgeschrittenere Möglichkeiten gibt, Anti-Ail-Linien zu zeichnen, möchte ich eine Funktion schreiben, die eine Linie ohne Anti-Alias-Linie mit einer Pixelbreite auf Basis von Fließkomma-Koordinaten zeichnet.
Dies bedeutet, dass, während das erste und das letzte Pixel gleich bleiben, die Pixel, die zwischen ihnen gezeichnet werden, eine Verzerrung aufweisen, die auf der Subpixelposition beider Endpunkte basiert.
Im Prinzip sollte das nicht so kompliziert sein, da ich annahm, dass es möglich ist, die Subpixel-Offsets zu verwenden, um einen ursprünglichen error
-Wert zu berechnen, und alle anderen Teile des Algorithmus bleiben gleich .
Kein Subpixel-Offset:
X###
###X
die rechte Hand Punkt hat eine Subpixel-Position in der Nähe der oberen Unter der Annahme, könnte die Zeile wie folgt aussehen:
Mit Sub-Pixel-Offset zum Beispiel:
X######
X
Gibt es eine versuchte & wahre Methode zum Zeichnen einer Linie, die Sub-Pixel-Koordinaten berücksichtigt?
Hinweis:
- Das ist wie eine gemeinsame Operation scheint, habe ich OpenGL-Treiber nehmen dies zum Beispiel in Betracht gesehen -
GL_LINE
verwenden, obwohl von einer schnellen Suche ich keine Antworten gefunden haben online - vielleicht falsche Suchbegriffe verwendet? - Auf einen Blick diese Frage sieht aus wie es könnte ein Duplikat sein von:
Precise subpixel line drawing algorithm (rasterization algorithm)
Aber das fragt nach dem Zeichnen einer breiten Linie, das ist über die Verrechnung einer einzelnen Pixelzeile. - Wenn es keine Standardmethode gibt, werde ich versuchen, dies zu schreiben, um als Antwort zu posten.
Ich nehme an, könnte einen Fixpunkt-Skalierungsfaktor anwenden und den anfänglichen Fehlerausdruck aus dem Bruchteil des Startpunkts evaluieren. Ich kann jedoch den Vorteil von Bresenham gegenüber einfacheren Algorithmen nicht sehen, sagen wir direkt die Funktion oder eine Festpunkt-DDA auswerten? Die Optimierung des Setups scheint kaum ein Gewinn zu sein, es sei denn, Ihre durchschnittlichen Zeilen sind winzig, und ich würde mich schwer tun, in jedem Fall eine Division bei der Berechnung des Fehler-Samens zu vermeiden. – doynax
Während Festpunkt-DDA ist wahrscheinlich eine gute Lösung, möchte ich zufrieden sein, dass die Anwendung von Voreingenommenheit auf Bresenham-Methode, wie in der Frage beschrieben - aus irgendeinem Grund nicht praktikabel ist. Ich kann nicht wirklich viele Annahmen darüber machen, wie viele und welche Länge die Linien haben könnten, aber ich würde gerne in etwa die gleiche Leistung beibehalten, abgesehen von einem kleinen Geschwindigkeitsanstieg von der anfänglichen Einrichtung. – ideasman42
Ich denke, Sie würden mit 'e = Frac (x1) * (y2 - y1) + Frac (y1) * (x2 - x1)', obwohl mit den Koordinaten in Fixpunkt, um die Rundungsfehler zu vermeiden. Mein Punkt ist, dass der DDA Innerloop (im Grunde eine Addition und eine Verschiebung) in der Regel schneller ist als Bresenham, mit dem Nachteil, dass ein kleiner Initialisierungstreffer typisch irrelevant ist, es sei denn, Ihre Linien sind sehr kurz oder Division sehr teuer. – doynax