logo

Bresenhamov linijski algoritam

Ovaj se algoritam koristi za skeniranje pretvaranja linije. Razvio ga je Bresenham. To je učinkovita metoda jer uključuje samo cjelobrojne operacije zbrajanja, oduzimanja i množenja. Ove se operacije mogu izvesti vrlo brzo tako da se linije mogu brzo generirati.

U ovoj metodi, sljedeći odabrani piksel je onaj koji ima najmanju udaljenost od prave linije.

Metoda funkcionira na sljedeći način:

Pretpostavimo piksel P1'(x1',i1'), zatim odaberite sljedeće piksele dok radimo na našem svibnju do noći, položaj po jedan piksel u vodoravnom smjeru prema P2'(x2',i2').

Nakon ulaska piksela odaberite bilo koji korak

Sljedeći piksel je

  1. Ili onaj s njegove desne strane (donja granica za liniju)
  2. Jedan je gore desno i gore (gornja granica za liniju)

Linija se najbolje aproksimira onim pikselima koji padaju na najmanju udaljenost od putanje između P1',P2'.

Bresenham

Za odabir sljedećeg između donjeg piksela S i gornjeg piksela T.
Ako se izabere S
Imamo xi+1=xja+1 i yi+1=yja
Ako se izabere T
Imamo xi+1=xja+1 i yi+1=yja+1

Stvarne y koordinate pravca na x = xi+1je
y=mxi+1+b

Bresenham

Udaljenost od S do stvarne linije u smjeru y
s = y-yja

Udaljenost od T do stvarne crte u smjeru y
t = (yja+1)-y

Sada razmotrite razliku između ove dvije vrijednosti udaljenosti
s - t

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

Najbliži piksel je S

Kada je (s-t) ≧0 ⟹ s

Najbliži piksel je T

Ova razlika je
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1

Bresenham

Zamjena m sa Bresenhami uvođenje varijable odlučivanja
dja=△x (s-t)
dja=△x (2 Bresenham(xja+1)+2b-2yja-1)
=2△xyja-2△y-1△x.2b-2yja△x-△x
dja=2△y.xja-2△x.yja+c

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

regresijski izraz u Javi

Možemo napisati varijablu odluke di+1za sljedeći slip on
di+1=2△y.xi+1-2△x.yi+1+c
di+1-dja=2△y.(xi+1-xja)- 2△x(yi+1-ija)

Budući da je x_(i+1)=xja+1, imamo
di+1+dja=2△y.(xja+1-xja)- 2△x(yi+1-ija)

Posebni slučajevi

Ako je odabrani piksel na vrhu piksel T (tj. dja≧0)⟹ ii+1=yja+1
di+1=dja+2△y-2△x

Ako je odabrani piksel na dnu piksel T (tj. dja<0)⟹ yi+1=yja
di+1=dja+2△g

Na kraju izračunavamo d1
d1=△x[2m(x1+1)+2b-2y1-1]
d1=△x[2(mx1+b-g1)+2m-1]

Budući da je mx1+b-gja=0 i m = , imamo
d1=2△y-△x

Prednost:

1. Uključuje samo cjelobrojnu aritmetiku, tako da je jednostavan.

2. Izbjegava stvaranje duplih točaka.

3. Može se implementirati pomoću hardvera jer ne koristi množenje i dijeljenje.

4. Brži je u usporedbi s DDA (Digitalni diferencijalni analizator) jer ne uključuje izračune s pomičnim zarezom poput DDA algoritma.

Hendikep:

1. Ovaj algoritam je namijenjen samo za osnovno crtanje linija. Inicijalizacija nije dio Bresenhamovog algoritma linija. Dakle, da biste crtali glatke linije, trebali biste potražiti drugačiji algoritam.

k algoritam klasteriranja

Algoritam Bresenhamove linije:

Korak 1: Pokreni algoritam

Korak 2: Deklarirajte varijablu x1,x2,i1,i2,d,i1,i2,dx,dy

3. korak: Unesite vrijednost x1,i1,x2,i2
Gdje je x1,i1su koordinate početne točke
i x2,i2su koordinate završne točke

Korak 4: Izračunajte dx = x2-x1
Izračunajte dy = y2-i1
Izračunajte i1=2*ti
Izračunajte i2=2*(dy-dx)
Izračunajte d=i1-dx

Korak 5: Uzmite (x, y) kao početnu točku i xkrajkao najveću moguću vrijednost x.
Ako dx<0
Tada je x = x2
y = y2
xkraj=x1
Ako je dx > 0
Tada je x = x1
y = y1
xkraj=x2

Korak 6: Generirajte točku na (x,y) koordinatama.

Korak 7: Provjerite je li generirana cijela linija.
Ako je x > = xkraj
Stop.

Korak 8: Izračunajte koordinate sljedećeg piksela
Ako d<0
Tada je d = d + i1
Ako je d ≧ 0
Tada je d = d + i2
Povećaj y = y + 1

Korak 9: Povećaj x = x + 1

Korak 10: Nacrtajte točku najnovijih (x, y) koordinata

Korak 11: Idite na korak 7

Korak 12: Kraj algoritma

Primjer: Početna i završna pozicija linije su (1, 1) i (8, 5). Pronađite međutočke.

Riješenje: x1=1
i1=1
x2=8
i2=5
dx= x2-x1=8-1=7
ti=y2-i1=5-1=4
ja1=2* ∆y=2*4=8
ja2=2*(∆y-∆x)=2*(4-7)=-6
d = ja1-∆x=8-7=1

x i d=d+I1ili 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 za implementaciju Bresenhamovog algoritma crtanja linija:

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

Izlaz:


Napravite razliku između DDA algoritma i Bresenhamovog linijskog algoritma:

DDA algoritam Bresenhamov linijski algoritam
1. DDA algoritam koristi pokretni zarez, tj. stvarnu aritmetiku. 1. Bresenhamov linijski algoritam koristi fiksnu točku, tj. aritmetiku cijelog broja
2. DDA algoritmi koriste množenje i dijeljenje 2.Bresenhamov linijski algoritam koristi samo oduzimanje i zbrajanje
3. DDA algoritam je sporiji od Bresenhamovog linijskog algoritma u crtanju linija jer koristi stvarnu aritmetiku (operacija s pomičnim zarezom) 3. Bresenhamov algoritam je brži od DDA algoritma jer uključuje samo zbrajanje i oduzimanje u svom izračunu i koristi samo aritmetiku cijelog broja.
4. DDA algoritam nije točan i učinkovit kao Bresenhamov linijski algoritam. 4. Bresenhamov linijski algoritam točniji je i učinkovitiji kod DDA algoritma.
5. DDA algoritam može nacrtati krug i krivulje, ali nije točan kao Bresenhamov linijski algoritam 5. Bresenhamov linijski algoritam može crtati krug i krivulje točnije od DDA algoritma.