Geometrie/Rasterizace: Porovnání verzí

Z testwiki
Skočit na navigaci Skočit na vyhledávání
imported>JAnDbot
m robot: kosmetické úpravy
 
(Žádný rozdíl)

Aktuální verze z 31. 3. 2023, 12:14

Rasterizace

Při zobrazení reálného modelu ve světových souřadnicích na výstupní zařízení (rastrové, vektorové) potřebujeme zajistit co nejvěrnější podobnost reálného a zobrazovaného modelu. Omezíme se v tomto textu na rastrové výstupní zařízení, jehož nejjednodušším grafickým prvkem je bod. Protože složitější objekty jsou jen skládankou jednodušších objektů, potřebujeme mít k dispozici algoritmy na výpočet polohy bodů jednoduchých objektů jako úsečky, kružnice, elipsy, oblouků, atd... Ukážeme si některé algoritmy pro výpočet bodů úsečky a kružnice.

Popis algoritmů

DDA algoritmus

Jedna se o přírustkový algoritmus. Jednoduchý algoritmus pro výpočet bodů úsečky. Ve směru jedné osy s větším přírůstkem inkrementuje o krok 1 a ve směru druhé osy o krok menší než 1 podle poměru délky úsečky ve směru x a ve směru y. Algoritmus je jednoduchý, ale relativně pomalý protože pracuje v oboru reálných čísel.

Označme Δx=x2x1,Δy=y2y1,k=ΔyΔx, potom
a) když k<1,1> (osa s větším přírůstkem je X) zvolíme tedy dx=1, dostáváme dy=kdx=k.
Souřadnice dalšího bodu [xi+1,yi+1] vypočítáme:
xi+1=xi+dx=xi+1
yi+1=yi+dy=yi+k
b) když k<1 nebo k>1 (osa s větším přírustkem je Y) zvolíme tedy dy=1, dostáváme dx=dy/k=1/k.
A souřadnice dalšího bodu [xi+1,yi+1] vypočítáme:
xi+1=xi+dx=xi+1/k
yi+1=yi+dy=yi+1

Bresenhamův algoritmus pro úsečku

Mnohem rychlejší algoritmus pro generování bodů úsečky poskytuje tento algoritmus, používající pouze celočíselnou aritmetiku. Ve směru osy s větším přírustkem (nezávislé) inkremtentuje opět s krokem 1, ale ve směru druhé osy (závislé) vypočte chybový člen a podle něj určí bližší pixel k úsečce.

Předpokládejme že nezávislá souřadnice je souřadnice X, tedy k<0,1> (v opačném případě by se postupovalo analogicky).

Označme Δx=x2x1,Δy=y2y1,k=ΔyΔx
Chybový člen e1=2ΔyΔx
Rekurzivní výpočet i+1. kroku (poslední vykreslený bod [xi,yi]), pro pozici dalšího bodu jsou dvě možnosti:
1) ei<0 - jako další bod zobrazíme bod [xi+1,yi] a chybový člen ei+1=ei+2Δy
2) ei>=0 - jako další bod zobrazíme bod [xi+1,yi+1] a chybový člen ei+1=ei+2(ΔyΔx)

Kresba kružnice pomocí otáčení bodu

Jednoduchá metoda pro výpočet bodů kružnice spočívá v tom, že vezmeme jeden bod ležící na kružnici (dána středem a poloměrem) a otáčíme jej o zadaný úhel proti směru hodinových ručiček. Body postupně spojujeme úsečkami (např. DDA). Je vidět, že kružnice je v tomto případě pouze aproximována nějakým pravidelným mnohoúhelníkem. Čím menší úhel, o který otáčíme, tím "věrnější" kružnici dostaneme.

Body na kružnici splňují v polárních souřadnicích rovnice
x=rcos(α) a y=rsin(α)
Zvolíme libovolný bod na kružnici, [x1,y1], další bod otočený o úhel α vypočteme rekurzivně:
xi+1=xicos(α)yisin(α),
yi+1=xisin(α)+yicos(α)
Stačí zvolit krok α a postupně spojovat vypočítané body nějakým úsečkovým algoritmem.

Bresenhamův algoritmus pro kružnici

Opět rychlejší algoritmus pracující podobně jako pro úsečku a jen v celočíselné aritmetice. Počítáme body pouze jednoho oktantu (zbylých 7 oktantů stačí vykreslit pomocí symetrie).

Algoritmus vypočte body na kružnici se středem v počátku a zadaným poloměrem pouze ve druhém oktantu. Body ostatních oktantů vykreslí symetricky a všechny posune o souřadnice středu kružnice.

Označme r - poloměr kružnice.
Chybový člen p1=32r
Rekurzivní výpočet i+1. kroku (poslední vykreslený bod [xi,yi]), pro pozici dalšího bodu jsou dvě možnosti:
1) pi<0 - jako další bod zobrazíme bod [xi+1,yi] a chybový člen pi+1=pi+4xi+6
2) pi>=0 - jako další bod zobrazíme bod [xi+1,yi1] a chybový člen pi+1=pi+4(xiyi)+10

Kód v jazyce C#

Příklad řešení v jazyce C#.

Autoři

Tento text vypracovali studenti Univerzity Palackého v Olomouci katedry Matematické informatiky jako součást zápočtového úkolu do předmětu Počítačová geometrie.