logo

Bresenhamin linja-algoritmi

Tätä algoritmia käytetään viivan skannaukseen. Sen on kehittänyt Bresenham. Se on tehokas menetelmä, koska se sisältää vain kokonaislukujen yhteenlasku-, vähennys- ja kertolaskuoperaatioita. Nämä toiminnot voidaan suorittaa erittäin nopeasti, joten rivit voidaan luoda nopeasti.

Tässä menetelmässä seuraavaksi valittu pikseli on se, jolla on pienin etäisyys todellisesta viivasta.

Menetelmä toimii seuraavasti:

Oletetaan pikseli P1'(x1',ja1'), valitse sitten seuraavat pikselit työskennellessämme toukokuusta yöhön, yksi pikselin sijainti kerrallaan vaakasuunnassa kohti P2'(x2',ja2').

Kerran pikseli valitse missä tahansa vaiheessa

Seuraava pikseli on

  1. Joko sen oikealla puolella oleva (linjan alaraja)
  2. Yksi yläreuna on oikea ja ylöspäin (linjan yläraja)

Viiva on parhaiten approksimoitu niiden pikselien avulla, jotka putoavat vähiten etäisyydelle P:n välisestä polusta1',P2'.

Bresenham

To valitsee seuraavan alimman pikselin S ja ylimmän pikselin T väliltä.
Jos S valitaan
Meillä on xi+1=xi+1 ja yi+1=yi
Jos T valitaan
Meillä on xi+1=xi+1 ja yi+1=yi+1

Suoran todelliset y-koordinaatit kohdassa x = xi+1On
y = mxi+1+b

Bresenham

Etäisyys pisteestä S todelliseen linjaan y-suunnassa
s = y-yi

Etäisyys pisteestä T todelliseen suoraan y-suunnassa
t = (yi+1)-y

Mieti nyt näiden kahden etäisyysarvon eroa
s - t

estetyt yhteystiedot

Milloin (s-t)<0 ⟹ s < t< p>

Lähin pikseli on S

Kun (s-t) ≧0 ⟹ s

Lähin pikseli on T

Tämä ero on
s-t = (y-yi)-[(yi+1)-y]
= 2v - 2yi -1

Bresenham

Korvaa m:lla Bresenhamja esittelemme päätösmuuttujan
di=△x (s-t)
di=△x (2 Bresenham(xi+1)+2b-2vi-1)
=2△xyi-2△y-1△x.2b-2yi△x-△x
di=2△y.xi-2△x.yi+c

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

Voimme kirjoittaa päätösmuuttujan di+1seuraavaa lipsahdusta varten
di+1=2△y.xi+1-2△x.yi+1+c
di+1-di=2△y.(xi+1-xi)- 2△x(yi+1-jai)

Koska x_(i+1)=xi+1, meillä on
di+1+di=2△y.(xi+1-xi)- 2△x(yi+1-jai)

Erikoistapaukset

Jos valittu pikseli on ylimmässä kuvapisteessä T (eli di≧0)⟹ jai+1=yi+1
di+1=di+2△y-2△x

Jos valittu pikseli on alapikselissä T (eli di<0)⟹ yi+1=yi
di+1=di+2△v

Lopuksi lasketaan d1
d1=△x[2m(x1+1)+2b-2v1-1]
d1=△x[2(mx1+b-y1)+2m-1]

Koska mx1+b-yi=0 ja m = , meillä on
d1=2△y-△x

tcp ja ip malli

Etu:

1. Se sisältää vain kokonaislukuaritmetiikkaa, joten se on yksinkertainen.

2. Se välttää kaksoispisteiden luomisen.

3. Se voidaan toteuttaa laitteistolla, koska se ei käytä kerto- ja jakolaskua.

4. Se on nopeampi verrattuna DDA:han (Digital Differential Analyzer), koska se ei sisällä liukulukuja, kuten DDA-algoritmi.

