====== Zadanie ====== Parametrické křivky, Lagrange, Hermite, Bezier, Coons, NURBS. Spojitost, změna stupně, podmínky pro hladké navázání. (PB009, PA010) ====== Vypracovanie ====== Krivky sú obyčajne v počítači reprezentované ako sústava parametrov nejakej rovnice, ktorá je následne generatívne zobrazovaná. Toto vyjadrenie môže byť v podstate trojaké -- //explicitné//, //implicitné// a //parametrické//. **Explicitne** zadaná krivka je vyjadrená funkciou y = f(x) a býva orientovaná v smere rastúceho x. Takto však môžu byť vyjadrené len krivky, ktoré sú zároveň funkciami, teda jednej hodnote z definičného oboru x zodpovedná jedna funkčná hodnota y. **Implicitne** zadaná krivka je vyjadrená rovnicou F(x,y) = 0. Táto reprezentácia je pomerne ťažko zobraziteľná, pretože neumožňuje postupný výpočet krivky. (Tieto krivky sú základom tzv. level set metód v spracovaní obrazu, viď PA166.) **Parametrický** tvar krivky ju chápe ako dráhu pohybúceho sa bodu, ktorého súradnice sú funkciami parametru t, teda času, a vyjadruje sa rovnicami x = x(t), y = y(t) a z = z(t). Čas je z intervalu t \in , najčastejšie volený v rozsahu t \in <0, 1>. Výhodou parametrického zápisu krivky je možnosť zachytiť priebeh, kedy krivka prechádza viackrát v rôznych časových okamihoch rovnakými bodmi v priestore (môže sa skrížiť, uzavieť a podobne). Uvedenými parametrickými funkciami je určená buď //**bodová rovnica**// krivky Q(t) = [x(t), y(t), z(t)], alebo //**vektorová rovnica**// \vec{q}(t) = (x(t), y(t), z(t)). //**Dotykový vektor** (tečný vektor)// v bode Q(t_{0}) je určený deriváciami parametricky vyjadrenej krivky po zložkách v tvare \vec{q}(t_{0}) = (x'(t_{0}), y'(t_{0}), z'(t_{0})) = \left(\frac{dx(t_{0})}{dt}, \frac{dy(t_{0})}{dt}, \frac{dz(t_{0})}{dt}\right). Rovnica //**dotyčnice** (tečny)// v danom bode má tvar P(u) = Q(t_{0}) + u.\vec{q'}(t_{0}). Vektor \vec{q'}(t) sa nazýva //smerový vektor priamky//. Parametrická reprezentácia ľahko vyjadruje dotyčnice ku krivke, čo sa využíva pri skladaní kriviek (viac v časti o spojitosti kriviek). ===== Parametrické krivky ===== Základným druhom parametrických kriviek používaných v počítačovej grafike sú krivky //**polynomiálne**//. Q_{n}(t) = a_{0} + a_{1}(t) + ... + a_{n}(t)^{n} Výhodou je, že polynomiálne krivky vieme ľahko vyčísliť a sú jednoducho diferencovateľné. Z nich často skladáme krivky //po častiach polynomiálne//, ktorých segmenty sú polynomiálnymi krivkami. Najčastejšie používame krivky 3. stupňa -- //**kubiky**//. Pri nich vieme napríklad zaručiť C^{2} spojitosť. Modelovanie týchto kriviek prebieha pomocou definovania tzv. //riadiacich bodov//. Existujú 2 spôsoby interpretácie riadiacich bodov -- //**interpolácia**// a //**aproximácia**//. Krivka generovaná pri interpolácií prebieha danými bodmi, avšak pri aproximácií je tvar krivky riadiacimi bodmi len určený, prechádzať nimi ale nemusí. Parametricky zadaná kubika má tvar x(t) = a_{x}t^{3} + b_{x}t^{2} + c_{x}t + d_{x},\\ y(t) = a_{y}t^{3} + b_{y}t^{2} + c_{y}t + d_{y},\\ z(t) = a_{z}t^{3} + b_{z}t^{2} + c_{z}t + d_{z}, čo môžeme v maticovom tvare zapísať ako Q(t) = \mathbf{T}.\mathbf{C} = \begin{bmatrix}t^{3} & t^{2} & t & 1\end{bmatrix}.\begin{bmatrix}a_{x} & a_{y} & a_{z} \\ b_{x} & b_{y} & b_{z} \\ c_{x} & c_{y} & c_{z} \\ d_{x} & d_{y} & d_{z}\end{bmatrix} a jej dotykový vektor \vec{q'}(t) získame deriváciou vektoru \mathbf{T}, teda \vec{q'}(t) = \frac{d}{dt}\mathbf{T}.\mathbf{C} = \begin{bmatrix}3t^{2} & 2t & 1 & 0\end{bmatrix}.\mathbf{C}. V prípade kubík môžeme maticu rozpísať do súčinu \mathbf{C} = \mathbf{M}.\mathbf{G}, kde \mathbf{M} je //**bázová matica**// a \mathbf{G} je //**vektor geometrických podmienok**//, ktorý obsahuje konkrétne parametre ovplyvňujúce tvar krviky (riadiace body a dotykové vektory). Súčin \mathbf{T}.\mathbf{M} potom definuje //**polynomiálnu bázu**// (skupinu polynómov), ktorá je spoločná pre všetky krivky určitého typu. Tieto polynómy spolu s násobenými geometrickými podmienkami sa uplatňujú ako premenlivé váhy riadené parametrom t. Hodnota parametru potom určuje uplatnenie podmienky buď na začiatku krivky, vo vnútornom priebehu, alebo má najväčší vplyv na koncovú časť. Q(t) = \mathbf{T}.\mathbf{M}.\mathbf{G} = \begin{bmatrix}t^{3} & t^{2} & t & 1\end{bmatrix}.\begin{bmatrix}m_{11} & m_{12} & m_{13} & m_{14} \\ m_{21} & m_{22} & m_{23} & m_{24} \\ m_{31} & m_{32} & m_{33} & m_{34} \\ m_{41} & m_{42} & m_{43} & m_{44}\end{bmatrix}.\begin{bmatrix}G_{1} \\ G_{2} \\ G_{2} \\ G_{4}\end{bmatrix} ===== Interpolačné krivky ===== Zá kladným spôsobom ako interpolovať funkciu zadanú v diskrétnych bodoch je použiť //**Langrangeov interpolujúci polynóm**// (po česky //interpolační//). {{:mgr-szz:in-gra:lag_inter_1.jpg?350|Lagrangeova interpolácia}} Nevýhodou je nutnosť prepočítať všetky //bázické polynómy//, ak sa rozhodneme pridať ďalší uzlový bod. Uveďme si príklad výpočtu Lagrangeovho polynómu 2. stupňa. {{:mgr-szz:in-gra:lag_inter_2.jpg?400|Lagrangeova interpolácia - príklad}} Po výpočte **príkladu** získavame krivku zadanú polynómom P(t) = P_{0}.\left(\frac{t^{2} - 3t + 2}{2}\right) - P_{1}.\left(t^{2} - 2t\right) + P_{2}.\left(\frac{t^{2} - t}{2}\right). ==== Hermite ==== Najznámejšie interpola čné krivy používané v počítačovej grafike sú Hermitovské krivky, hlavne //**Hermitovské kubiky**// (tiež aj Fergusonove kubiky). Sú určené dvoma riediacimi bodmi P_{0}, P_{1} a dvomi dotykovými vektormi \vec{p'}_{0}, \vec{p'}_{1}. Body určujú začiatočný a koncový bod krivky, smer a veľkosť vektorov jej vyklenutie. Čím je vektor väčší, tým viac sa k nemu krivka primkýna. Ak sú obidva vektory nulové, jedná sa vlastne o úsečku. {{ http://upload.wikimedia.org/wikipedia/commons/thumb/6/61/HermiteBasis.svg/300px-HermiteBasis.svg.png?300|Kubické Hermitovské polynómy}} Predpis pre výpočet Hermitovskej kubiky má tvar Q(t) = \begin{bmatrix}t^{3} & t^{2} & t & 1\end{bmatrix}.\begin{bmatrix}2 & -2 & 1 & 1 \\ -3 & 3 & -2 & -1 \\ 0 & 0 & 1 & 0 \\ 1 & 0 & 0 & 0\end{bmatrix}.\begin{bmatrix}P_{0} \\ P_{1} \\ \vec{p'}_{0} \\ \vec{p'}_{1}\end{bmatrix} = P_{0}.F_{1}(t) + P_{1}.F_{2}(t) + \vec{p'}_{0}.F_{3}(t) + \vec{p'}_{1}.F_{4}(t), kde dostávame tzv. //**kubické Hermitovské polynómy**// (Hermitovské polynómy 3. stupňa) F_{1}(t) = 2t^{3} - 3t^{2} + 1 (červený), F_{2}(t) = -2t^{3} + 3t^{2} (modrý), F_{3}(t) = t^{3} - 2t^{2} + t (zelený), F_{4}(t) = t^{3} - t^{2} (cyan). Výhoda týchto kubík sa prejavuje pri ich nadväzovaní, keďže dotykové vektory v koncových bodoch sú priamo súčasťou definície. Napr. spojitosť C^{1} je zaručená totožnosťou koncových bodov a identitou dotykových vektorov v týchto bodoch či spojitosť G^{1} docielime lineárnou závislosťou dotykových vektorov (viď spojitosť kriviek). Hermitovské kubiky sú aj základom animačných kriviek //Kochanek-Bartels// (viď otázka 13-gra). ===== Aproximačné krivky ===== ==== Béziér ==== Bézierove krivky sa používajú častejšie na modelovanie v dvoch rozmeroch, napríklad pri definícii fontov. //Bézierove krivky// n//-tého stupňa// sú určené n + 1 bodmi riadiaceho polynómu P_{i}. Medzi vlastnosti patrí, že zmenou polohy jedného riadiaceho bodu dôjde k zmene tvaru celej krivky. Preto sa krivky často delia na segmenty nižšieho stupňa (napr. kubiky), ktoré sa postupne naväzujú. Q(t) = \sum_{i=0}^{n} P_{i}B_{i}^{n}(t) Základom Bézierových kriviek sú //**Bernsteinove polynómy**// n//-tého stupňa//. {{:mgr-szz:in-gra:bernstein.jpg?350|Bernsteinove polynómy}} Medzi vlastnosti Bernsteinovych polynómov patrí ich nezápornosť (1), súčet váh vždy 1 (3), teda výsledná krivky bude ležať v konvexnej obálke bodov riadiaceho polynómu. Rekurentná definícia (2) vychádza z lineárnej kombinácie polynómov nižšieho stupňa. Na konštrukciu Bézierovej krivky sa používa rekurzívny //**algoritmus deCasteljau**//. Vstupom algoritmu sú riadiace body polygónu. Výstupom je bod krivky v určitom čase t. Na druhom obrázku vidíme **príklad** výpočtu a schému výpočtu bodu Bézierovej kubiky v čase t = 2/3. {{:mgr-szz:in-gra:deCastel_1.jpg?350 |Algoritmus deCasteljau}} {{:mgr-szz:in-gra:deCastel_2.jpg?300 |Výpočet deCasteljau}} {{:mgr-szz:in-gra:deCastel_3.jpg?400|Zhrnutie deCasteljau}} //**Bézierova kubika**// je určená 4 bodmi P_{0}, P_{1}, P_{2} a P_{3} (zápis kubiky P(t) vidíme na druhom obrázku). Popisujú ju 4 Bernsteinove polynómy 3. stupňa (vidíme ich graficky znázornené na obrázku s vlastnosťami Bernsteinových polynómov). Zaujímavé sú dotykové vektory \vec{p'}(0) = 3(P_{1} - P_{0}) a \vec{p'}(1) = 3(P_{3} - P_{2}). Z tohto vzťahu pre dotykové vektory je totiž zrejmý jednoduchý a priamočiary prevod medzi Bézierovou kubikou a kubikou v Hermitovskej reprezentácii. ==== B-spline, Coons ==== //Prirodzený spline// je po častiach polynomiálna krivka, ktorá interpoluje svoje riadiace body. //Prirodzený kubický spline// sa skladá z polynomiálnych kriviek 3. stupňa a vo svojich uzloch je C^{2} spojitý. V počítačovej grafike sa najčastejšie používa ale //**B-spline**//, ktorý nie je prirodzený (interpolačný), ale jedná sa o krivku aproximačnú. Poznáme dva základné typy -- //**uniformný neracionálny**// a //**neuniformný racionálny**//. {{ :mgr-szz:in-gra:bspline_1.jpg?200|Kubické Coonsove polynómy}} //Uniformný neracionálný B-splajn// nazývame tiež //**Coonsova kubika**//. Je určená 4 riadiacimi bodmi P_{0}, P_{1}, P_{2} a P_{3}. Priebeh bázových polynómov Coonsových kubík môžeme vidieť na obrázku. Segment takejto krivky teda na rozdiel od Bézierových kriviek neprechádza krajnými bodmi svojho riadiaceho polygónu. Dosedením t = 0 do maticového zápisu (vidíme ho na obrázku) zistíme, že krivka začína v bode ležiacom v jednej tretine ťažnice pri P_{1} trojuholníka určeného prvými 3 bodmi (teda P_{0}, P_{1} a P_{2}). Takisto aj koncový bod krivky (na obrázku je krivka zaznačená ako segment Q_{3}) v čase t = 1 leží v tretine ťažnice pri P_{2} trojuholníka určeného bodmi P_{1}, P_{2} a P_{3}. //**Coonsov B-spline**// vzniká naväzovaním Coonsových kubík, je teda určená 4 a viacerými bodmi (n \geq 4). Skladá sa potom z n - 3 segmentov. Každý segment Q_{i} je určený bodmi P_{i-3}, P_{i-2}, P_{i-1} a P_{i}. Koncový bod jedného segmentu a ziačiatočný bod ďalšieho segmentu majú rovnaké prvé a druhé derivácie, teda Coonsove krivky sú v uzloch C^{2} spojité. {{:mgr-szz:in-gra:bspline_2.jpg?350|Coonsov B-spline}} Medzi dôležité vlastnosti B-spline kriviek patrí invariancia (nemennosť) voči otočeniu, posunutiu a zmene mierky. B-spline leží celý v konvexnej obálke určenej jeho riadiacimi bodmi. Zmenou polohy niektorého z riadiacich bodov sa zmení len tá časť krivky, ktorá je týmto bodom určená. Ak posunieme bod P_{i}, zmení sa tvar štyroch segmentov Q_{i}, Q_{i+1}, Q_{i+2} a Q_{i+3}. ==== NURBS ==== //**Neuniformné racionálne B-spline** krivky// sú zovšeobecnením vyššie uvedených B-spline kriviek. //Neuniformné// sú ale preto, lebo vzdialenosť uzlov v zmysle parametru t nemusí byť konštantná. //Racionálne// znamená, že body sú reprezentované svojimi homogénnymi súradnicami. Krivka NURBS je určená minimálne 4 bodmi P_{0},..., P_{n} riadiaceho polygónu, rádom k (kde najvyšší stupeň polynómu je k - 1) a //uzlovým vektorom// (t_{0},..., t_{n+k}), ktorý je tvorený postupnosťou neklesajúcich reálnych čísel -- uzlových hodnôt. {{:mgr-szz:in-gra:nurbs_1.jpg?400|NURBS}} V zápise NURBS krivky je w_{i} váha i-tého bodu riadiaceho polygónu a B_{i,k}(t) sú //normalizované B-spline bázové funkcie//. Pre váhu w = 0 krivku stredný riadiaci bod neovplyvňuje (je z nej úsečka), váhe w = 1 zodpovedá prípad neracionálnej krivky. So zvyšujúcou váhou sa krivka k riadiacemu bodu stále viac primkýna. Pri w = \infty krivka bodom prechádza a dochádza tak k strate spojitosti. Podmienka nezápornosti váh zaručuje umiestnenie krivky v konvexnej obálke. Podobne ako u Bézierových kriviek a Bernsteinových polynómov majú aj NURBS polynómy analogické vlastnosti ako nezápornosť či to, že výsledná krivka bude ležať v konvexnej obálke bodov riadiaceho polynómu. Rekurentná definícia vychádza z lineárnej kombinácie dvoch polynómov nižších stupňov. Tento rekurentný vzťah je základom //Cox-deBoorovho// algoritmu na výpočet bodov NURBS krivky, ktorý je zovšeobecnením algoritmu deCasteljau pre spline krivky s neuniformnou parametrizáciou. Základom kriviek NURBS je to, že umožňujú presne definovať kuželosečky a to za pomoci spomínaných váhových koeficientov. Medzi vlastnosti kriviek ďalej patrí invariancia voči transformáciam a voči rovnobežnému stredovému premietaniu. ===== Spojitosť ===== {{ :mgr-szz:in-gra:gra5-spoj1.jpg?300|Ilustrácia parametrickej spojitosti}} Predpokladajme, že Q_{1}(t) a Q_{2}(t) su dve časti (//segmenty//) jedinej krivky Q(t) spojenej v bode Q_{1}(t) = Q_{2}(t) nazývanom //uzol// (//knot//). //Spojitosť// (//continuity//) je možné zjednodušene označiť ako spôsob napojenia týchto dvoch segmentov v uzle. Hovoríme, že Q(t) je triedy C^{n}, ak má vo všetkých bodoch spojité derivácie podľa parametru t do rádu n. Označenie C^{n} sa nazýva //**parametrická spojitosť stupňa n**//. * C^{0} -- dva segmenty sú //spojito// naviazané, ak je koncový bod prvého segmentu počiatočným bodom segmentu druhého * C^{1} -- ak dotykový (tečný) vektor v koncovom bode prvého segmentu je rovný dotykovému vektoru druhého segmentu v jeho počiatočnom bode * C^{2} -- analogicky je požadovaná rovnosť vektoru prvej a druhej derivácie Čím vyššia je spojitosť, tím dlhšiu "dobu" (v zmysle parametru t) oba segmenty akoby sledujú rovnaký smer. Zjavne platí vzťah C^{n+1} \Rightarrow C^{n}, teda napr. ak je krivka spojitá C^{2}, tak je spojitá aj C^{1}. Bod sa pohybuje po spojitej dráhe a v bode C^{0} môže skokom meniť smer pohybu, rýchlosť i zrýchlenie. V bode C^{1} nemôže skokom zmeniť smer pohybu a veľkosť rýchlosti, v bode C^{2} sa nemôže zmeniť ani zrýchlenie. {{ :mgr-szz:in-gra:gra5-spoj2.jpg?300|Porovnanie geometrickej a parametrickej spojitosti}} Hladkosť naviazania môžeme posudzovať tiež podľa tzv. //**geometrickej spojitosti stupňa n**// označovanej G^{n}. Najčastejšie sa používajú spojitosti G^{0} a G^{1}. * G^{0} -- ak je koncový bod prvého segmentu totožný s počiatočným bodom druhého segmentu (osobne si myslím, že môžeme tvrdiť, niečo v zmysle G^{0} = C^{0}) * G^{1} -- ak sú G^{0} spojité a súčasne sú dotykové vektory segmentov súhlasne kolineárne, teda platí \vec{q'_{1}}(1) = k.\vec{q'_{2}}(0); k > 0 Táto spojitosť nezaručuje totožnosť dotykových vektorov (tečných vektorů), ale len dotyčníc (tečen). Jednoducho vektory majú zhodný smer, nie však veľkosť. V bode G^{1} sa nemení skokom smer pohybu, môže sa ale zmeniť jeho rýchlosť (krivka je vizuálne hladká). Spojitosť G^{1} je "skoro rovnaká" ako C^{1}, ale zaručiť spojitosť G^{1} je oveľa jednoduchšie ako C^{1}. Môžme povedať, že C^{1} \Rightarrow G^{1}, ale výnimku tvorí prípad, kedy vektor rýchlosti v mieste spojenia dvoch segmentov je (0,0,0). Opačná implikácia neplatí, pretože geometrická spojitosť nepostihuje rýchlosť a zrýchlenie pohybu. (Rozpisovaním presných rovníc jednotlivých derivácií vás tu nechcem zaťažovať. Nie je v nich nič, čo by sa nedalo takto elegantne slove popísať. V prípade záujmu viď slajdy PB009 uvedené v použitých zdrojoch.) {{:mgr-szz:in-gra:gra5-spoj3.jpg?250 |Príklady spojitosti kriviek}} (Tento obrázok ze zo slajdov predmetu PB009. Myslím si ale, že tretí príklad je chybne. Možno sa tým chcelo ukázať, že vektory majú rovnakú veľkosť, rozhodne ale nemajú rovnaký smer, takže parametrická spojitosť prvého stupňa tam byť nemôže. Keď tak ma, prosím, opravte. ;-)) ====== Použité zdroje ====== ŽÁRA, Jiří., BENEŠ, Bedřich., SOCHOR, Jiří., FELKEL, Petr. //Moderní počítačová grafika//. Brno, CZ: Computer Press, 2004. 612 s. ISBN 80-251-0454-0. SOCHOR, Jiří. Študijné materiály k predmetu "PB009 Základy počítačové grafiky". //Křivky v počítačové grafice// [online]. Brno, CZ: Masarykova univerzita, 2013.