Denne algoritmen brukes til å konvertere en linje. Den ble utviklet av Bresenham. Det er en effektiv metode fordi den bare involverer heltallsaddisjon, subtraksjoner og multiplikasjonsoperasjoner. Disse operasjonene kan utføres veldig raskt slik at linjer kan genereres raskt.
I denne metoden er neste piksel valgt den som har minst avstand fra sann linje.
Metoden fungerer som følger:
Anta en piksel P1'(x1',og1'), velg deretter påfølgende piksler mens vi jobber vår mai til natten, én pikselposisjon om gangen i horisontal retning mot P2'(x2',og2').
eksempel på brukernavn
Velg en gang en piksel i hvilket som helst trinn
Neste piksel er
- Enten den til høyre (nedre grense for linjen)
- En øverst til høyre og oppover (øvre grense for linjen)
Linjen tilnærmes best av de pikslene som faller minst avstand fra banen mellom P1',P2'.
To velger den neste mellom den nederste piksel S og topppiksel T.
Hvis S velges
Vi har xi+1=xJeg+1 og yi+1=yJeg
Hvis T velges
Vi har xi+1=xJeg+1 og yi+1=yJeg+1
De faktiske y-koordinatene til linjen ved x = xi+1er
y=mxi+1+b
Avstanden fra S til den faktiske linjen i y-retning
s = å-åJeg
Avstanden fra T til den faktiske linjen i y-retning
t = (yJeg+1)-y
Vurder nå forskjellen mellom disse 2 avstandsverdiene
s - t
Når (s-t)<0 ⟹ s < t< p>
Den nærmeste pikselen er S
Når (s-t) ≧0 ⟹ s Den nærmeste pikselen er T Denne forskjellen er Erstatter m med og introdusere beslutningsvariabel Hvor c= 2△y+△x (2b-1) Vi kan skrive beslutningsvariabelen di+1for neste slip on Siden x_(i+1)=xJeg+1, det har vi Spesielle tilfeller Hvis valgt piksel er på topppiksel T (dvs. dJeg≧0)⟹ ogi+1=yJeg+1 Hvis valgt piksel er nederst piksel T (dvs. dJeg<0)⟹ yi+1=yJeg Til slutt beregner vi d1 Siden mx1+b-yJeg=0 og m = , vi har 1. Det involverer bare heltallsaritmetikk, så det er enkelt. 2. Det unngår generering av dupliserte punkter. 3. Det kan implementeres ved hjelp av maskinvare fordi det ikke bruker multiplikasjon og divisjon. 4. Det er raskere sammenlignet med DDA (Digital Differential Analyzer) fordi det ikke involverer flytepunktberegninger som DDA-algoritmen. 1. Denne algoritmen er kun ment for grunnleggende linjetegning Initialisering er ikke en del av Bresenhams linjealgoritme. Så for å tegne jevne linjer, bør du se nærmere på en annen algoritme. Trinn 1: Start algoritme Steg 2: Deklarer variabel x1,x2,og1,og2,d,i1,Jeg2,dx,dy Trinn 3: Skriv inn verdien av x1,og1,x2,og2 Trinn 4: Regn ut dx = x2-x1 Trinn 5: Betrakt (x, y) som utgangspunkt og xsluttsom maksimal mulig verdi av x. Trinn 6: Generer punkt ved (x,y)koordinater. Trinn 7: Sjekk om hele linjen er generert. Trinn 8: Beregn koordinatene til neste piksel Trinn 9: Øk x = x + 1 Trinn 10: Tegn et punkt med siste (x, y) koordinater Trinn 11: Gå til trinn 7 Trinn 12: Slutt på algoritmen Eksempel: Start- og sluttposisjonen til linjen er (1, 1) og (8, 5). Finn mellompunkter. Løsning: x1=1 Produksjon:
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 konvertere char til streng
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 utgangspunktet
Og x2,og2er koordinatene til sluttpunktet
Regn ut dy = y2-og1
Beregn i1=2*du
Beregn i2=2*(dy-dx)
Regn ut d=i1-dxcss-kanten
Hvis dx<0
Da er x = x2
y = y2
xslutt=x1
Hvis dx > 0
Da er x = x1
y = y1
xslutt=x20>latex skriftstørrelse
Hvis x > = xslutt
Stoppe.
Hvis d<0
Da er d = d + i1
Hvis d ≧ 0
Da er d = d + i2
Øk 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 for å implementere 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; }
Skille mellom DDA Algorithm og Bresenhams Line Algorithm:
DDA-algoritme Bresenhams linjealgoritme 1. DDA-algoritmen bruker flytende komma, dvs. ekte aritmetikk. 1. Bresenhams linjealgoritme bruker fast punkt, dvs. heltallsaritmetikk 2. DDA-algoritmer bruker multiplikasjon og divisjon 2.Bresenhams linjealgoritme bruker kun subtraksjon og addisjon 3. DDA-algoritmen er sakte enn Bresenhams linjealgoritme i linjetegning fordi den bruker ekte aritmetikk (flytepunktoperasjon) 3. Bresenhams algoritme er raskere enn DDA-algoritmen på linje fordi den bare involverer addisjon og subtraksjon i beregningen og bruker kun heltallsaritmetikk. 4. DDA Algorithm er ikke nøyaktig og effektiv som Bresenhams Line Algorithm. 4. Bresenhams Line Algorithm er mer nøyaktig og effektiv ved DDA Algorithm. 5.DDA-algoritmen kan tegne sirkel og kurver, men er ikke nøyaktige som Bresenhams linjealgoritme 5. Bresenhams linjealgoritme kan tegne sirkel og kurver med mer nøyaktig enn DDA-algoritmen.