logo

Algorytm liniowy Bresenhama

Algorytm ten służy do skanowania konwertującego linię. Został opracowany przez Bresenhama. Jest to skuteczna metoda, ponieważ obejmuje tylko dodawanie, odejmowanie i mnożenie liczb całkowitych. Operacje te można wykonać bardzo szybko, dzięki czemu można szybko wygenerować linie.

W tej metodzie kolejnym wybranym pikselem jest ten, który ma najmniejszą odległość od linii prawdziwej.

Metoda działa w następujący sposób:

urodził się Freddie Mercury

Załóżmy, że piksel P1'(X1',I1'), następnie zaznaczaj kolejne piksele w miarę jak pracujemy do nocy, po jednym pikselu na raz w kierunku poziomym w stronę P2'(X2',I2').

Po wybraniu piksela w dowolnym kroku

Następny piksel to

  1. Albo ten po prawej stronie (dolna granica linii)
  2. Jeden u góry w prawo i w górę (górna granica linii)

Linię najlepiej przybliżają te piksele, które znajdują się w najmniejszej odległości od ścieżki pomiędzy P1',P2'.

Bresenham

Aby wybrać następny pomiędzy dolnym pikselem S i górnym pikselem T.
Jeśli wybrano S
Mamy xja+1=xI+1 i yja+1= yI
Jeśli wybrano T
Mamy xja+1=xI+1 i yja+1= yI+1

Rzeczywiste współrzędne y linii w punkcie x = xja+1Jest
y=mxja+1+b

Bresenham

Odległość od S do rzeczywistej linii w kierunku y
s = y-yI

Odległość od T do rzeczywistej linii w kierunku y
t = (yI+1) -y

Rozważmy teraz różnicę między tymi dwiema wartościami odległości
s - t

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

Najbliższy piksel to S

Kiedy (s-t) ≧0 ⟹ s

Najbliższy piksel to T

Ta różnica jest
s-t = (y-yi)-[(yi+1)-y]
= 2 lata - 2 lata -1

Bresenham

Zastępując m przez Bresenhami wprowadzenie zmiennej decyzyjnej
DI=△x (s-t)
DI=△x (2 Bresenham(XI+1)+2b-2yI-1)
=2△xyI-2△y-1△x.2b-2yI△x-△x
DI=2△y.xI-2△x.yI+c

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

Możemy zapisać zmienną decyzyjną dja+1na następną wpadkę
Dja+1=2△y.xja+1-2△x.yja+1+c
Dja+1-DI=2△y.(xja+1-XI)- 2△x(yja+1-II)

Ponieważ x_(i+1)=xI+1, mamy
Dja+1+dI=2△y.(xI+1-xI)- 2△x(yja+1-II)

Specjalne przypadki

Jeśli wybrany piksel znajduje się na górnym pikselu T (tznI≧0)⟹ ija+1= yI+1
Dja+1=dI+2△y-2△x

Jeśli wybrany piksel znajduje się na dolnym pikselu T (tznI<0)⟹ yi+1=yI
Dja+1=dI+2△y

Na koniec obliczamy d1
D1=△x[2m(x1+1)+2b-2y1-1]
D1=△x[2(mx1+b-y1)+2m-1]

Od mx1+b-yI=0 i m = , mamy
D1=2△y-△x

Korzyść:

1. Dotyczy tylko arytmetyki liczb całkowitych, więc jest proste.

2. Pozwala uniknąć generowania duplikatów punktów.

3. Można go zaimplementować przy użyciu sprzętu, ponieważ nie używa mnożenia i dzielenia.

4. Jest szybszy w porównaniu do DDA (Digital Differential Analyzer), ponieważ nie obejmuje obliczeń zmiennoprzecinkowych, takich jak algorytm DDA.

Niekorzyść:

1. Algorytm ten jest przeznaczony wyłącznie do podstawowego rysowania linii. Inicjowanie nie jest częścią algorytmu linii Bresenhama. Aby więc rysować gładkie linie, powinieneś przyjrzeć się innemu algorytmowi.

