logo

Algoritmul de linie al lui Bresenham

Acest algoritm este utilizat pentru scanarea conversiei unei linii. A fost dezvoltat de Bresenham. Este o metodă eficientă deoarece implică doar operații de adunare, scădere și înmulțire a întregului. Aceste operațiuni pot fi efectuate foarte rapid, astfel încât liniile pot fi generate rapid.

În această metodă, următorul pixel selectat este cel care are cea mai mică distanță față de linia adevărată.

Metoda funcționează după cum urmează:

Să presupunem un pixel P1'(X1',și1'), apoi selectați pixelii următori pe măsură ce lucrăm până la noapte, câte o poziție de pixel pe rând în direcția orizontală spre P2'(X2',și2').

Odată ce un pixel a intrat, alegeți la orice pas

Următorul pixel este

  1. Fie cel din dreapta sa (limita inferioară pentru linie)
  2. Unul sus, în dreapta și în sus (limită superioară pentru linie)

Linia este cel mai bine aproximată de acei pixeli care se încadrează la cea mai mică distanță de la calea dintre P1',P2'.

Bresenham

Pentru a alege următorul dintre pixelul de jos S și pixelul de sus T.
Dacă se alege S
Avem xi+1=xi+1 și yi+1=yi
Dacă se alege T
Avem xi+1=xi+1 și yi+1=yi+1

metode string în java

Coordonatele y reale ale dreptei la x = xi+1este
y=mxi+1+b

Bresenham

Distanța de la S la linia reală în direcția y
s = y-yi

Distanța de la T la linia reală în direcția y
t = (yi+1)-y

Acum luați în considerare diferența dintre aceste 2 valori ale distanței
s - t

Când (s-t)<0 ⟹ s < t< p>

Cel mai apropiat pixel este S

Când (s-t) ≧0 ⟹ s

Cel mai apropiat pixel este T

Această diferență este
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1

Bresenham

Înlocuind m cu Bresenhamși introducerea variabilei de decizie
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

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

Putem scrie variabila de decizie di+1pentru următoarea alunecare
di+1=2△y.xi+1-2△x.yi+1+c
di+1-di=2△y.(xi+1-Xi)- 2△x(yi+1-șii)

Deoarece x_(i+1)=xi+1, avem
di+1+di=2△y.(xi+1-xi)- 2△x(yi+1-șii)

Cazuri speciale

np.unic

Dacă pixelul ales este în partea de sus a pixelului T (adică di≧0)⟹ șii+1=yi+1
di+1=di+2△y-2△x

Dacă pixelul ales este în partea de jos a pixelului T (adică di<0)⟹ yi+1=yi
di+1=di+2△y

În final, calculăm d1
d1=△x[2m(x1+1)+2b-2y1-1]
d1=△x[2(mx1+b-y1)+2m-1]

Din moment ce mx1+b-yi=0 și m = , avem
d1=2△y-△x

Avantaj:

1. Implică doar aritmetica întregi, deci este simplă.

2. Evită generarea de puncte duplicat.

3. Poate fi implementat folosind hardware deoarece nu folosește înmulțirea și împărțirea.

4. Este mai rapid în comparație cu DDA (Digital Differential Analyzer) deoarece nu implică calcule în virgulă mobilă, cum ar fi algoritmul DDA.

Dezavantaj:

1. Acest algoritm este destinat numai desenului de linie de bază. Inițializarea nu face parte din algoritmul de linie al lui Bresenham. Așadar, pentru a desena linii netede, ar trebui să vă uitați la un alt algoritm.

Algoritmul liniei lui Bresenham:

Pasul 1: Porniți algoritmul

Pasul 2: Declarați variabila x1,X2,și1,și2,d,i1,i2,dx,dy

inițializator de dicționar c#

Pasul 3: Introduceți valoarea lui x1,și1,X2,și2
Unde x1,și1sunt coordonatele punctului de plecare
Și x2,și2sunt coordonatele punctului final

Pasul 4: Calculați dx = x2-X1
Calculați dy = y2-și1
Calculați i1=2*tu
Calculați i2=2*(dy-dx)
Calculați d=i1-dx

Pasul 5: Considerați (x, y) ca punct de plecare și xSfârşitca valoare maximă posibilă a lui x.
Dacă dx<0
Atunci x = x2
y = y2
XSfârşit=x1
Dacă dx > 0
Atunci x = x1
y = y1
XSfârşit=x2

Pasul 6: Generați punctul la coordonatele (x,y).

Pasul 7: Verificați dacă este generată întreaga linie.
Dacă x > = xSfârşit
Stop.

Pasul 8: Calculați coordonatele următorului pixel
Dacă d<0
Atunci d = d + i1
Dacă d ≧ 0
Atunci d = d + i2
Crește y = y + 1

Pasul 9: Creșteți x = x + 1

Pasul 10: Desenați un punct cu ultimele coordonate (x, y).

Pasul 11: Treceți la pasul 7

Pasul 12: Sfârșitul algoritmului

Exemplu: Poziția de început și de sfârșit a liniei sunt (1, 1) și (8, 5). Găsiți puncte intermediare.

Soluţie: X1=1
și1=1
X2=8
și2=5
dx= x2-X1=8-1=7
tu=y2-și1=5-1=4
eu1=2* ∆y=2*4=8
eu2=2*(∆y-∆x)=2*(4-7)=-6
d = I1-∆x=8-7=1

X și d=d+I1sau eu2
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 pentru implementarea algoritmului de desen al lui Bresenham:

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

Ieșire:


Faceți diferența dintre algoritmul DDA și algoritmul linie al lui Bresenham:

Algoritmul DDA Algoritmul de linie al lui Bresenham
1. Algoritmul DDA utilizează virgulă mobilă, adică aritmetica reală. 1. Algoritmul lui Bresenham folosește punctul fix, adică aritmetica întregului
2. Algoritmii DDA utilizează operarea înmulțirii și împărțirii 2.Algoritmul de linie al lui Bresenham folosește doar operația de scădere și adunare
3. Algoritmul DDA este mai lent decât Algoritmul de linie al lui Bresenham în desenul liniei, deoarece folosește aritmetică reală (operație în virgulă mobilă) 3. Algoritmul lui Bresenham este mai rapid decât algoritmul DDA în linie, deoarece implică doar adunarea și scăderea în calculul său și folosește doar aritmetică cu numere întregi.
4. Algoritmul DDA nu este precis și eficient ca algoritmul de linie a lui Bresenham. 4. Algoritmul de linie al lui Bresenham este mai precis și mai eficient la algoritmul DDA.
5. Algoritmul DDA poate desena cercuri și curbe, dar nu sunt precise ca algoritmul de linie a lui Bresenham 5. Algoritmul de linie al lui Bresenham poate desena cercuri și curbe cu mai multă precizie decât algoritmul DDA.