Wu algoritmus

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 15. července 2019; kontroly vyžadují 8 úprav .

Wuův algoritmus  je algoritmus pro rozklad segmentu na rastr s vyhlazováním . Navrhl jej Wu Xiaolin ( Xiaolin Wu , odtud dobře zavedený název algoritmu v ruštině) v článku publikovaném časopisem Computer Graphics v červenci 1991 . Algoritmus kombinuje vysoce kvalitní dealiasing a rychlost blízkou algoritmu Bresenhamu bez vyhlazování.

Algoritmus

Vodorovné a svislé čáry nevyžadují žádné vyhlazování, takže se kreslí samostatně. U zbytku řádků je Wuův algoritmus prochází podél hlavní osy a přizpůsobuje souřadnice podél jiné než hlavní osy podobným způsobem jako Bresenhamův algoritmus. Rozdíl je v tom, že ve Wuově algoritmu není v každém kroku nastaven jeden, ale dva body. Pokud je například hlavní osou X , pak jsou uvažovány body se souřadnicemi (x, y) a (x, y + 1) . V závislosti na velikosti chyby, která ukazuje, jak daleko se pixely dostaly od ideální linie podél vedlejší osy, je intenzita rozdělena mezi tyto dva body. Čím dále je bod od ideální linie, tím menší je jeho intenzita. Hodnoty intenzity dvou pixelů se vždy sčítají k jedné, to znamená, že se jedná o intenzitu jednoho pixelu přesně na ideální čáře. Takové rozložení dá úsečce stejnou intenzitu po celé její délce a zároveň vytvoří iluzi, že body se podél čáry nenacházejí ve dvou, ale po jednom.

Implementace v pseudokódu (pouze pro x-line):

funkce plot(x, y, c) je // vykreslí bod se souřadnicemi (x, y) // a jasem c (kde 0 ≤ c ≤ 1) funkce ipart(x) je návratová celočíselná část x funkce round(x) je return ipart(x + 0,5) // zaokrouhlení na nejbližší celé číslo funkce fpart(x) je návratová zlomková část x funkce draw_line(x1,y1,x2,y2) je if x2 < x1 then swap (x1, x2) swap (y1, y2) end if dx:= x2 - x1 dy := y2 - y1 gradient:= dy ÷ dx // výchozí bod procesu xend:= round(x1) yend:= y1 + přechod × (xend - x1) xgapg:= 1 – fpart(x1 + 0,5) xpxl1:= xend // bude použit v hlavní smyčce ypxl1:= ipart(yend) plot(xpxl1, ypxl1, (1 - fpart(yend)) × xgap) plot(xpxl1, ypxl1 + 1, fpart(yend) × xgap) intery:= yend + gradient // první průsečík y pro smyčku // zpracování koncového bodu xend:= round(x2) yend:= y2 + přechod × (xend - x2) xgap:= fpart(x2 + 0,5) xpxl2:= xend // bude použit v hlavní smyčce ypxl2:= ipart(yend) plot(xpxl2, ypxl2, (1 - fpart(yend)) × xgap) plot(xpxl2, ypxl2 + 1, fpart(yend) × xgap) // hlavní smyčka pro x od xpxl1 + 1 do xpxl2 - 1 do plot(x, ipart(intery), 1 - fpart(intery)) plot(x, ipart(intery) + 1, fpart(intery)) intery := intery + gradient funkce opakování konce

Literatura

Viz také