Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

Transformácie súradníc v rovine pomocou transformačných matíc

Klasický problém: ako na obrazovke zobraziť nejaký objekt, ktorý je určený súborom karteziánskych súradníc (x, y), otočený o nejaký všeobecný uhol?

Dajme tomu, že náš objekt vyzerá napríklad takto:

<center>lokálny súradný systém objektu - Grafické algoritmy </center> Osi x L ay L tvorí lokálny súradný systém - tvar objektu je vyjadrený súradnicami meranými v tomto systéme.

Obrazovka tvorí globálny súradnicový systém. Keď niečo zobrazujeme, používame tieto súradnice. Našou hlavnou starosťou teda je vypočítať globálne súradnice každého bodu objektu. V praxi to vyzerá tak, že vezmeme lokálne súradnice každého bodu príslušného objektu, urobíme s nimi pár trikov zahrňujúcich súradnice objektu na obrazovke a pod. A vyjdú nám zobraziteľné globálne hodnoty.

Zobrazenie objektu bez otáčania je jednoduché. Pre každý bod na objekte:

<center> X G = X L + X O
Y G = Y L + Y O </center>

kde hodnoty s indexom G sú hľadané globálne súradnice, index L znamená lokálne súradnice jednotlivých bodov objektu meranej od začiatku jeho lokálneho súradnicového systému a indexom O je označená poloha objektu na obrazovke, čiže poloha počiatku súradnicového systému L pevne spojeného s objektom voči globálnemu počiatku.
Zrozumiteľnejšie to je na obrázku:

<center>objekt na všeobecných súradniciach - Grafické algoritmy </center>

Toto ale snáď zvládne každý. Teraz sa ale pozrieme na to, ako ho zobraziť takhle:

<center>objekt na všeobecných súradniciach, všeobecne natočený - Grafické algoritmy </center>

Všimnite si jedného dôležitého detailu: lokálny súradný systém je stále pevne spojený s objektom a natáča sa spolu s ním.

No, a teraz prídu na rad sľúbené transformačnej matice. Pre 2D majú rozmery 3x3 (pre 3D by boli 4x4, ale to teraz preberať nebudeme).
Ako to celé funguje? Začneme v globálnom počiatku súradníc a snažíme sa postupne presunúť do lokálneho začiatku objektu a vhodne sa tam natočiť. To sa urobí pomocou transformačnej matice:

<center>všeobecný transformačné vzorec - Grafické algoritmy </center> kde B G je hľadaný rozšírený vektor globálnych súradníc, B L je známy rozšírený vektor lokálnych súradníc príslušného bodu a T je transformačnej matice. Súčin je maticový (predpokladám, že ho poznáte; ak nie, pokojne sa spýtajte).
Rozšírený vektor sa od obyčajného líši len tým, že okrem zložiek xa y obsahuje ešte tretiu zložku, ktorá je konštantne rovná 1. S týmito vektory zaobchádzame ako s maticami 3x1 (3 riadky, 1 stĺpec), takže nimi môžeme sprava vynásobiť maticu 3x3. Z výsledného vektora B G potom samozrejme zužitkujeme iba prvé dve zložky, jednička nás nezaujíma.

Všeobecná transformačnej matice a rozšírený vektor vyzerajú takto:

<center>transformačnej matice a rozšírený vektor - Grafické algoritmy </center> Položky xay hovoria, o koľko sa tou maticou posúvame, a štyri položky s uhlom hovoria, o aký uhol nás tá matice otočí (okolo osi z). Kladný zmysel otáčania je pre bežné súradnice (s osou y mieriaci kladnú polovicou hore) proti smeru hodinových ručičiek, pre súradnice počítačové (y rastie smerom nadol) v smere hodinových ručičiek.

Začíname teda v globálnom počiatku a potrebujeme sa posunúť o x O, y O a otočiť o uhol α. Tieto hodnoty dosadíme do matice a tým sme sa dostali do lokálneho začiatku spojeného s objektom. Teraz stačí maticu sprava vynásobiť vektorom lokálnych súradníc príslušného bodu na objekte a vyjdú nám jeho globálny súradnice. Ako prosté.
Po rozpisu maticového súčinu nám vyjde toto:

