Vereinfachte Bresenham-line-Algorithmus: Was hat es *genau*?
Basierend auf Wikipedia-Artikel auf Bresenham ' s line algorithm, ich habe implementiert die vereinfachte version dort beschrieben, meine Java-Implementierung sieht wie folgt aus:
int dx = Math.abs(x2 - x1);
int dy = Math.abs(y2 - y1);
int sx = (x1 < x2) ? 1 : -1;
int sy = (y1 < y2) ? 1 : -1;
int err = dx - dy;
while (true) {
framebuffer.setPixel(x1, y1, Vec3.one);
if (x1 == x2 && y1 == y2) {
break;
}
int e2 = 2 * err;
if (e2 > -dy) {
err = err - dy;
x1 = x1 + sx;
}
if (e2 < dx) {
err = err + dx;
y1 = y1 + sy;
}
}
Nun verstehe ich, dass err
steuert das Verhältnis zwischen den Schritten auf der x-Achse im Vergleich zu den Schritten auf der y-Achse, aber nun soll ich, um zu dokumentieren, was der code tut, ich kann nicht klar Ausdrücken, was es ist, und warum genau die wenn-Anweisungen sind, wie Sie sind, und warum err
verändert die Art und Weise wie in dem code.
Wikipedia nicht auf genauere Erläuterungen oder Quellen, so Frage ich mich:
Was genau macht err
tun und warum sind dx
und dy
verwendet in genau der dargestellten Art und Weise zu pflegen, das richtige Verhältnis zwischen horizontalen und vertikalen Schritte, die mit diesem vereinfachten version von Bresenham ' s line algorithm?
InformationsquelleAutor der Frage riwi | 2011-11-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es gibt verschiedene Arten von Gleichungen für eine Linie, eine der am meisten vertraut wird
y=m*x+b
. Nun, wennm=dy/dx
undc = dx*b
danndx*y = dy*x + c
. Schreibenf(x) = dy*x - dx*y + c
haben wirf(x,y) = 0
iff(x,y)
ist ein Punkt auf der gegebenen Linie.Wenn Sie Voraus
x
eine Einheit,f(x,y)
änderungen durchdy
; wenn Sie Vorausy
eine Einheit,f(x,y)
änderungen durchdx
.In Ihrem code
err
stellt den aktuellen Wert des linearen funktionalef(x,y)
, und die Aussage Sequenzenund
repräsentieren voran
x
odery
eine Einheit (insx
odersy
Richtung), mit entsprechenden Auswirkungen auf die Funktion Wert. Wie schon erwähnt,f(x,y)
ist null für Punkte auf der Linie, positiv für Punkte auf einer Seite der Linie, und negativ für diejenigen, die auf der anderen. Dieif
tests bestimmen, ob voranx
wird näher an die gewünschte Zeile als vorany
oder Umgekehrt, oder beide.Die Initialisierung
err = dx - dy;
ist konzipiert zur Minimierung der offset-Fehler; wenn Sie die Luft zu sprengen Ihre Plotten Skala, sehen Sie, dass Ihre berechneten Zeile darf nicht sein, zentriert auf die gewünschte Zeile mit unterschiedlichen Initialisierungen.InformationsquelleAutor der Antwort James Waldby - jwpat7
Möchte nur hinzufügen, ein bisschen "warum" Informationen zu jwpat ausgezeichnete Antwort.
Den Punkt für die Verwendung der
f(x) = dy*x - dx*y + c
Formulierung ist die Beschleunigung der Berechnung. Diese Formulierung verwendet integer Arithmetik (schneller), in der Erwägung, dass die traditionelleny = mx + b
Formulierung verwendet floating point arithmetic (langsamer).InformationsquelleAutor der Antwort Willie Wheeler