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
- Joko sen oikealla puolella oleva (linjan alaraja)
- 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'.
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
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 Korvaa m:lla ja esittelemme päätösmuuttujan Missä c = 2△y+△x (2b-1) Voimme kirjoittaa päätösmuuttujan di+1seuraavaa lipsahdusta varten Koska x_(i+1)=xi+1, meillä on Erikoistapaukset Jos valittu pikseli on ylimmässä kuvapisteessä T (eli di≧0)⟹ jai+1=yi+1 Jos valittu pikseli on alapikselissä T (eli di<0)⟹ yi+1=yi Lopuksi lasketaan d1 Koska mx1+b-yi=0 ja m = , meillä on 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. 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. 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 Vaihe 4: Laske dx = x2-x1 Vaihe 5: Otetaan (x, y) aloituspisteeksi ja xloppukuin suurin mahdollinen x:n arvo. Vaihe 6: Luo piste (x,y)-koordinaateissa. Vaihe 7: Tarkista, onko koko rivi luotu. Vaihe 8: Laske seuraavan pikselin koordinaatit 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 Lähtö:
s-t = (y-yi)-[(yi+1)-y]
= 2v - 2yi -1
di=△x (s-t)
di=△x (2 (xi+1)+2b-2vi-1)
=2△xyi-2△y-1△x.2b-2yi△x-△x
di=2△y.xi-2△x.yi+c
di+1=2△y.xi+1-2△x.yi+1+c
di+1-di=2△y.(xi+1-xi)- 2△x(yi+1-jai)
di+1+di=2△y.(xi+1-xi)- 2△x(yi+1-jai)
di+1=di+2△y-2△x
di+1=di+2△v0)⟹>
d1=△x[2m(x1+1)+2b-2v1-1]
d1=△x[2(mx1+b-y1)+2m-1]
d1=2△y-△xtcp ja ip malli
Etu:
Haitta:
Bresenhamin linja-algoritmi:
Missä x1,ja1ovat lähtöpisteen koordinaatit
Ja x2,ja2ovat loppupisteen koordinaatit
Laske dy = y2-ja1
Laske i1=2*sinä
Laske i2=2*(dy-dx)
Laske d=i1-dx
Jos dx<0
Sitten x = x2
y = y2
xloppu=x1
Jos dx > 0
Sitten x = x1
y = y1
xloppu=x20>
Jos x > = xloppu
Lopettaa.
Jos d<0
Sitten d = d + i1
Jos d ≧ 0
Sitten d = d + i2
Kasvata y = y + 10>
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(&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; }
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.