logo

Bresenhamov riadkový algoritmus

Tento algoritmus sa používa na konverziu skenovania riadku. Vyvinul ho Bresenham. Je to efektívna metóda, pretože zahŕňa iba operácie sčítania, odčítania a násobenia celých čísel. Tieto operácie môžu byť vykonávané veľmi rýchlo, takže čiary môžu byť generované rýchlo.

Pri tejto metóde sa vyberie ďalší pixel, ktorý má najmenšiu vzdialenosť od skutočnej čiary.

Metóda funguje nasledovne:

Predpokladajme, že pixel P1'(X1',a1'), potom vyberte nasledujúce pixely, ako pracujeme, až do noci, po jednom pixeli v horizontálnom smere smerom k P2'(X2',a2').

Keď je pixel vložený, vyberte si v ktoromkoľvek kroku

Ďalší pixel je

  1. Buď ten napravo (dolná hranica pre riadok)
  2. Jeden hore vpravo a hore (horná hranica pre riadok)

Čiara je najlepšie aproximovaná tými pixelmi, ktoré spadajú najmenšiu vzdialenosť od cesty medzi P1',P2'.

Bresenham

Ak chcete vybrať ďalší medzi spodným pixelom S a horným pixelom T.
Ak sa zvolí S
Máme xi+1=xi+1 a yi+1=yi
Ak sa zvolí T
Máme xi+1=xi+1 a yi+1=yi+1

programovacie vzory java

Skutočné súradnice y čiary v bode x = xi+1je
y=mxi+1+b

Bresenham

Vzdialenosť od S k skutočnej čiare v smere y
s = y-yi

Vzdialenosť od T k skutočnej čiare v smere y
t = (yi+1)-y

Teraz zvážte rozdiel medzi týmito 2 hodnotami vzdialenosti
s - t

Keď (s-t)<0 ⟹ s < t< p>

Najbližší pixel je S

Keď (s-t) ≧0 ⟹ s

Najbližší pixel je T

Tento rozdiel je
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1

Bresenham

Nahradenie m za Bresenhama zavedenie rozhodovacej premennej
di=△x (s-t)
di=△x (2 Bresenham(Xi+1)+2b-2ri-1)
= 2△xyi-2△y-1△x.2b-2yi△x-△x
di=2△y.xi-2△x.ri+c

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

Rozhodovaciu premennú d môžeme zapísaťi+1na ďalšie pošmyknutie
di+1=2△y.xi+1-2△x.ri+1+c
di+1-di=2△y.(xi+1-Xi)- 2△x(yi+1-ai)

Pretože x_(i+1)=xi+1, máme
di+1+di=2△y.(xi+1-xi)- 2△x(yi+1-ai)

Špeciálne prípady

Neena Gupta

Ak je vybraný pixel na hornom pixeli T (t.j. di≧0)⟹ ai+1=yi+1
di+1=di+2△y-2△x

Ak je zvolený pixel na spodnom pixeli T (t.j. di<0)⟹ yi+1=yi
di+1=di+2△r

Nakoniec vypočítame d1
d1=△x[2m(x1+1)+2b-2r1-1]
d1=△x[2(mx1+b-y1)+2m-1]

Od mx1+b-yi=0 a m = , máme
d1=2△y-△x

Výhoda:

1. Zahŕňa iba celočíselnú aritmetiku, takže je to jednoduché.

2. Vyhne sa vytváraniu duplicitných bodov.

3. Môže byť implementovaný pomocou hardvéru, pretože nepoužíva násobenie a delenie.

4. Je rýchlejší v porovnaní s DDA (digitálny diferenciálny analyzátor), pretože nezahŕňa výpočty s pohyblivou rádovou čiarkou ako algoritmus DDA.

Nevýhoda:

1. Tento algoritmus je určený len pre základné kreslenie čiar Inicializácia nie je súčasťou Bresenhamovho čiarového algoritmu. Ak chcete nakresliť hladké čiary, mali by ste sa pozrieť na iný algoritmus.

Bresenhamov riadkový algoritmus:

Krok 1: Spustite algoritmus

Krok 2: Deklarujte premennú x1,X2a1a2,d,i1,i2,dx,dy

reťazec v c++

Krok 3: Zadajte hodnotu x1a1,X2a2
Kde x1a1sú súradnice východiskového bodu
A x2a2sú súradnice koncového bodu

Krok 4: Vypočítajte dx = x2-X1
Vypočítajte dy = y2-a1
Vypočítajte i1= 2*vy
Vypočítajte i2=2*(dy-dx)
Vypočítajte d=i1-dx

Krok 5: Uvažujme (x, y) ako východiskový bod a xkoniecako maximálna možná hodnota x.
Ak dx<0
Potom x = x2
y = y2
Xkoniec=x1
Ak dx > 0
Potom x = x1
y = y1
Xkoniec=x2

Krok 6: Vygenerujte bod na (x,y) súradniciach.

Krok 7: Skontrolujte, či sa generuje celý riadok.
Ak x > = xkoniec
Stop.

Krok 8: Vypočítajte súradnice nasledujúceho pixelu
Ak d<0
Potom d = d + i1
Ak d ≧ 0
Potom d = d + i2
Prírastok y = y + 1

Krok 9: Prírastok x = x + 1

Krok 10: Nakreslite bod najnovších (x, y) súradníc

Krok 11: Prejdite na krok 7

Krok 12: Koniec Algoritmu

Príklad: Počiatočná a koncová poloha riadku sú (1, 1) a (8, 5). Nájdite medziľahlé body.

Riešenie: X1=1
a1=1
X2=8
a2=5
dx = x2-X1= 8-1 = 7
ty=y2-a1= 5-1 = 4
ja1=2* ∆y=2*4=8
ja2=2*(∆y-∆x)=2*(4-7)=-6
d = I1-∆x=8-7=1

X a d = d + I1alebo ja2
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 na implementáciu Bresenhamovho algoritmu kreslenia čiar:

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

Výkon:


Rozdiel medzi algoritmom DDA a algoritmom Bresenham's Line:

Algoritmus DDA Bresenhamov riadkový algoritmus
1. Algoritmus DDA používa plávajúcu desatinnú čiarku, t. j. skutočnú aritmetiku. 1. Bresenhamov riadkový algoritmus používa pevný bod, t. j. celočíselnú aritmetiku
2. Algoritmy DDA využívajú na svoju činnosť násobenie a delenie 2. Bresenham's Line Algorithm používa iba odčítanie a sčítanie
3. Algoritmus DDA je pri kreslení čiar pomalý ako Bresenhamov Line Algorithm, pretože používa skutočnú aritmetiku (operácia s pohyblivou rádovou čiarkou) 3. Bresenhamov algoritmus je rýchlejší ako algoritmus DDA v rade, pretože vo výpočte zahŕňa iba sčítanie a odčítanie a používa iba aritmetiku celého čísla.
4. Algoritmus DDA nie je presný a efektívny ako Bresenham's Line Algorithm. 4. Bresenhamov Line Algorithm je presnejší a efektívnejší v DDA Algorithm.
5. Algoritmus DDA môže kresliť kruh a krivky, ale nie sú presné ako Bresenhamov lineárny algoritmus 5. Bresenham's Line Algorithm dokáže kresliť kruh a krivky presnejšie ako algoritmus DDA.