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> </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>
</center>
Toto ale snáď zvládne každý. Teraz sa ale pozrieme na to, ako ho zobraziť
takhle:
<center>
</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> </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>
</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> </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> </center> a jednotlivé čiastkové matice sú:
<center> </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ý".