Haitta:

1. Tämä algoritmi on tarkoitettu vain perusviivan piirtämiseen Alustus ei ole osa Bresenhamin viivaalgoritmia. Joten piirtääksesi sileitä viivoja, sinun pitäisi haluta tarkastella erilaista algoritmia.

Bresenhamin linja-algoritmi:

Vaihe 1: Aloita algoritmi

Vaihe2: Ilmoita muuttuja x1,x2,ja1,ja2,d,i1,i2,dx,dy

Vaihe 3: Syötä x:n arvo1,ja1,x2,ja2
Missä x1,ja1ovat lähtöpisteen koordinaatit
Ja x2,ja2ovat loppupisteen koordinaatit

Vaihe 4: Laske dx = x2-x1
Laske dy = y2-ja1
Laske i1=2*sinä
Laske i2=2*(dy-dx)
Laske d=i1-dx

Vaihe 5: Otetaan (x, y) aloituspisteeksi ja xloppukuin suurin mahdollinen x:n arvo.
Jos dx<0
Sitten x = x2
y = y2
xloppu=x1
Jos dx > 0
Sitten x = x1
y = y1
xloppu=x2

Vaihe 6: Luo piste (x,y)-koordinaateissa.

Vaihe 7: Tarkista, onko koko rivi luotu.
Jos x > = xloppu
Lopettaa.

Vaihe 8: Laske seuraavan pikselin koordinaatit
Jos d<0
Sitten d = d + i1
Jos d ≧ 0
Sitten d = d + i2
Kasvata y = y + 1

Vaihe 9: Kasvata x = x + 1

Vaihe 10: Piirrä viimeisimpien (x, y) koordinaattien piste

Vaihe 11: Siirry vaiheeseen 7

Vaihe 12: Algoritmin loppu

Esimerkki: Viivan aloitus- ja loppupisteet ovat (1, 1) ja (8, 5). Etsi välipisteitä.

Ratkaisu: x1=1
ja1=1
x2=8
ja2=5
dx = x2-x1=8-1=7
sinä=y2-ja1=5-1=4
minä1=2* ∆y=2*4=8
minä2=2*(∆y-∆x)=2*(4-7)=-6
d = I1-∆x=8-7=1

x ja d=d+I1tai minä2
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

Ohjelma Bresenhamin viivapiirtoalgoritmin toteuttamiseksi:

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

Lähtö:


Tee ero DDA-algoritmin ja Bresenhamin linja-algoritmin välillä:

DDA-algoritmi Bresenhamin linja-algoritmi
1. DDA-algoritmi käyttää liukulukua, eli todellista aritmetiikkaa. 1. Bresenhamin viivaalgoritmi käyttää kiinteää pistettä eli kokonaislukuaritmetiikkaa
2. DDA Algorithms käyttää kerto- ja jakolaskua 2. Bresenhamin viiva-algoritmi käyttää vain vähennys- ja yhteenlaskutoimintoa
3. DDA-algoritmi on hidas kuin Bresenhamin viiva-algoritmi viivapiirroksessa, koska se käyttää todellista aritmetiikkaa (liukulukutoiminto) 3. Bresenhamin algoritmi on nopeampi kuin DDA-algoritmi, koska sen laskennassa käytetään vain yhteen- ja vähennyslaskua ja se käyttää vain kokonaislukuaritmetiikkaa.
4. DDA-algoritmi ei ole tarkka ja tehokas kuin Bresenhamin viiva-algoritmi. 4. Bresenhamin viiva-algoritmi on tarkempi ja tehokkaampi DDA-algoritmissa.
5.DDA-algoritmi voi piirtää ympyrää ja käyriä, mutta ei ole tarkkoja kuin Bresenhamin viivaalgoritmi 5. Bresenhamin viiva-algoritmi voi piirtää ympyrää ja käyriä tarkemmin kuin DDA-algoritmi.