logo

Bresenhams linjealgoritm

Denna algoritm används för att skanna omvandling av en linje. Det utvecklades av Bresenham. Det är en effektiv metod eftersom den endast involverar heltalsaddition, subtraktioner och multiplikationsoperationer. Dessa operationer kan utföras mycket snabbt så linjer kan genereras snabbt.

I denna metod är nästa pixel som väljs den som har det minsta avståndet från den sanna linjen.

Metoden fungerar enligt följande:

Antag en pixel P1'(x1',och1'), välj sedan efterföljande pixlar medan vi arbetar vår maj till natten, en pixelposition åt gången i horisontell riktning mot P2'(x2',och2').

Välj en gång en pixel i vilket steg som helst

Nästa pixel är

  1. Antingen den till höger (nedre gräns för linjen)
  2. En överst till höger och uppåt (övre gräns för linjen)

Linjen uppskattas bäst av de pixlar som faller minst avstånd från banan mellan P1',P2'.

Bresenham

För att välja nästa mellan den nedre pixeln S och den översta pixeln T.
Om S väljs
Vi har xi+1=xi+1 och yi+1=yi
Om T väljs
Vi har xi+1=xi+1 och yi+1=yi+1

Linjens faktiska y-koordinater vid x = xi+1är
y=mxi+1+b

Bresenham

Avståndet från S till den faktiska linjen i y-riktning
s = å-åi

Avståndet från T till den faktiska linjen i y-riktning
t = (yi+1)-y

Tänk nu på skillnaden mellan dessa 2 avståndsvärden
s - t

När (s-t)<0 ⟹ s < t< p>

Den närmaste pixeln är S

När (s-t) ≧0 ⟹ s

Den närmaste pixeln är T

Denna skillnad är
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1

Bresenham

Ersätter m med Bresenhamoch införa beslutsvariabel
di=△x (s-t)
di=△x (2 Bresenham(xi+1)+2b-2yi-1)
=2△xyi-2△y-1△x.2b-2yi△x-△x
di=2△y.xi-2△x.yi+c

Där c= 2△y+△x (2b-1)

Vi kan skriva beslutsvariabeln di+1för nästa slip on
di+1=2△y.xi+1-2△x.yi+1+c
di+1-di=2△y.(xi+1-xi)- 2△x(yi+1-ochi)

Eftersom x_(i+1)=xi+1, det har vi
di+1+di=2△y.(xi+1-xi)- 2△x(yi+1-ochi)

Speciella fall

Om den valda pixeln är på den översta pixeln T (d.v.si≧0)⟹ ochi+1=yi+1
di+1=di+2△y-2△x

Om den valda pixeln är på den nedre pixeln T (d.v.si<0)⟹ yi+1=yi
di+1=di+2△y

Slutligen beräknar vi d1
d1=△x[2m(x1+1)+2b-2y1-1]
d1=△x[2(mx1+b-y1)+2m-1]

Sedan mx1+b-yi=0 och m = , vi har
d1=2△y-△x

Fördel:

1. Det involverar bara heltalsaritmetik, så det är enkelt.

2. Det undviker generering av dubbla punkter.

3. Det kan implementeras med hjälp av hårdvara eftersom det inte använder multiplikation och division.

4. Det är snabbare jämfört med DDA (Digital Differential Analyzer) eftersom det inte involverar flyttalsberäkningar som DDA Algorithm.

Nackdel:

1. Denna algoritm är endast avsedd för grundläggande linjeritning. Initiering är inte en del av Bresenhams linjealgoritm. Så för att rita jämna linjer bör du titta på en annan algoritm.

Bresenhams linjealgoritm:

Steg 1: Starta algoritm

Steg 2: Deklarera variabel x1,x2,och1,och2,d,i1, jag2,dx,dy

Steg 3: Ange värdet på x1,och1,x2,och2
Där x1,och1är startpunktens koordinater
Och x2,och2är koordinater för slutpunkten

sortera arraylist

Steg 4: Beräkna dx = x2-x1
Beräkna dy = y2-och1
Beräkna i1=2*du
Beräkna i2=2*(dy-dx)
Beräkna d=i1-dx

Steg 5: Betrakta (x, y) som utgångspunkt och xslutetsom högsta möjliga värde på x.
Om dx<0
Då är x = x2
y = y2
xslutet=x1
Om dx > 0
Då är x = x1
y = y1
xslutet=x2

Steg 6: Generera punkt vid (x,y)koordinater.

Steg 7: Kontrollera om hela linjen genereras.
Om x > = xslutet
Sluta.

Steg 8: Beräkna koordinaterna för nästa pixel
Om d<0
Då d = d + i1
Om d ≧ 0
Då d = d + i2
Öka y = y + 1

Steg 9: Öka x = x + 1

Steg 10: Rita en punkt med de senaste (x, y) koordinaterna

Steg 11: Gå till steg 7

Steg 12: Slut på algoritm

Exempel: Linjens start- och slutposition är (1, 1) och (8, 5). Hitta mellanpunkter.

Lösning: x1=1
och1=1
x2=8
och2=5
dx= x2-x1=8-1=7
du=y2-och1=5-1=4
jag1=2* ∆y=2*4=8
jag2=2*(∆y-∆x)=2*(4-7)=-6
d = I1-∆x=8-7=1

x och d=d+I1eller jag2
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 för att implementera Bresenhams linjeritningsalgoritm:

 #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; } 

Produktion:


Skilja mellan DDA-algoritmen och Bresenhams linjealgoritm:

DDA-algoritm Bresenhams linjealgoritm
1. DDA-algoritmen använder flyttal, dvs. Real Aritmetic. 1. Bresenhams linjealgoritm använder fast punkt, dvs heltalsaritmetik
2. DDA-algoritmer använder multiplikation och division 2.Bresenhams linjealgoritm använder endast subtraktion och addition
3. DDA Algorithm är långsamt än Bresenhams Line Algorithm i linjeritning eftersom den använder riktig aritmetik (flytpunktsoperation) 3. Bresenhams algoritm är snabbare än DDA-algoritmen i linje eftersom den endast involverar addition och subtraktion i sin beräkning och använder endast heltalsaritmetik.
4. DDA Algorithm är inte exakt och effektiv som Bresenhams Line Algorithm. 4. Bresenhams Line Algorithm är mer exakt och effektiv vid DDA Algorithm.
5.DDA-algoritmen kan rita cirklar och kurvor men är inte exakta som Bresenhams linjealgoritm 5. Bresenhams linjealgoritm kan rita cirklar och kurvor med mer exakt än DDA-algoritmen.