Ta algoritem se uporablja za skeniranje pretvorbe vrstice. Razvil ga je Bresenham. Je učinkovita metoda, ker vključuje samo celoštevilske operacije seštevanja, odštevanja in množenja. Te operacije je mogoče izvesti zelo hitro, tako da je mogoče hitro ustvariti vrstice.
Pri tej metodi je naslednji izbrani piksel tisti, ki je najmanj oddaljen od prave črte.
Metoda deluje na naslednji način:
Predpostavimo slikovno piko P1'(x1',in1'), nato izberite naslednje slikovne pike, ko delamo do noči, eno slikovno piko naenkrat v vodoravni smeri proti P2'(x2',in2').
Ko je piksel vstavljen, izberite na katerem koli koraku
Naslednji piksel je
- Bodisi tista na njegovi desni (spodnja meja za črto)
- Eden zgoraj desno in navzgor (zgornja meja za črto)
Črto najbolje približajo tiste slikovne pike, ki so najmanj oddaljene od poti med P1',P2'.
Izbere naslednjo med spodnjo slikovno piko S in zgornjo slikovno piko T.
Če je izbran S
Imamo xi+1=xjaz+1 in yi+1=yjaz
Če je izbran T
Imamo xi+1=xjaz+1 in yi+1=yjaz+1
Dejanske koordinate y premice pri x = xi+1je
y=mxi+1+b
Razdalja od S do dejanske črte v smeri y
s = y-yjaz
Razdalja od T do dejanske črte v smeri y
t = (yjaz+1)-y
Zdaj razmislite o razliki med tema dvema vrednostma razdalje
s - t
Kdaj (s-t)<0 ⟹ s < t< p>
Najbližji piksel je S
Ko je (s-t) ≧0 ⟹ s Najbližji piksel je T Ta razlika je Zamenjava m z in uvedbo odločitvene spremenljivke Kjer je c= 2△y+△x (2b-1) Odločitveno spremenljivko lahko zapišemo di+1za naslednji zdrs naprej Ker je x_(i+1)=xjaz+1, imamo Posebni primeri Če je izbrani piksel na vrhu, je piksel T (tj. djaz≧0)⟹ ini+1=yjaz+1 Če je izbrana slikovna pika na dnu slikovne pike T (tj. djaz<0)⟹ yi+1=yjaz Na koncu izračunamo d1 Ker je mx1+b-yjaz=0 in m = , imamo 1. Vključuje samo aritmetiko celih števil, zato je preprosta. 2. Izogne se ustvarjanju podvojenih točk. 3. Lahko se izvede s strojno opremo, ker ne uporablja množenja in deljenja. 4. Je hitrejši v primerjavi z DDA (digitalni diferencialni analizator), ker ne vključuje izračunov s plavajočo vejico, kot je algoritem DDA. 1. Ta algoritem je namenjen le osnovnemu risanju črt. Inicializacija ni del Bresenhamovega algoritma črt. Torej, če želite risati gladke črte, bi morali pogledati v drug algoritem. Korak 1: Zaženi algoritem 2. korak: Deklarirajte spremenljivko x1,x2,in1,in2,d,i1,jaz2,dx,dy 3. korak: Vnesite vrednost x1,in1,x2,in2 4. korak: Izračunajte dx = x2-x1 5. korak: Upoštevajte (x, y) kot izhodišče in xkoneckot največjo možno vrednost x. 6. korak: Ustvari točko na (x,y) koordinatah. 7. korak: Preverite, ali je ustvarjena cela vrstica. 8. korak: Izračunajte koordinate naslednje piksle 9. korak: Povečaj x = x + 1 10. korak: Narišite točko zadnje (x, y) koordinate 11. korak: Pojdite na 7. korak 12. korak: Konec algoritma primer: Začetni in končni položaj črte sta (1, 1) in (8, 5). Poiščite vmesne točke. rešitev: x1=1 Izhod:
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1
djaz=△x (s-t)
djaz=△x (2 (xjaz+1)+2b-2yjaz-1)
=2△xyjaz-2△y-1△x.2b-2yjaz△x-△x
djaz=2△y.xjaz-2△x.yjaz+c
di+1=2△y.xi+1-2△x.yi+1+c
di+1-djaz=2△y.(xi+1-xjaz)- 2△x(yi+1-injaz)
di+1+djaz=2△y.(xjaz+1-xjaz)- 2△x(yi+1-injaz)
chmod 755
di+1=djaz+2△y-2△x
di+1=djaz+2△y0)⟹>
d1=△x[2m(x1+1)+2b-2y1-1]
d1=△x[2(mx1+b-y1)+2m-1]
d1=2△y-△xPrednost:
Slabost:
Algoritem Bresenhamove črte:
java dvojno v niz
Kjer je x1,in1so koordinate začetne točke
In x2,in2so koordinate končne točke
Izračunajte dy = y2-in1
Izračunajte i1=2*ti
Izračunajte i2=2*(dy-dx)
Izračunajte d=i1-dx
Če dx<0
Potem je x = x2
y = y2
xkonec=x1
Če je dx > 0
Potem je x = x1
y = y1
xkonec=x20>
Če je x > = xkonec
Stop.
Če d<0
Potem je d = d + i1
Če je d ≧ 0
Potem je d = d + i2
Povečaj y = y + 10>
in1=1
x2=8
in2=5
dx= x2-x1=8-1=7
ti=y2-in1=5-1=4
jaz1=2* ∆y=2*4=8
jaz2=2*(∆y-∆x)=2*(4-7)=-6
d = jaz1-∆x=8-7=1
x in d=d+jaz1ali jaz2 1 1 d+jaz2=1+(-6)=-5 2 2 d+jaz1=-5+8=3 3 2 d+jaz2=3+(-6)=-3 4 3 d+jaz1=-3+8=5 5 3 d+jaz2=5+(-6)=-1 6 4 d+jaz1=-1+8=7 7 4 d+jaz2=7+(-6)=1 8 5 Program za implementacijo Bresenhamovega algoritma za risanje črt:
#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; }
Razlikujte med algoritmom DDA in algoritmom Bresenhamove črte:
Algoritem DDA Algoritem Bresenhamove črte 1. Algoritem DDA uporablja plavajočo vejico, tj. realno aritmetiko. 1. Bresenhamov linijski algoritem uporablja fiksno točko, tj. aritmetiko celih števil 2. Algoritmi DDA za svoje delovanje uporabljajo množenje in deljenje 2.Bresenhamov linijski algoritem uporablja samo odštevanje in seštevanje 3. Algoritem DDA je pri risanju črt počasnejši od Bresenhamovega črtnega algoritma, ker uporablja pravo aritmetiko (operacija s plavajočo vejico) 3. Bresenhamov algoritem je v liniji hitrejši od algoritma DDA, ker pri izračunu vključuje samo seštevanje in odštevanje ter uporablja samo aritmetiko celih števil. 4. Algoritem DDA ni natančen in učinkovit kot Bresenhamov linijski algoritem. 4. Bresenhamov linijski algoritem je natančnejši in učinkovitejši pri algoritmu DDA. 5. Algoritem DDA lahko nariše krog in krivulje, vendar ni natančen kot Bresenhamov linijski algoritem 5. Bresenhamov črtni algoritem lahko nariše krog in krivulje bolj natančno kot algoritem DDA.