logo

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 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

  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 P1',P2'.

Bresenham

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

Bresenham

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
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1

Bresenham

Erstatter m med Bresenhamog introdusere beslutningsvariabel
dJeg=△x (s-t)
dJeg=△x (2 Bresenham(xJeg+1)+2b-2yJeg-1)
=2△xyJeg-2△y-1△x.2b-2yJeg△x-△x
dJeg=2△y.xJeg-2△x.yJeg+c

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

java konvertere char til streng

Vi kan skrive beslutningsvariabelen di+1for neste slip on
di+1=2△y.xi+1-2△x.yi+1+c
di+1-dJeg=2△y.(xi+1-xJeg)- 2△x(yi+1-ogJeg)

Siden x_(i+1)=xJeg+1, det har vi
di+1+dJeg=2△y.(xJeg+1-xJeg)- 2△x(yi+1-ogJeg)

Spesielle tilfeller

Hvis valgt piksel er på topppiksel T (dvs. dJeg≧0)⟹ ogi+1=yJeg+1
di+1=dJeg+2△y-2△x

Hvis valgt piksel er nederst piksel T (dvs. dJeg<0)⟹ yi+1=yJeg
di+1=dJeg+2△y

Til slutt beregner vi d1
d1=△x[2m(x1+1)+2b-2y1-1]
d1=△x[2(mx1+b-y1)+2m-1]

Siden mx1+b-yJeg=0 og m = , vi har
d1=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 x1,x2,og1,og2,d,i1,Jeg2,dx,dy

Trinn 3: Skriv inn verdien av x1,og1,x2,og2
Hvor x1,og1er koordinater for utgangspunktet
Og x2,og2er koordinatene til sluttpunktet

Trinn 4: Regn ut dx = x2-x1
Regn ut dy = y2-og1
Beregn i1=2*du
Beregn i2=2*(dy-dx)
Regn ut d=i1-dx

css-kanten

Trinn 5: Betrakt (x, y) som utgangspunkt og xsluttsom maksimal mulig verdi av x.
Hvis dx<0
Da er x = x2
y = y2
xslutt=x1
Hvis dx > 0
Da er x = x1
y = y1
xslutt=x2

latex skriftstørrelse

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

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

Trinn 8: Beregn koordinatene til neste piksel
Hvis d<0
Da er d = d + i1
Hvis d ≧ 0
Da er d = d + i2
Ø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: x1=1
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(&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.