logo

Bresenhams Linienalgorithmus

Dieser Algorithmus wird für die Scankonvertierung einer Linie verwendet. Es wurde von Bresenham entwickelt. Es handelt sich um eine effiziente Methode, da sie nur ganzzahlige Additions-, Subtraktions- und Multiplikationsoperationen umfasst. Diese Vorgänge können sehr schnell ausgeführt werden, sodass Linien schnell generiert werden können.

Bei dieser Methode wird als nächstes dasjenige Pixel ausgewählt, das den geringsten Abstand von der wahren Linie hat.

Zeichenfolge enthält Java

Die Methode funktioniert wie folgt:

Nehmen Sie ein Pixel P an1'(X1',Und1'), wählen Sie dann die nachfolgenden Pixel aus, während wir uns bis zur Nacht vorarbeiten, eine Pixelposition nach der anderen in horizontaler Richtung in Richtung P2'(X2',Und2').

Wählen Sie bei jedem Schritt einmal ein Pixel aus

Das nächste Pixel ist

  1. Entweder der rechts daneben (untere Grenze für die Linie)
  2. Einer oben rechts und oben (obere Grenze für die Linie)

Die Linie wird am besten durch die Pixel angenähert, die am wenigsten vom Pfad zwischen P entfernt sind1',P2'.

Bresenham

Um das nächste zwischen dem unteren Pixel S und dem oberen Pixel T auszuwählen.
Wenn S gewählt wird
Wir haben xi+1=xich+1 und yi+1=yich
Wenn T gewählt wird
Wir haben xi+1=xich+1 und yi+1=yich+1

Die tatsächlichen y-Koordinaten der Linie bei x = xi+1Ist
y=mxi+1+b

Bresenham

Der Abstand von S zur tatsächlichen Linie in y-Richtung
s = y-yich

Der Abstand von T zur tatsächlichen Linie in y-Richtung
t = (yich+1)-y

Betrachten Sie nun den Unterschied zwischen diesen beiden Abstandswerten
s - t

Wann (s-t)<0 ⟹ s < t< p>

Das nächstgelegene Pixel ist S

Wenn (s-t) ≧0 ⟹ s

Das nächstgelegene Pixel ist T

Datum in String konvertieren

Dieser Unterschied ist
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1

Bresenham

Ersetzen von m durch Bresenhamund Einführung einer Entscheidungsvariablen
Dich=△x (s-t)
Dich=△x (2 Bresenham(Xich+1)+2b-2yich-1)
=2△xyich-2△y-1△x.2b-2yich△x-△x
Dich=2△y.xich-2△x.yich+c

Wobei c= 2△y+△x (2b-1)

Wir können die Entscheidungsvariable d schreibeni+1für den nächsten Slip-On
Di+1=2△y.xi+1-2△x.yi+1+c
Di+1-Dich=2△y.(xi+1-Xich)- 2△x(yi+1-Undich)

Da x_(i+1)=xich+1, das haben wir
Di+1+dich=2△y.(xich+1-xich)- 2△x(yi+1-Undich)

Sonderfälle

Wenn das ausgewählte Pixel das oberste Pixel T ist (d. h. dich≧0)⟹ undi+1=yich+1
Di+1=dich+2△y-2△x

Wenn das ausgewählte Pixel das untere Pixel T ist (d. h. dich<0)⟹ yi+1=yich
Di+1=dich+2△y

Abschließend berechnen wir d1
D1=△x[2m(x1+1)+2b-2y1-1]
D1=△x[2(mx1+b-y1)+2m-1]

Da mx1+b-yich=0 und m = , wir haben
D1=2△y-△x

Vorteil:

1. Da es sich nur um Ganzzahlarithmetik handelt, ist es einfach.

Java-String-Join

2. Es vermeidet die Generierung doppelter Punkte.

3. Es kann mit Hardware implementiert werden, da keine Multiplikation und Division verwendet wird.

4. Im Vergleich zu DDA (Digital Differential Analyzer) ist es schneller, da keine Gleitkommaberechnungen wie der DDA-Algorithmus erforderlich sind.

Nachteil:

1. Dieser Algorithmus ist nur für das einfache Zeichnen von Linien gedacht. Die Initialisierung ist nicht Teil des Linienalgorithmus von Bresenham. Um glatte Linien zu zeichnen, sollten Sie sich also einen anderen Algorithmus ansehen.

Bresenhams Linienalgorithmus:

Schritt 1: Algorithmus starten

Schritt 2: Variable x deklarieren1,X2,Und1,Und2,d,i1,ich2,dx,dy

Schritt 3: Geben Sie den Wert von x ein1,Und1,X2,Und2
Wo x1,Und1sind Koordinaten des Startpunkts
Und x2,Und2sind Koordinaten des Endpunkts

