Denne algoritme bruges til at scanne konvertering af en linje. Det blev udviklet af Bresenham. Det er en effektiv metode, fordi den kun involverer heltalsaddition, subtraktioner og multiplikationsoperationer. Disse operationer kan udføres meget hurtigt, så linjer kan genereres hurtigt.
I denne metode er den næste valgte pixel den, der har den mindste afstand fra den sande linje.
Metoden fungerer som følger:
Antag en pixel P1'(x1',og1'), vælg derefter efterfølgende pixels, mens vi arbejder os mod natten, en pixelposition ad gangen i vandret retning mod P2'(x2',og2').
eksempel på brugernavn
Vælg en gang en pixel i ethvert trin
Den næste pixel er
- Enten den til højre (nedre grænse for linjen)
- Den ene øverst til højre og op (øvre grænse for linjen)
Linjen tilnærmes bedst af de pixels, der falder mindst fra stien mellem P1',P2'.
To vælger den næste mellem den nederste pixel S og den øverste pixel T.
Hvis S er valgt
Vi har xi+1=xjeg+1 og yi+1=yjeg
Hvis T er valgt
Vi har xi+1=xjeg+1 og yi+1=yjeg+1
De faktiske y-koordinater for linjen ved x = xi+1er
y=mxi+1+b
Afstanden fra S til den faktiske linje i y-retningen
s = y-yjeg
Afstanden fra T til den faktiske linje i y-retningen
t = (yjeg+1)-y
Overvej nu forskellen mellem disse 2 afstandsværdier
s - t
Hvornår (s-t)<0 ⟹ s < t< p>
Den nærmeste pixel er S
Når (s-t) ≧0 ⟹ s Den nærmeste pixel er T Denne forskel er Erstatter m ved og introduktion af beslutningsvariabel Hvor c= 2△y+△x (2b-1) Vi kan skrive beslutningsvariablen di+1til næste slip on Da x_(i+1)=xjeg+1, det har vi Særlige tilfælde Hvis den valgte pixel er på den øverste pixel T (dvsjeg≧0)⟹ ogi+1=yjeg+1 Hvis den valgte pixel er ved den nederste pixel T (dvsjeg<0)⟹ yi+1=yjeg Til sidst beregner vi d1 Siden mx1+b-yjeg=0 og m = , vi har 1. Det involverer kun heltals aritmetik, så det er enkelt. 2. Det undgår generering af duplikerede punkter. 3. Det kan implementeres ved hjælp af hardware, fordi det ikke bruger multiplikation og division. 4. Det er hurtigere sammenlignet med DDA (Digital Differential Analyzer), fordi det ikke involverer flydende kommaberegninger som DDA Algorithm. 1. Denne algoritme er kun beregnet til grundlæggende linjetegning. Initialisering er ikke en del af Bresenhams linjealgoritme. Så for at tegne glatte linjer, bør du undersøge en anden algoritme. Trin 1: Start algoritme Trin 2: Erklær variabel x1,x2,og1,og2,d,i1,jeg2,dx,dy Trin 3: Indtast værdien af x1,og1,x2,og2 Trin 4: Beregn dx = x2-x1 Trin 5: Betragt (x, y) som udgangspunkt og xendesom maksimalt mulig værdi af x. Trin 6: Generer punkt ved (x,y)koordinater. Trin 7: Tjek om hele linjen er genereret. Trin 8: Beregn koordinaterne for den næste pixel Trin 9: Forøg x = x + 1 Trin 10: Tegn et punkt med de seneste (x, y) koordinater Trin 11: Gå til trin 7 Trin 12: Slut på algoritme Eksempel: Linjens start- og slutposition er (1, 1) og (8, 5). Find mellempunkter. Løsning: x1=1 Produktion:
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1
djeg=△x (s-t)
djeg=△x (2 (xjeg+1)+2b-2yjeg-1)
=2△xyjeg-2△y-1△x.2b-2yjeg△x-△x
djeg=2△y.xjeg-2△x.yjeg+cjava få aktuel tid
di+1=2△y.xi+1-2△x.yi+1+c
di+1-djeg=2△y.(xi+1-xjeg)- 2△x(yi+1-ogjeg)
di+1+djeg=2△y.(xjeg+1-xjeg)- 2△x(yi+1-ogjeg)
di+1=djeg+2△y-2△x
di+1=djeg+2△y0)⟹>
d1=△x[2m(x1+1)+2b-2y1-1]
d1=△x[2(mx1+b-y1)+2m-1]
d1=2△y-△xFordel:
Ulempe:
Bresenhams linjealgoritme:
Hvor x1,og1er koordinater for udgangspunktet
Og x2,og2er koordinater for slutpunktet
Beregn dy = y2-og1
Beregn i1=2*dig
Beregn i2=2*(dy-dx)
Beregn d=i1-dxokse vs tyr
Hvis dx<0
Så er x = x2
y = y2
xende=x1
Hvis dx > 0
Så er x = x1
y = y1
xende=x20>latex skriftstørrelse
Hvis x > = xende
Hold op.
Hvis d<0
Så er d = d + i1
Hvis d ≧ 0
Så er d = d + i2
Forøg y = y + 10>
og1=1
x2=8
og2=5
dx= x2-x1=8-1=7
du = y2-og1=5-1=4
jeg1=2* ∆y=2*4=8
jeg2=2*(∆y-∆x)=2*(4-7)=-6
d = I1-∆x=8-7=1
x og d=d+I1eller jeg2 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 til implementering af Bresenhams linjetegningsalgoritme:
#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; }
Forskel mellem DDA-algoritmen og Bresenhams linjealgoritme:
DDA algoritme Bresenhams linjealgoritme 1. DDA-algoritmen bruger floating point, dvs. Real Aritmetic. 1. Bresenhams linjealgoritme bruger fast punkt, dvs. heltalsaritmetik 2. DDA-algoritmer bruger multiplikation og division 2.Bresenhams linjealgoritme bruger kun subtraktion og addition 3. DDA Algorithm er langsomt end Bresenhams Line Algorithm i stregtegning, fordi den bruger ægte aritmetik (Floating Point operation) 3. Bresenhams algoritme er hurtigere end DDA-algoritmen på linje, fordi den kun involverer addition og subtraktion i sin beregning og kun bruger heltalsaritmetik. 4. DDA Algorithm er ikke nøjagtig og effektiv som Bresenhams Line Algorithm. 4. Bresenhams Line Algorithm er mere præcis og effektiv ved DDA Algorithm. 5.DDA-algoritmen kan tegne cirkler og kurver, men er ikke nøjagtige som Bresenhams linjealgoritme 5. Bresenhams linjealgoritme kan tegne cirkler og kurver med mere nøjagtige end DDA-algoritmen.