Maticové znázornění transformací
Matice m×n je sada čísel uspořádaných v řádcích m a n sloupcích. Následující obrázek ukazuje několik matic.
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.
Matici m×n lze vynásobit maticí n×p a výsledkem je matice m×p. Počet sloupců v první matici musí být stejný jako počet řádků v druhé matici. Například matici 4×2 lze vynásobit maticí 2×3 a vytvořit matici 4×3.
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 ve 3. řádku a ve 2. sloupci. 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.
Pokud bod v rovině považujete za 1×2 matici, můžete ho transformovat tak, že ho vynásobíte 2×2 maticí. Následující obrázek znázorňuje několik transformací použitých v bodě (2, 1).
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í maticí 2×2. 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 pomocí násobení matice následované sčítáním matice.
Lineární transformace (násobení maticí 2×2) následovaná překladem (sčítání 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 v matici 3×3. Aby to fungovalo, musí být bod v rovině uložen v matici 1×3 s fiktivním třetí souřadnicí. 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 transformaci affinu (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í.
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í část matice 2×2 představuje lineární část transformace a první dvě položky v prvním řádku představují překlad.
V GDI+ můžete uložit afinovou transformaci v objektu Matrix . Vzhledem k tomu, že třetí sloupec matice představující affinovou transformaci je vždy (0, 0, 1), zadáte při vytváření objektu Matrix pouze šest čísel v prvních dvou sloupcích. Matrix myMatrix = new Matrix(0, 1, -1, 0, 3, 4)
Příkaz 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:
Matrice | Transformace |
---|---|
Matice A | Otočení o 90 stupňů |
Matice B | Měřítko podle faktoru 2 ve směru x |
Matice C | Přeložit 3 jednotky ve směru y |
Pokud začneme bodem (2, 1) – vyjádřeným maticí [2 1 1] a vynásobíme 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.
Skutečnost, že matici složené transformace lze vytvořit vynásobením jednotlivých transformačních matic znamená, že jakákoli posloupnost transformací affinu může být uložena v jednom Matrix objektu.
Upozornění
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 Matrix poskytuje několik metod pro vytvoření složené transformace: Multiply, Rotate, RotateAt, Scale, , Sheara 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 = new Matrix();
myMatrix.Rotate(30);
myMatrix.Scale(1, 2, MatrixOrder.Append);
myMatrix.Translate(5, 0, MatrixOrder.Append);
Dim myMatrix As New Matrix()
myMatrix.Rotate(30)
myMatrix.Scale(1, 2, MatrixOrder.Append)
myMatrix.Translate(5, 0, MatrixOrder.Append)
Následující obrázek znázorňuje matici.
Viz také
.NET Desktop feedback