Udostępnij za pośrednictwem


Macierzowe przedstawienie transformacji

Macierz m×n to zestaw liczb rozmieszczonych w wierszach m i n kolumnach. Poniższa ilustracja przedstawia kilka macierzy.

Illustration of matrices.

Można dodać dwie macierze o tym samym rozmiarze, dodając poszczególne elementy. Na poniższej ilustracji przedstawiono dwa przykłady dodawania macierzy.

Illustration of matrix addition.

Macierz m×n może być mnożona przez macierz n×p, a wynik jest macierzą m×p. Liczba kolumn w pierwszej macierzy musi być taka sama jak liczba wierszy w drugiej macierzy. Na przykład macierz 4×2 można pomnożyć przez macierz 2×3 w celu utworzenia macierzy 4×3.

Punkty w płaszczyźnie i wierszach i kolumnach macierzy można traktować jako wektory. Na przykład (2, 5) jest wektorem z dwoma składnikami, a (3, 7, 1) jest wektorem z trzema składnikami. Kropka dwóch wektorów jest definiowana w następujący sposób:

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

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

Na przykład kropka (2, 3) i (5, 4) to (2)(5) + (3)(4) = 22. Kropka produktu (2, 5, 1) i (4, 3, 1) to (2)(4) + (5)(3) + (1)(1) = 24. Należy pamiętać, że kropka dwóch wektorów jest liczbą, a nie innym wektorem. Należy również pamiętać, że można obliczyć produkt kropkowy tylko wtedy, gdy dwa wektory mają taką samą liczbę składników.

Let A(i, j) być wpisem w macierzy A w wierszu i jth kolumny. Na przykład A(3, 2) jest wpisem w macierzy A w trzecim wierszu i drugiej kolumnie. Załóżmy, że macierze A, B i C są macierzami, a AB = C. Wpisy języka C są obliczane w następujący sposób:

C(i, j) = (wiersz i z A) • (kolumna j b)

Na poniższej ilustracji przedstawiono kilka przykładów mnożenia macierzy.

Illustration of matrix multiplication.

Jeśli myślisz o punkcie w płaszczyźnie jako macierzy 1×2, możesz przekształcić ten punkt, mnożąc go przez macierz 2×2. Na poniższej ilustracji przedstawiono kilka przekształceń zastosowanych do punktu (2, 1).

Matrix transformation to a point in a plane.

Wszystkie przekształcenia pokazane na powyższej ilustracji to przekształcenia liniowe. Niektóre inne przekształcenia, takie jak tłumaczenie, nie są liniowe i nie mogą być wyrażone jako mnożenie przez macierz 2×2. Załóżmy, że chcesz zacząć od punktu (2, 1), obróć go o 90 stopni, przetłumacz 3 jednostki w kierunku x i przetłumacz go na 4 jednostki w kierunku y. Można to zrobić przy użyciu mnożenia macierzy, po którym następuje dodanie macierzy.

Illustration of matrix multiplication followed by a matrix addition.

Transformacja liniowa (mnożenie przez macierz 2×2), po której następuje tłumaczenie (dodanie macierzy 1×2) jest nazywane przekształceniem affine. Alternatywą do przechowywania przekształcenia affine w parze macierzy (jednej dla części liniowej i jednej translacji) jest przechowywanie całej transformacji w macierzy 3×3. Aby wykonać tę pracę, punkt w płaszczyźnie musi być przechowywany w macierzy 1×3 z fikcyjną współrzędną 3. Zwykłą techniką jest uczynienie wszystkich współrzędnych 3 równych 1. Na przykład punkt (2, 1) jest reprezentowany przez macierz [2 1 1]. Na poniższej ilustracji przedstawiono przekształcenie affine (obróć 90 stopni; przetłumacz 3 jednostki w kierunku x, 4 jednostki w kierunku y) wyrażone jako mnożenie przez pojedynczą macierz 3×3.

Illustration of an affine transformation.

W poprzednim przykładzie punkt (2, 1) jest mapowany na punkt (2, 6). Należy pamiętać, że trzecia kolumna macierzy 3×3 zawiera liczby 0, 0, 1. Zawsze tak będzie w przypadku macierzy 3×3 przekształcenia affine. Ważne liczby to sześć liczb w kolumnach 1 i 2. Lewa górna część 2×2 macierzy reprezentuje liniową część przekształcenia, a pierwsze dwa wpisy w trzecim wierszu reprezentują tłumaczenie.

Illustration of linear and translation part of a matrix transformation.

W GDI+ można przechowywać przekształcenie affine w Matrix obiekcie. Ponieważ trzecia kolumna macierzy reprezentująca przekształcenie affine jest zawsze (0, 0, 1), podczas konstruowania Matrix obiektu należy określić tylko sześć liczb w pierwszych dwóch kolumnach. Matrix myMatrix = new Matrix(0, 1, -1, 0, 3, 4) Instrukcja konstruuje macierz pokazaną na powyższym rysunku.

Przekształcenia złożone

Transformacja złożona to sekwencja przekształceń, po której następuje druga. Rozważ macierze i przekształcenia na poniższej liście:

Matryca Przekształcenie
Macierz A Obracanie 90 stopni
Macierz B Skalowanie według współczynnika 2 w kierunku x
Macierz C Przetłumacz 3 jednostki w kierunku y

Jeśli zaczniemy od punktu (2, 1) — reprezentowanego przez macierz [2 1 1] — i pomnożymy przez A, a następnie B, następnie C, punkt (2, 1) przejdzie trzy przekształcenia w podanej kolejności.

[2 1 1] ABC = [-2 5 1]

Zamiast przechowywać trzy części transformacji złożonej w trzech oddzielnych macierzach, można pomnożyć A, B i C razem, aby uzyskać pojedynczą macierz 3×3, która przechowuje całą transformację złożoną. Załóżmy, że ABC = D. Następnie punkt pomnożony przez D daje taki sam wynik jak punkt pomnożony przez A, a następnie B, a następnie C.

[2 1 1] D = [-2 5 1]

Poniższa ilustracja przedstawia macierze A, B, C i D.

Illustration of matrix A, B, C, and D.

Fakt, że macierz przekształcenia złożonego można utworzyć przez pomnożenie poszczególnych macierzy transformacji oznacza, że każda sekwencja przekształceń affine może być przechowywana w jednym Matrix obiekcie.

Uwaga

Kolejność transformacji złożonej jest ważna. Ogólnie rzecz biorąc, obróć, a następnie skaluj, a następnie przetłumacz nie jest taka sama jak skala, a następnie obróć, a następnie przetłumacz. Podobnie kolejność mnożenia macierzy jest ważna. Ogólnie rzecz biorąc, ABC nie jest taki sam jak BAC.

Klasa Matrix udostępnia kilka metod tworzenia transformacji złożonej: Multiply, , Rotate, RotateAtScale, Shear, i Translate. Poniższy przykład tworzy macierz transformacji złożonej, która najpierw obraca 30 stopni, a następnie skaluje według współczynnika 2 w kierunku y, a następnie tłumaczy 5 jednostek w kierunku 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)

Poniższa ilustracja przedstawia macierz.

Matrix illustration of a composite transformation.

Zobacz też