Algorytm liniowy Bresenhama:

Krok 1: Uruchom algorytm

samouczek javafx

Krok 2: Zadeklaruj zmienną x1,X2,I1,I2,d,tj1,I2,dx,dy

gimp zapisuje jako JPEG

Krok 3: Wprowadź wartość x1,I1,X2,I2
Gdzie x1,I1są współrzędnymi punktu początkowego
I x2,I2są współrzędnymi punktu końcowego

Krok 4: Oblicz dx = x2-X1
Oblicz dy = y2-I1
Oblicz I1=2*ty
Oblicz I2=2*(dy-dx)
Oblicz d=i1-dx

Krok 5: Rozważ (x, y) jako punkt wyjścia i xkoniecjako maksymalna możliwa wartość x.
Jeśli dx<0
Wtedy x = x2
y = y2
Xkoniec=x1
Jeśli dx > 0
Wtedy x = x1
y = y1
Xkoniec=x2

Krok 6: Generuj punkt we współrzędnych (x, y).

Krok 7: Sprawdź, czy została wygenerowana cała linia.
Jeśli x > = xkoniec
Zatrzymywać się.

Krok 8: Oblicz współrzędne następnego piksela
Jeśli d<0
Wtedy d = d + ja1
Jeśli d ≧ 0
Wtedy d = d + ja2
Przyrost y = y + 1

Krok 9: Przyrost x = x + 1

Krok 10: Narysuj punkt o ostatnich współrzędnych (x, y).

Krok 11: Przejdź do kroku 7

Krok 12: Koniec algorytmu

Przykład: Pozycje początkowe i końcowe linii to (1, 1) i (8, 5). Znajdź punkty pośrednie.

Rozwiązanie: X1=1
I1=1
X2=8
I2=5
dx=x2-X1=8-1=7
ty=y2-I1=5-1=4
I1=2* ∆y=2*4=8
I2=2*(∆y-∆x)=2*(4-7)=-6
d = ja1-∆x=8-7=1

X I d=d+ja1lub ja2
1 1 d+ja2=1+(-6)=-5
2 2 d+ja1=-5+8=3
3 2 d+ja2=3+(-6)=-3
4 3 d+ja1=-3+8=5
5 3 d+ja2=5+(-6)=-1
6 4 d+ja1=-1+8=7
7 4 d+ja2=7+(-6)=1
8 5

Program implementujący algorytm rysowania linii Bresenhama:

 #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; } 

Wyjście:


Rozróżnij algorytm DDA od algorytmu liniowego Bresenhama:

Algorytm DDA Algorytm liniowy Bresenhama
1. Algorytm DDA wykorzystuje liczbę zmiennoprzecinkową, czyli arytmetykę rzeczywistą. 1. Algorytm liniowy Bresenhama wykorzystuje punkt stały, tj. arytmetykę liczb całkowitych
2. Algorytmy DDA w swoim działaniu wykorzystują mnożenie i dzielenie 2. Algorytm liniowy Bresenhama wykorzystuje w swojej operacji jedynie odejmowanie i dodawanie
3. Algorytm DDA jest wolniejszy niż algorytm liniowy Bresenhama w rysowaniu linii, ponieważ wykorzystuje rzeczywistą arytmetykę (operacja zmiennoprzecinkowa) 3. Algorytm Bresenhama jest szybszy niż algorytm DDA, ponieważ w obliczeniach uwzględnia jedynie dodawanie i odejmowanie oraz wykorzystuje wyłącznie arytmetykę liczb całkowitych.
4. Algorytm DDA nie jest dokładny i skuteczny w porównaniu z algorytmem liniowym Bresenhama. 4. Algorytm liniowy Bresenhama jest dokładniejszy i wydajniejszy w przypadku algorytmu DDA.
5. Algorytm DDA może rysować koła i krzywe, ale nie jest dokładny jak algorytm liniowy Bresenhama 5. Algorytm liniowy Bresenhama umożliwia rysowanie okręgów i krzywych z większą dokładnością niż algorytm DDA.