Java enthält Teilzeichenfolge

Schritt 4: Berechnen Sie dx = x2-X1
Berechnen Sie dy = y2-Und1
Berechnen Sie i1=2*du
Berechnen Sie i2=2*(dy-dx)
Berechnen Sie d=i1-dx

Schritt 5: Betrachten Sie (x, y) als Ausgangspunkt und xEndeals maximal möglicher Wert von x.
Wenn dx<0
Dann ist x = x2
y = y2
XEnde=x1
Wenn dx > 0
Dann ist x = x1
y = y1
XEnde=x2

Schritt 6: Punkt an (x,y)-Koordinaten generieren.

Schritt 7: Überprüfen Sie, ob eine ganze Zeile generiert wird.
Wenn x > = xEnde
Stoppen.

Schritt 8: Berechnen Sie die Koordinaten des nächsten Pixels
Wenn d<0
Dann ist d = d + i1
Wenn d ≧ 0
Dann ist d = d + i2
Erhöhe y = y + 1

tostring-Methode Java

Schritt 9: Erhöhe x = x + 1

Schritt 10: Zeichnen Sie einen Punkt mit den neuesten (x, y)-Koordinaten

Schritt 11: Gehen Sie zu Schritt 7

Schritt 12: Ende des Algorithmus

Beispiel: Start- und Endposition der Linie sind (1, 1) und (8, 5). Finden Sie Zwischenpunkte.

Lösung: X1=1
Und1=1
X2=8
Und2=5
dx= x2-X1=8-1=7
du=y2-Und1=5-1=4
ICH1=2* ∆y=2*4=8
ICH2=2*(∆y-∆x)=2*(4-7)=-6
d = I1-∆x=8-7=1

X Und d=d+I1oder ich2
1 1 d+I2=1+(-6)=-5
2 2 d+I1=-5+8=3
3 2 d+I2=3+(-6)=-3
4 3 d+I1=-3+8=5
5 3 d+I2=5+(-6)=-1
6 4 d+I1=-1+8=7
7 4 d+I2=7+(-6)=1
8 5

Programm zur Implementierung des Bresenham-Linienzeichnungsalgorithmus:

 #include #include void drawline(int x0, int y0, int x1, int y1) { int dx, dy, p, x, y; dx=x1-x0; dy=y1-y0; x=x0; y=y0; p=2*dy-dx; while(x=0) { putpixel(x,y,7); y=y+1; p=p+2*dy-2*dx; } else { putpixel(x,y,7); p=p+2*dy;} x=x+1; } } int main() { int gdriver=DETECT, gmode, error, x0, y0, x1, y1; initgraph(&amp;gdriver, &amp;gmode, &apos;c:\turboc3\bgi&apos;); printf(&apos;Enter co-ordinates of first point: &apos;); scanf(&apos;%d%d&apos;, &amp;x0, &amp;y0); printf(&apos;Enter co-ordinates of second point: &apos;); scanf(&apos;%d%d&apos;, &amp;x1, &amp;y1); drawline(x0, y0, x1, y1); return 0; } 

Ausgabe:


Unterscheiden Sie zwischen dem DDA-Algorithmus und dem Bresenham-Linien-Algorithmus:

DDA-Algorithmus Bresenhams Linienalgorithmus
1. Der DDA-Algorithmus verwendet Gleitkommazahlen, d. h. reelle Arithmetik. 1. Bresenhams Linienalgorithmus verwendet Festkomma-Arithmetik, d. h. Ganzzahlarithmetik
2. DDA-Algorithmen verwenden Multiplikation und Division für ihre Operation 2. Bresenhams Linienalgorithmus verwendet bei seiner Operation nur Subtraktion und Addition
3. Der DDA-Algorithmus ist beim Zeichnen von Linien langsamer als der Bresenham-Linienalgorithmus, da er echte Arithmetik (Gleitkommaoperation) verwendet. 3. Der Bresenham-Algorithmus ist schneller als der DDA-Algorithmus, da er in seiner Berechnung nur Addition und Subtraktion umfasst und nur Ganzzahlarithmetik verwendet.
4. Der DDA-Algorithmus ist nicht genau und effizient wie der Linienalgorithmus von Bresenham. 4. Der Linienalgorithmus von Bresenham ist im Vergleich zum DDA-Algorithmus genauer und effizienter.
Der 5.DDA-Algorithmus kann Kreise und Kurven zeichnen, ist jedoch nicht so genau wie der Linienalgorithmus von Bresenham 5. Der Linienalgorithmus von Bresenham kann Kreise und Kurven genauer zeichnen als der DDA-Algorithmus.