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
- Albo ten po prawej stronie (dolna granica linii)
- 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'.
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
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 Zastępując m przez i wprowadzenie zmiennej decyzyjnej Gdzie c= 2△y+△x (2b-1) Możemy zapisać zmienną decyzyjną dja+1na następną wpadkę Ponieważ x_(i+1)=xI+1, mamy Specjalne przypadki Jeśli wybrany piksel znajduje się na górnym pikselu T (tznI≧0)⟹ ija+1= yI+1 Jeśli wybrany piksel znajduje się na dolnym pikselu T (tznI<0)⟹ yi+1=yI Na koniec obliczamy d1 Od mx1+b-yI=0 i m = , mamy 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. 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. Krok 1: Uruchom algorytm Krok 2: Zadeklaruj zmienną x1,X2,I1,I2,d,tj1,I2,dx,dy Krok 3: Wprowadź wartość x1,I1,X2,I2 Krok 4: Oblicz dx = x2-X1 Krok 5: Rozważ (x, y) jako punkt wyjścia i xkoniecjako maksymalna możliwa wartość x. Krok 6: Generuj punkt we współrzędnych (x, y). Krok 7: Sprawdź, czy została wygenerowana cała linia. Krok 8: Oblicz współrzędne następnego piksela 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 Wyjście:
s-t = (y-yi)-[(yi+1)-y]
= 2 lata - 2 lata -1
DI=△x (s-t)
DI=△x (2 (XI+1)+2b-2yI-1)
=2△xyI-2△y-1△x.2b-2yI△x-△x
DI=2△y.xI-2△x.yI+c
Dja+1=2△y.xja+1-2△x.yja+1+c
Dja+1-DI=2△y.(xja+1-XI)- 2△x(yja+1-II)
Dja+1+dI=2△y.(xI+1-xI)- 2△x(yja+1-II)
Dja+1=dI+2△y-2△x
Dja+1=dI+2△y0)⟹>
D1=△x[2m(x1+1)+2b-2y1-1]
D1=△x[2(mx1+b-y1)+2m-1]
D1=2△y-△xKorzyść:
Niekorzyść:
Algorytm liniowy Bresenhama:
samouczek javafx
gimp zapisuje jako JPEG
Gdzie x1,I1są współrzędnymi punktu początkowego
I x2,I2są współrzędnymi punktu końcowego
Oblicz dy = y2-I1
Oblicz I1=2*ty
Oblicz I2=2*(dy-dx)
Oblicz d=i1-dx
Jeśli dx<0
Wtedy x = x2
y = y2
Xkoniec=x1
Jeśli dx > 0
Wtedy x = x1
y = y1
Xkoniec=x20>
Jeśli x > = xkoniec
Zatrzymywać się.
Jeśli d<0
Wtedy d = d + ja1
Jeśli d ≧ 0
Wtedy d = d + ja2
Przyrost y = y + 10>
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(&gdriver, &gmode, 'c:\turboc3\bgi'); printf('Enter co-ordinates of first point: '); scanf('%d%d', &x0, &y0); printf('Enter co-ordinates of second point: '); scanf('%d%d', &x1, &y1); drawline(x0, y0, x1, y1); return 0; }
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.