Export page to Open Document format

11 - Metody rasterizace 2D vektorových objektů

Definice

Rasterizace je proces převodu vektorové reprezentace dat na jejich rastrovou formu s cílem dosáhnout maximální možnou kvalitu a zároveň rychlost výsledného zobrazení.

Úsečka

Popis

Úsečka

Úsečka je základní geometrická vektorová entita definovaná:

  • souřadnicemi dvou koncových bodů
  • rovnicí přímky popisující geometrii

Obecná rovnice úsečky

Ax + By + C = 0, A = y_2 − y_1, B = x_2 − x_1

Parametrické vyjádření

x = x_1 + t (x_2 − x_1), y = y_1 + t (y_2 − y_1) , t\in <0, 1>

Směrnicový tvar

y = kx + q, k = {\Delta y}/{\Delta x} = (y_2 − y_1)/(x_2 − x_1)

Algoritmy pro vykreslení úsečky
Jsou odvozeny pro případ, kdy:

  • úsečka leží v prvním kvadrantu
  • je rostoucí od P1 ke koncovému P2
  • ostatní kvadranty vykreslujeme prohozením souřadnic, výměnou os

DDA - Digital Differential Analyser

Popis

  • Používá ”floating-point aritmetiku”, pak se zaokrouhluje
  • Nízká efektivita, náročná implementace do HW
  • V podstate x sa inkrementuje a y sa zväčšuje o smernicu
  • Vzorec smernice je vyssie, je to podiel prirastku y a x
x_{n + 1} = x_n + 1
y_{n + 1} = y_n + k, k = (y_2 − y_1)/(x_2 − x_1) … směrnice
LineDDA(int x1, int y1, int x2, int y2)
{
  double k = (y2-y1)/(x2-x1);
  double y = y1;
  for (int x = x1; x <= x2; x++)
  {
    draw_pixel( x, y);
    y += k;
  }
}

Error control DDA

Popis

  • modifikace DDA
  • V podstate len používame premennú E kde ukladame smernicu
  • Ak je hodnota E aspoň 0.5 a viac inkrementujeme X a odpočítame jedničku
LineEC(int x1, int y1, int x2, int y2)
{
  double k = (y2-y1) / (x2-x1);
  double E = 0;
  int y = y1;
  for (int x = x1; x <= x2; x++)
  {
    draw_pixel( x, y);
    E += k;
    if (E >= 0.5) { y++; E -= 1; }
  }
}

Bresenhamův algoritmus

Popis

Nejpoužívanější, velmi efektivní, snadná implementace do HW
Používá celočíselnou aritmetiku, sčítání, porovnání
Posun v ose Y podle znaménka prediktoru

  • Pokud E_i + k \ge 0.5, potom E_{i + 1} = E_i + k - 1
  • Pokud E_i + k < 0.5 potom E_{i + 1} = E_i + k

Takze po vynásobení rovnic 2\Delta x:

  • P_0 = 2\Delta y - \Delta x
  • P_i < 0 \doubleright P_{i + 1} = P_i + 2\Delta y
  • P_i \ge 0 \doubleright P_{i + 1} = P_i + 2 \Delta y - 2 \Delta x

V podstate:

  • nepracujeme so smernicou ale len s prírastkami
  • vytvoríme si tri predikáty
    • Upravovaný predikát: P_0 = 2\Delta y - \Delta x
    • Menší ako nula: P_1 = 2\Delta y
    • Aspoň nula: P_2 = P_1 - 2\Delta x
  • následne upravovaný predikát inkrementujeme o hodnotu P1 alebo P2
  • v prípade, že je P aspoň 0 inkrementujeme y
LineBres(int x1, int y1, int x2, int y2)
{
  int dx = x2-x1;
  int dy = y2-y1;
  int P = 2*dy – dx;
  int P1 = 2*dy, P2 = P1 - 2*dx;
  int y = y1;
  for (int x = x1; x <= x2; x++)
  {
    draw_pixel( x, y);
    if (P >= 0)
    { P += P2; y++; }
    else
      P += P1;
  }
}

Kružnice

Popis

Kružnice je základní geometrická vektorová entita definovaná:Kružnice
  • souřadnicemi středu [s_1, s_2]
  • hodnotou poloměru R
  • rovnicí kružnice popisující geometrii:


(x − s_1)^2 + (y − s_2)^2 − R^2 = 0