<center>výsledok - Grafické algoritmy </center> To sú vzorce, ktoré potom budeme v programoch prakticky používať - žiadne matice tam naozaj násobiť nebudeme, to by bolo zbytočne veľa počítanie. Ako vidíte, aj keby sme chceli počítať len jednu globálnu súradnicu (napríklad x G), budeme na to rovnako potrebovať obe lokálnej (x L iy L).
A ešte jedna vec: pre všetky body nášho objektu si vystačíme s jednými hodnotami sinα a cosα, takže stačí spočítať si ich raz (pre aktuálny uhol natočenia) a potom už len dosadzovať. Takže žiadne otrocké počítanie sin a cos pre každý bod zvlášť.

Zaujímavou vlastnosťou transformačných matíc je ich skládatelnost. Nemusíme celý posun zvládnuť naraz, niekedy to ani nejde (napríklad keď je potrebné sa posunúť, otočiť a potom znovu posunúť), ale môžeme ho rozložiť do elementárnych krokov - posun v smere x, otočka, teraz kúsok oy hore a iné x doľava, zase otočka ... atď. Zloženie matíc sa vykoná ich prostým maticovým vynásobením, napr .:

<center>skladanie transformačných matíc - Grafické algoritmy </center> a jednotlivé čiastkové matice sú:

<center>čiastkové matice pre x, y a uhol - Grafické algoritmy </center> Toto je len príklad, násobiť môžeme ľubovoľnej kombinácie posunov aj natočenie (nie len takhle x, y, α, ale napríklad y, α, x, x, α, y atď.).

Tento rozklad sa použije, ak máme nejaký zložitejšie kinematický reťazec, napr. Niečí ruku. Počiatok globálnych súradníc si dáme dajme tomu do ramena a chceme nakresliť treba prst. Takže: sme v ramene. Natočíme sa tak, aby os x mierila v smere paže a napíšeme si maticu pre natočenie o tento uhol. Potom sa posunieme v smere xo dĺžku ramennej kosti až k lakťu (posuny sa počítajú vždy v tom smere, kam sme sa práve natočili, nie v smeroch globálnych osí!) A vedľa prvej matice si pripíšeme druhú, pre posun v smere x. Potom sa opäť natočíme o uhol lakťa a pripíšeme ďalšie maticu, potom sa posunieme k zápästiu, natočíme, posunieme sa cez dlaň a natočíme sa tentoraz treba ypsilonovou osou v smere prsta. Na koniec pripíšeme rozšírený vektor, ktorý ukazuje od toho kĺbu, kam sme sa dostali s transformačnou maticou, na koniec prsta (v tomto prípade (0, niečo, 1), pretože na prst ukazujeme yovou osou) a všetky tie matice a vektor postupne maticovo pronásobíme (je dobré začať sprava, pretože je to oveľa menej prácne - vychádzajú nám vektory 3x1 a nie matice 3x3). Výsledkom je rozšírený vektor globálnych súradníc špičky prsta.
Inak keby sme chceli, mohli by sme sa maticami presunúť až na špičku prsta a potom to násobiť vektorom (0, 0, 1), vyšlo by to isté.

No, a to je celé. Záujemcom o hlbšie teórii, 3D, odvodenie týchto matíc a podobné veci odporúčam skriptá Mechanika A (alebo Mechanika 1, názov sa možno zmení || zmenil) pre FS ČVUT, k dostaniu vo skriptárně vo Študentskom dome v Dejviciach ;-) .


PS: Týmto systémom sa dajú pohodlne otáčať aj rastrové obrázky. Len si dajte pozor na jednu vec: nepočítajte pre každý pixel pôvodného obrázku, kam sa otočí a zobrazí do cieľovej oblasti, ale naopak spočítajte pre každý pixel cieľovej oblasti, aký pixel z pôvodného obrázku sa doň zobrazí. To preto, aby potom výsledný obrázok nebol "deravý".


 

Všetky články v sekcii
Grafické algoritmy
Článok pre vás napísal Mircosoft
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor je amatérský pascalista, assemblerista a bastlíř. Profesionálně psal nebo píše v HLASM, Rexxu, Cobolu, ST, LAD, FBD, PHP, SQL, JS, Basicu a pár dalších jazycích, které kupodivu stále existují a používají se :-).
Aktivity