Tento algoritmus se používá pro skenování převodu řádku. Byl vyvinut společností Bresenham. Je to efektivní metoda, protože zahrnuje pouze operace sčítání, odčítání a násobení celých čísel. Tyto operace lze provádět velmi rychle, takže lze rychle generovat čáry.
V této metodě je jako další vybraný pixel ten, který má nejmenší vzdálenost od skutečné čáry.
Metoda funguje následovně:
Předpokládejme pixel P1'(X1',a1'), pak vybírejte následující pixely, jak pracujeme, až do noci, po jednom pixelu ve vodorovném směru směrem k P2'(X2',a2').
Jakmile pixel vstoupíte, vyberte si v libovolném kroku
Další pixel je
- Buď ten napravo (dolní hranice pro řádek)
- Jeden nahoře vpravo a nahoru (horní hranice pro řádek)
Čára je nejlépe aproximována těmi pixely, které spadají do nejmenší vzdálenosti od cesty mezi P1',P2'.
To vybere další mezi spodním pixelem S a horním pixelem T.
Pokud je zvoleno S
Máme xi+1=xi+1 a yi+1=yi
Pokud je zvoleno T
Máme xi+1=xi+1 a yi+1=yi+1
Skutečné souřadnice y přímky v x = xi+1je
y=mxi+1+b
Vzdálenost od S ke skutečné přímce ve směru y
s = y-yi
Vzdálenost od T ke skutečné přímce ve směru y
t = (yi+1)-y
Nyní zvažte rozdíl mezi těmito 2 hodnotami vzdálenosti
Svatý
Když (s-t)<0 ⟹ s < t< p>
Nejbližší pixel je S
Když (s-t) ≧0 ⟹ s Nejbližší pixel je T Tento rozdíl je Nahrazení m za a zavedení rozhodovací proměnné Kde c= 2△y+△x (2b-1) Rozhodovací proměnnou d můžeme napsati+1na další skluz Protože x_(i+1)=xi+1, máme Speciální případy Pokud je vybraný pixel na horním pixelu T (tj. di≧0)⟹ ai+1=yi+1 Pokud je vybraný pixel na spodním pixelu T (tj. di<0)⟹ yi+1=yi Nakonec vypočítáme d1 Od mx1+b-yi=0 a m = , my máme 1. Zahrnuje pouze celočíselnou aritmetiku, takže je jednoduchý. 2. Vyhne se generování duplicitních bodů. 3. Může být implementován pomocí hardwaru, protože nepoužívá násobení a dělení. 4. Je rychlejší ve srovnání s DDA (Digital Differential Analyzer), protože nezahrnuje výpočty s plovoucí desetinnou čárkou jako algoritmus DDA. 1. Tento algoritmus je určen pouze pro základní kreslení čar Inicializace není součástí Bresenhamova liniového algoritmu. Chcete-li tedy nakreslit hladké čáry, měli byste se podívat na jiný algoritmus. Krok 1: Spustit algoritmus Krok 2: Deklarujte proměnnou x1,X2,a1,a2,d,i1,i2,dx,dy Krok 3: Zadejte hodnotu x1,a1,X2,a2 Krok 4: Vypočítejte dx = x2-X1 Krok 5: Uvažujme (x, y) jako výchozí bod a xkonecjako maximální možná hodnota x. Krok 6: Vygenerujte bod na souřadnicích (x,y). Krok 7: Zkontrolujte, zda je generován celý řádek. Krok 8: Vypočítejte souřadnice dalšího pixelu Krok 9: Přírůstek x = x + 1 Krok 10: Nakreslete bod nejnovějších (x, y) souřadnic Krok 11: Přejděte ke kroku 7 Krok 12: Konec algoritmu Příklad: Počáteční a Koncová pozice řádku jsou (1, 1) a (8, 5). Najděte mezilehlé body. Řešení: X1=1 Výstup:
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -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
di+1=2△y.xi+1-2△x.yi+1+c
di+1-di=2△y.(xi+1-Xi)- 2△x(yi+1-ai)
di+1+di=2△y.(xi+1-xi)- 2△x(yi+1-ai)
di+1=di+2△y-2△x
di+1=di+2△r0)⟹>
d1=△x[2m(x1+1)+2b-2y1-1]
d1=△x[2(mx1+b-y1)+2m-1]
d1=2△y-△xVýhoda:
Nevýhoda:
Bresenhamův lineární algoritmus:
index java
Kde x1,a1jsou souřadnice výchozího bodu
A x2,a2jsou souřadnice koncového bodu
Vypočítejte dy = y2-a1
Vypočítejte i1= 2*ty
Vypočítejte i2=2*(dy-dx)
Vypočítejte d=i1-dx
Pokud dx<0
Pak x = x2
y = y2
Xkonec=x1
Pokud dx > 0
Pak x = x1
y = y1
Xkonec=x20>
Pokud x > = xkonec
Stop.
Pokud d<0
Potom d = d + i1
Pokud d ≧ 0
Potom d = d + i2
Přírůstek y = y + 10>
a1=1
X2=8
a2=5
dx = x2-X1=8-1=7
ty=y2-a1=5-1=4
já1=2* ∆y=2*4=8
já2=2*(∆y-∆x)=2*(4-7)=-6
d = I1-∆x=8-7=1
X a d=d+I1nebo já2 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 Program pro implementaci Bresenhamova algoritmu pro kreslení čar:
#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; }
Rozdíl mezi algoritmem DDA a algoritmem Bresenham's Line:
Algoritmus DDA Bresenhamův liniový algoritmus 1. Algoritmus DDA používá pohyblivou řádovou čárku, tj. reálnou aritmetiku. 1. Bresenhamův lineární algoritmus používá pevný bod, tj. celočíselnou aritmetiku 2. Algoritmy DDA využívají ke své činnosti násobení a dělení 2.Bresenhamův lineární algoritmus používá pouze odečítání a sčítání 3. Algoritmus DDA je při kreslení čar pomalejší než Bresenhamův Line Algorithm, protože používá skutečnou aritmetiku (operace s plovoucí desetinnou čárkou) 3. Bresenhamův algoritmus je rychlejší než algoritmus DDA v řadě, protože při výpočtu zahrnuje pouze sčítání a odčítání a používá pouze celočíselnou aritmetiku. 4. Algoritmus DDA není přesný a účinný jako Bresenhamův Line Algorithm. 4. Bresenhamův Line Algorithm je přesnější a efektivnější v DDA Algorithm. 5. Algoritmus DDA může kreslit kružnice a křivky, ale nejsou přesné jako Bresenhamův liniový algoritmus 5. Bresenhamův Line Algorithm dokáže kreslit kružnice a křivky s větší přesností než DDA algoritmus.