Kružnice je 8*symetrická⇒výpočet pro polovinu bodů jednoho kvadrantu, zbytek prohozením souřadnic a/nebo znamének souřadnice.
Algoritmy jsou odvozeny pro kružnice se středem v počátku [0,0].

Vykreslení po bodech

Popis

  • Používá ”floating-point aritmetiku”
  • nízká efektivita, náročná implementace v HW
  • vykreslujeme ve smere hodinových ruciciek.
  • od bodu [0,R] po pixelech dokud není x=y
dx = 1, y = \sqrt(R^2-x^2)

Vykreslení kružnice jako N-úhelník

Popis

  • Info
  • varianta DDA pro kružnici-floating point
  • aplikace rotacní transformace bodu.
  • používá „floating-point aritmetiku“.
  • nízká efektivita, nárocná implementace do HW.
  • rekurentní posun o konstaní přírůstek úhlu
  • funkce sin a cos jsou vypocítány pouze jednou!
  • souradnice X a Y se zaokrouhlují na nejbližší celé císlo.
  • vypoctené souˇradnice spojujeme úseckami.
  • Vzorce
  • x_{n + 1} = x_n \cos\alpha  − y_n \sin\alpha
  • y_{n + 1} = x_n \sin\alpha  − y_n \cos\alpha
  • V podstate
  • Vypočítame cos jedného uhla \cos (2\pi / N)
  • Vypočítame sin jedného uhla \sin (2\pi / N)
  • Začneme na súradnici R,0
  • Pre každý uhol vypočítame nové x a y podľa vzorca

Midpoint algoritmus

Popis

  • variace na Bresenhamův
  • celočíselná aritmetika
  • vysoká efektivita
  • snadná implementace
  • po pixelu od [0,R] dokud x = y
  • startovací hodnota je p_i = 1 − R
p_i = (x_i + 1)^2 + (y_i − 1/2)^2 − R^2
p_i < 0 \doubleright y_{i + 1} = y_i, p_{i+1} = p_i + 2x_i + 3
p_i \ge 0 \doubleright y_{i + 1} = y_i - 1, p_i + 1 = p_i + 2x_i − 2y_i + 5

Elipsa

Popis

Elipsa je základní geometrická vektorová entita definovaná:
  • souřadnicemi středu
  • hodnotami hlavní a vedlejší poloosy
  • úhlem natočení hlavní poloosy
  • rovnicí elipsy popisující geometrii: F(x, y) : b^2x^2 + a^2y^2 − a^2b^2 = 0
  • je 4x symetrická.
  • výpočet pre štvrtinu bodov

Midpoint algoritmus

Popis

  • ekvivalent midpointu pro kružnici
  • efektivní, snadná implementace v HW, celočíselná aritmetika
  • oblast I od[0,b] do 2b2x=2a2y. Oblast II do [a,0]
  • založen na určování polohy midpointu vůči elipse
  • V ose X/Y postupujeme o 1, v Y/X o posunu rozhoduje znaménko prediktoru.

Křivky

Popis

Rovnost přímek a kulatost kružnic je ideál, ve skutečnosti potřebujeme popsat křivé tvary. Parametrické vyjádření není pro grafiku vhodné, používá se maticový zápis.
Další použití:definice modelů, šablonování, definice fontů, určování dráhy objektů v animaci.

Požadované vlastnosti:

  • Invariance k lineárním transformacím(rotace řídících bodů nesmí ovlivnit průběh křivky)
  • Konvexní obálka - křivka leží v konvexní obálce svých řídících bodů
  • Interpolace krajních bodů
  • Lokalita změn - pokud posuneme řídící bod, mělo by se změnit jen jeho okolí ne celá křivka

INTERPOLAČNÍ KŘIVKA(prochází body) vs. APROXIMAČNÍ KŘIVKA(neprochází řídícími body)

Racionální křivka - řídící body mají váhové koeficienty (Neracionální - váhové koef.o velikosti 1)

Spojitost:

  • C0 - totožnost navazujících koncových bodů
  • C1 - totožnost tečných vektorů v navazujících bodech
  • C2 - totožnost vektorů 2.derivace v navazujicích bodech

Spline křivky - po částech polynomiální křivka, používá se s cílem minimalizace křivosti křivky(délku, energii)

Přirozený spline - interpoluje své řídící body

Interpolační

Fergusonova kubika

