Bresenhams linjealgoritme

Bresenhams linjealgoritme

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 P 1 '(x 1 ',og 1 '), velg deretter påfølgende piksler mens vi jobber vår mai til natten, én pikselposisjon om gangen i horisontal retning mot P 2 '(x 2 ',og 2 ').

Velg en gang en piksel i hvilket som helst trinn

Neste piksel er

  1. Enten den til høyre (nedre grense for linjen)
  2. 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 P 1 ',P 2 '.

Bresenham

To velger den neste mellom den nederste piksel S og topppiksel T.
Hvis S velges
Vi har x i+1 =x Jeg +1 og y i+1 =y Jeg
Hvis T velges
Vi har x i+1 =x Jeg +1 og y i+1 =y Jeg +1

De faktiske y-koordinatene til linjen ved x = x i+1 er
y=mx i+1 +b

Bresenham

Avstanden fra S til den faktiske linjen i y-retning
s = å-å Jeg

Avstanden fra T til den faktiske linjen i y-retning
t = (y Jeg +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
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1

Bresenham

Erstatter m med Bresenhamog introdusere beslutningsvariabel
d Jeg =△x (s-t)
d Jeg =△x (2 Bresenham(x Jeg +1)+2b-2y Jeg -1)
=2△xy Jeg -2△y-1△x.2b-2y Jeg △x-△x
d Jeg =2△y.x Jeg -2△x.y Jeg +c

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

Vi kan skrive beslutningsvariabelen d i+1 for neste slip on
d i+1 =2△y.x i+1 -2△x.y i+1 +c
d i+1 -d Jeg =2△y.(x i+1 -x Jeg )- 2△x(y i+1 -og Jeg )

Siden x_(i+1)=x Jeg +1, det har vi
d i+1 +d Jeg =2△y.(x Jeg +1-x Jeg )- 2△x(y i+1 -og Jeg )

Spesielle tilfeller

Hvis valgt piksel er på topppiksel T (dvs. d Jeg ≧0)⟹ og i+1 =y Jeg +1
d i+1 =d Jeg +2△y-2△x

Hvis valgt piksel er nederst piksel T (dvs. d Jeg <0)⟹ y i+1=y Jeg
d i+1 =d Jeg +2△y

Til slutt beregner vi d 1
d 1 =△x[2m(x 1 +1)+2b-2y 1 -1]
d 1 =△x[2(mx 1 +b-y 1 )+2m-1]

Siden mx 1 +b-y Jeg =0 og m = , vi har
d 1 =2△y-△x

Fordel:

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.

Ulempe:

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.

Bresenhams linjealgoritme:

Trinn 1: Start algoritme

Steg 2: Deklarer variabel x 1 ,x 2 ,og 1 ,og 2 ,d,i 1 ,Jeg 2 ,dx,dy

Trinn 3: Skriv inn verdien av x 1 ,og 1 ,x 2 ,og 2
Hvor x 1 ,og 1 er koordinater for utgangspunktet
Og x 2 ,og 2 er koordinatene til sluttpunktet

Trinn 4: Regn ut dx = x 2 -x 1
Regn ut dy = y 2 -og 1
Beregn i 1 =2*du
Beregn i 2 =2*(dy-dx)
Regn ut d=i 1 -dx

Trinn 5: Betrakt (x, y) som utgangspunkt og x slutt som maksimal mulig verdi av x.
Hvis dx <0
Da er x = x 2
y = y 2
x slutt =x 1
Hvis dx > 0
Da er x = x 1
y = y 1
x slutt =x 2

Trinn 6: Generer punkt ved (x,y)koordinater.

Trinn 7: Sjekk om hele linjen er generert.
Hvis x > = x slutt
Stoppe.

Trinn 8: Beregn koordinatene til neste piksel
Hvis d <0
Da er d = d + i 1
Hvis d ≧ 0
Da er d = d + i 2
Øk y = y + 1

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: x 1 =1
og 1 =1
x 2 =8
og 2 =5
dx= x 2 -x 1 =8-1=7
du=y 2 -og 1 =5-1=4
Jeg 1 =2* ∆y=2*4=8
Jeg 2 =2*(∆y-∆x)=2*(4-7)=-6
d = I 1 -∆x=8-7=1

x og d=d+I 1 eller jeg 2
1 1 d+I 2 =1+(-6)=-5
2 2 d+I 1 =-5+8=3
3 2 d+I 2 =3+(-6)=-3
4 3 d+I 1 =-3+8=5
5 3 d+I 2 =5+(-6)=-1
6 4 d+I 1 =-1+8=7
7 4 d+I 2 =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(&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; }  

Produksjon:


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.