Sdílet prostřednictvím


Maticové znázornění transformací

Matice m×n je sada čísel uspořádaných do m řádků a n sloupců. Následující obrázek ukazuje několik matic.

obrázek znázorňující šest matic různých dimenzí

Přidáním jednotlivých prvků můžete přidat dvě matice stejné velikosti. Následující obrázek ukazuje dva příklady sčítání matice.

obrázek znázorňující, jak provádět sčítání matic

Matici m×n lze vynásobit n×p matici a výsledkem je matice m×p. Počet sloupců v první matici musí být stejný jako počet řádků v druhé matici. Matici 4 ×2 lze například vynásobit 2 maticí ×3 a vytvořit 4 ×3 matici.

Body v rovině a řádcích a sloupcích matice lze považovat za vektory. Například (2, 5) je vektor se dvěma složkami a (3, 7, 1) je vektor se třemi komponentami. Tečkovaný součin dvou vektorů je definován takto:

(a, b) • (c, d) = ac + bd

(a, b, c) • (d, e, f) = ad + be + cf

Například tečkovaný součin (2, 3) a (5, 4) je (2)(5) + (3)(4) = 22. Tečkovaný součin (2, 5, 1) a (4, 3, 1) je (2)(4) + (5)(3) + (1)(1) = 24. Všimněte si, že tečkovaný součin dvou vektorů je číslo, nikoli jiný vektor. Všimněte si také, že tečkovaný součin můžete vypočítat pouze v případě, že dva vektory mají stejný počet součástí.

Let A(i, j) být položka v matici A v ith řádku a jth sloupec. Například A(3; 2) je položka v matici A v 3rd řádku a 2nd sloupec. Předpokládejme, že A, B a C jsou matice a AB = C. Položky jazyka C se počítají takto:

C(i, j) = (řádek i z A) • (sloupec j z B)

Následující obrázek ukazuje několik příkladů násobení matice.

obrázek znázorňující, jak provádět násobení matic

Pokud bod v rovině považujete za 1 × 2 matici, můžete tento bod transformovat vynásobením 2 × 2 matice. Následující obrázek znázorňuje několik transformací použitých v bodě (2, 1).

obrázek znázorňující použití násobení matice ke škálování, otočení nebo znázornění bodu v rovině

Všechny transformace zobrazené na předchozím obrázku jsou lineární transformace. Některé další transformace, například překlad, nejsou lineární a nelze je vyjádřit jako násobení 2 × 2 maticí. Předpokládejme, že chcete začít bodem (2, 1), otočit 90 stupňů, přeložit 3 jednotky ve směru x a přeložit 4 jednotky ve směru y. Toho můžete dosáhnout provedením násobení matice a následným sčítáním matice.

ilustrace znázorňující, jak násobení a sčítání matice může otočit bod a přeložit ho dvakrát

Lineární transformace (násobení 2 × 2 matice) následovaná překladem (sčítáním matice 1 × 2) se nazývá affinová transformace. Alternativou k uložení affinové transformace do dvojice matic (jedna pro lineární část a druhý pro překlad) je uložení celé transformace do 3 × 3 matice. Aby to fungovalo, musí být bod v rovině uložen v matici 1 × 3 s fiktivním souřadnicemi. Obvyklou technikou je, aby se všechny třetí souřadnice rovna 1. Například bod (2, 1) je reprezentován maticí [2 1 1]. Následující obrázek znázorňuje afinovou transformaci (otočit o 90 stupňů; přeložit 3 jednotky ve směru x, 4 jednotky ve směru y) vyjádřené jako násobení jednou 3 × 3 maticí.

ilustraci znázorňující, jak může násobení matice provádět

V předchozím příkladu se bod (2, 1) mapuje na bod (2, 6). Všimněte si, že třetí sloupec matice 3 × 3 obsahuje čísla 0, 0, 1. To bude vždy případ pro 3 × 3 matici affinové transformace. Důležitá čísla jsou šest čísel ve sloupcích 1 a 2. Levý horní 2 × 2 část matice představuje lineární část transformace a první dvě položky v 3. řádku představují překlad.

ilustrace znázorňující, že první dva sloupce jsou nejvýznamnější pro matici 3x3

Ve Windows GDI+ můžete uložit afinovou transformaci do objektu Matice. Protože třetí sloupec matice, která představuje affin transformace je vždy (0, 0, 1), zadáte pouze šest čísel v prvních dvou sloupcích při vytvoření Matice objektu. Příkaz Matrix myMatrix(0.0f, 1.0f, -1.0f, 0.0f, 3.0f, 4.0f); vytvoří matici zobrazenou na předchozím obrázku.

Složené transformace

Složená transformace je posloupnost transformací, za kterou následuje druhá. Podívejte se na matice a transformace v následujícím seznamu:

  • Matice A Otočit o 90 stupňů
  • Matice B – měřítko podle faktoru 2 ve směru x
  • Matrix C Translate 3 units in the y direction

Pokud začnete bodem (2, 1) – reprezentovanou maticí [2 1 1] a vynásobíte písmenem A, pak B, pak C, bod (2,1) projde třemi transformacemi v uvedeném pořadí.

[2 1 1]ABC = [ –2 5 1]

Místo uložení tří částí složené transformace do tří samostatných matic můžete vynásobit A, B a C dohromady a získat jednu 3 × 3 matici, která ukládá celou složenou transformaci. Předpokládejme, že ABC = D. Potom bod vynásobený písmenem D vrátí stejný výsledek jako bod vynásobený A, pak B a potom C.

[2 1 1]D = [ –2 5 1]

Následující obrázek znázorňuje matice A, B, C a D.

obrázek znázorňující, jak provést více transformací vynásobením základních matic

Skutečnost, že matici složené transformace lze vytvořit vynásobením jednotlivých transformačních matic znamená, že jakákoli posloupnost affinových transformací může být uložena v jednom matici objektu.

Poznámka

Pořadí složené transformace je důležité. Obecně platí, že otočit, pak škálovat, pak přeložit není totéž jako měřítko, pak otočit a pak přeložit. Podobně je důležité pořadí násobení matice. Obecně platí, že ABC není totéž jako BAC.

 

Třída Matice poskytuje několik metod pro vytvoření složené transformace: Matice::Násobit, Matice::Otočit, Matice::RotateAt, Matice::Měřítko, Matice ::Sheara Matice::Translate. Následující příklad vytvoří matici složené transformace, která nejprve otočí 30 stupňů, pak se škáluje podle faktoru 2 ve směru y a pak přeloží 5 jednotek ve směru x.

Matrix myMatrix;
myMatrix.Rotate(30.0f);
myMatrix.Scale(1.0f, 2.0f, MatrixOrderAppend);
myMatrix.Translate(5.0f, 0.0f, MatrixOrderAppend);

Následující obrázek znázorňuje matici.

ilustrace znázorňující matici s hodnotami vyjádřenými jako trigonometrické funkce a matici s přibližnými hodnotami těchto funkcí