Wu-algoritmi

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 15. heinäkuuta 2019 tarkistetusta versiosta . tarkastukset vaativat 8 muokkausta .

Wun algoritmi  on algoritmi segmentin hajottamiseksi rasteriksi antialiasoinnilla . Sitä ehdotti Wu Xiaolin ( Xiaolin Wu , tästä syystä algoritmin vakiintunut nimi venäjäksi) Computer Graphics -lehden heinäkuussa 1991 julkaisemassa artikkelissa . Algoritmi yhdistää korkealaatuisen jakamisen ja nopeuden, joka on lähellä Bresenhamin algoritmia ilman antialiasointia.

Algoritmi

Vaaka- ja pystyviivat eivät vaadi anti-aliasointia, joten ne piirretään erikseen. Muilla linjoilla Wun algoritmi kulkee ne pääakselia pitkin sovittaen koordinaatit ei-pääakselille samalla tavalla kuin Bresenhamin algoritmi. Erona on, että Wun algoritmissa jokaisessa vaiheessa ei aseteta yksi, vaan kaksi pistettä. Esimerkiksi jos pääakseli on X , huomioidaan pisteet, joilla on koordinaatit (x, y) ja (x, y + 1) . Riippuen virheen suuruudesta, joka osoittaa kuinka kauas pikselit ovat menneet ideaalisesta linjasta sivuakselia pitkin, intensiteetti jakautuu näiden kahden pisteen kesken. Mitä kauempana piste on ideaalista, sitä pienempi sen intensiteetti. Kahden pikselin intensiteettiarvot laskevat aina yhteen, eli tämä on yhden pikselin intensiteetti täsmälleen ihanteellisella viivalla. Tällainen jakauma antaa viivalle saman intensiteetin koko sen pituudelta luoden samalla illuusion, että pisteet eivät sijaitse viivalla kahdessa, vaan yksi kerrallaan.

Toteutus pseudokoodissa (vain x-line):

funktion plot(x, y, c) on // piirtää pisteen koordinaatteilla (x, y) // ja kirkkaudella c (jossa 0 ≤ c ≤ 1) funktio ipart(x) palauttaa x:n kokonaisluvun funktio round(x) on paluu ipart(x + 0.5) // pyöristää lähimpään kokonaislukuun funktio fpart(x) palauttaa x: n murto-osan funktio draw_line(x1,y1,x2,y2) on jos x2 < x1 sitten swap (x1, x2) swap (y1, y2) loppuu jos dx:= x2 - x1 dy := y2 - y1 gradientti:= dy ÷ dx // prosessin aloituspiste xend:= pyöreä (x1) yend:= y1 + gradientti × (xend - x1) xgapg:= 1 - fpart(x1 + 0,5) xpxl1:= xend // käytetään pääsilmukassa ypxl1:= ipart(yend) plot(xpxl1, ypxl1, (1 - fpart(yend)) × xgap) plot(xpxl1, ypxl1 + 1, fpart(yend) × xgap) intery:= jendi + gradientti // silmukan ensimmäinen y-leikkaus // Käsittele päätepiste xend: = pyöreä (x2) jendi:= y2 + gradientti × (xend - x2) xgap:= fpart(x2 + 0,5) xpxl2:= xend // käytetään pääsilmukassa ypxl2:= ipart(yend) plot(xpxl2, ypxl2, (1 - fpart(yend)) × xgap) plot(xpxl2, ypxl2 + 1, fpart(yend) × xgap) // pääsilmukka x : lle xpxl1 + 1 - xpxl2 - 1 do tontti(x, osa(väli), 1 - fpart(väli)) tontti(x, osa(väli) + 1, fpart(väli)) intery := väli + kaltevuus toista lopetustoiminto _

Kirjallisuus

Katso myös