Popis

  • Nejčastější interpolační křivka
  • Určena dvěma koncovými body a dvěma tečnými vektory
  • Pro navázání segmentů je třeba definovat stejný bod i tečný vektor v obou segmentech (segment=křivka mezi dvěma body)
  • Pro definici se používá maticový zápis Hermitových polynomů

ferguson.jpg

Kochanek Bartels spline

Popis

  • interpolační spline křivka využívající Fergusonových kubik
  • určena množinou interpolačních bodů a jejich koeficientů, které určují chování v daném bodě
  • použití v animaci pro definici dráhy pohybu objektů

Catmull-Rom spline

Popis

  • interpolační spline křivka určená množinou bodů
  • Kochanek-Bartels spline s nulovými koeficienty
  • vychází z druhého bodu a končí v předposledním⇒k interpolaci okrajových bodů se použije zdvojení
  • neleží v konvexní obálce
  • tečný vektor je rovnoběžný s přímkou procházející sousedními body

Aproximační

Beziérovy křivky

Popis

  • Aproximační polynomiální křivka stupně n je určena n+1 body
  • používá Bernsteinovy polynomy definované rekurentě
  • prochází koncové body, leží v konvexní obálce
  • možno pro vykreslení použít algoritmus de Casteljau⇒dělení úseků řídícího polynomu na části t a 1 - t, spojování rekurzivně spočtených bodů úsečkami⇒body úsečky jsou rovnoměrně rozprostřené body pro rovné i křivé části.

Beziérovy kubiky

Popis

  • jeden segment popsán 4 řídícími body
  • při napojovánní segmentů je nutno mít totožné koncové body i tečné vektory v těchto bodech
  • invariantní k lineárním transformacím
  • vykreslování pomocí de Casteljau s koeficientem t=0.5

Racionální beziérové křivky

Popis

  • místo neracionálních Bersteinových polynomů se používají racionální polynomy
  • křivka leží v konvexní obálce
  • nelze použít algoritmus de Casteljau

Coonsova kubika

Popis

  • aproximační křivka, která neprochází koncovými řídícími body
  • polynomiální křivka n-tého stupně určena n+1 řídícími body
  • s křivkou se dá pracovat jen po segmentech, nelze přidávat jen samostatné body

B-spline křivky

Popis

  • zobecnění Coonsových kubik
  • křivka určena n+1 body a má spojitost k+1, kde k je stupněm křivky
  • mají nezápornou hodnotu a jednotkový součet⇒leží v konvexním obálce
  • vykreslování algoritmem de Boor(obdoba de Casteljau)
  • uzlový vektor představuje hodnoty parametru t v uzlech, čímž umožňuje lokální změnu křivky
  • uniformní je když je přírůstek t konstantní(např uzlový vektor 0,0.2,0.4,0.6,0.8,1)

NURBS Non Uniform Rational B-Spline

Popis

  • zobecnění B-spline křivek
  • přírůstek hodnoty parametru uzlového vektrou nemusí být konstantní(neuniformita)
  • každý bod má váhový koeficient(racionální)
  • invariantí vůči lineárním transformacím
  • umožnuje přesně vyjádřit kuželosečky

Pro zájemce

Diskuze

Jirka Hynekgeorge, 2011/03/15 19:20

Nahoď sem Jirko ještě obrázky těch jednotlivých křivek, jak jsme se domlouvali na srazu.

vagyvagabund, 2011/03/15 21:18

u elipsy dopsat midpoint algoritmus + bod, ve kterem dojde ke zmene os pri vypoctu ke kazde krivce dodat obrazek, jak vypada - je to ve slajdech k IZG

jinak se zmenil doodle (hlasovani), tak si to pak uloz, at se tam zobrazi tve jmeno

Jirka Hynekgeorge, 2011/03/16 14:58

Dobrá práce s těmi rovnicemi 8-) .

Jirka Hynekgeorge, 2011/03/22 11:17

Na fitušce jsem narazil u jednoho uživatele na toto, že to měl v podpise…

Anonymtest94.113.176.105, 2019/05/26 14:35

V Error control DDA máte, že se inkrementuje X, přitom dle kódu se inkrementuje Y.

Vložte svůj komentář
 
temata/11-rasterizace/main.txt · Poslední úprava: 2016/05/27 11:41 autor: xpavel27
Recent changes RSS feed Debian Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki