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 P 1 '(x 1 ',ja 1 '), valitse sitten seuraavat pikselit työskennellessämme toukokuusta yöhön, yksi pikselin sijainti kerrallaan vaakasuunnassa kohti P 2 '(x 2 ',ja 2 ').
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ä polusta 1 ',P 2 '.
To valitsee seuraavan alimman pikselin S ja ylimmän pikselin T väliltä.
Jos S valitaan
Meillä on x i+1 =x i +1 ja y i+1 =y i
Jos T valitaan
Meillä on x i+1 =x i +1 ja y i+1 =y i +1
Suoran todelliset y-koordinaatit kohdassa x = x i+1 On
y = mx i+1 +b
Etäisyys pisteestä S todelliseen linjaan y-suunnassa
s = y-y i
Etäisyys pisteestä T todelliseen suoraan y-suunnassa
t = (y i +1)-y
Mieti nyt näiden kahden etäisyysarvon eroa
s - t
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 Missä c = 2△y+△x (2b-1) Voimme kirjoittaa päätösmuuttujan d i+1 seuraavaa lipsahdusta varten Koska x_(i+1)=x i +1, meillä on Erikoistapaukset Jos valittu pikseli on ylimmässä kuvapisteessä T (eli d i ≧0)⟹ ja i+1 =y i +1 Jos valittu pikseli on alapikselissä T (eli d i <0)⟹ y i+1=y i Lopuksi lasketaan d 1 Koska mx 1 +b-y i =0 ja m = 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 x 1 ,x 2 ,ja 1 ,ja 2 ,d,i 1 ,i 2 ,dx,dy Vaihe 3: Syötä x:n arvo 1 ,ja 1 ,x 2 ,ja 2 Vaihe 4: Laske dx = x 2 -x 1 Vaihe 5: Otetaan (x, y) aloituspisteeksi ja x loppu kuin 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: x 1 =1 Lähtö:
s-t = (y-yi)-[(yi+1)-y]
= 2v - 2yi -1
ja esittelemme päätösmuuttujan
d i =△x (s-t)
d i =△x (2
(x i +1)+2b-2v i -1)
=2△xy i -2△y-1△x.2b-2y i △x-△x
d i =2△y.x i -2△x.y i +c
d i+1 =2△y.x i+1 -2△x.y i+1 +c
d i+1 -d i =2△y.(x i+1 -x i )- 2△x(y i+1 -ja i )
d i+1 +d i =2△y.(x i +1-x i )- 2△x(y i+1 -ja i )
d i+1 =d i +2△y-2△x
d i+1 =d i +2△v 0)⟹>
d 1 =△x[2m(x 1 +1)+2b-2v 1 -1]
d 1 =△x[2(mx 1 +b-y 1 )+2m-1]
, meillä on
d 1 =2△y-△x Etu:
Haitta:
Bresenhamin linja-algoritmi:
Missä x 1 ,ja 1 ovat lähtöpisteen koordinaatit
Ja x 2 ,ja 2 ovat loppupisteen koordinaatit
Laske dy = y 2 -ja 1
Laske i 1 =2*sinä
Laske i 2 =2*(dy-dx)
Laske d=i 1 -dx
Jos dx <0
Sitten x = x 2
y = y 2
x loppu =x 1
Jos dx > 0
Sitten x = x 1
y = y 1
x loppu =x 2 0>
Jos x > = x loppu
Lopettaa.
Jos d <0
Sitten d = d + i 1
Jos d ≧ 0
Sitten d = d + i 2
Kasvata y = y + 1 0>
ja 1 =1
x 2 =8
ja 2 =5
dx = x 2 -x 1 =8-1=7
sinä=y 2 -ja 1 =5-1=4
minä 1 =2* ∆y=2*4=8
minä 2 =2*(∆y-∆x)=2*(4-7)=-6
d = I 1 -∆x=8-7=1
x ja d=d+I 1 tai minä 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
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.