Rappresentazione tramite matrici delle trasformazioni

Una matrice m×n è un set di numeri disposti in m righe e n colonne. La figura seguente mostra diverse matrici.

Illustration of matrices.

È possibile aggiungere due matrici della stessa dimensione aggiungendo singoli elementi. La figura seguente mostra due esempi di addizione di matrici.

Illustration of matrix addition.

Una matrice m×n può essere moltiplicata per una matrice n×p e il risultato è una matrice m×p. Il numero di colonne nella prima matrice deve corrispondere al numero di righe nella seconda matrice. Ad esempio, una matrice 4×2 può essere moltiplicata per una matrice 2×3 per produrre una matrice 4×3.

I punti nel piano e le righe e le colonne di una matrice possono essere considerati come vettori. Ad esempio, (2, 5) è un vettore con due componenti e (3, 7, 1) è un vettore con tre componenti. Il prodotto punto di due vettori è definito come segue:

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

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

Ad esempio, il prodotto punto di (2, 3) e (5, 4) è (2)(5) + (3)(4) = 22. Il prodotto punto di (2, 5, 1) e (4, 3, 1) è (2)(4) + (5)(3) + (1)(1) = 24. Si noti che il prodotto punto di due vettori è un numero, non un altro vettore. Si noti anche che è possibile calcolare il prodotto punto solo se i due vettori hanno lo stesso numero di componenti.

Lasciare che A(i, j) sia la voce nella matrice A nella prima riga e nella colonna jth. Ad esempio, A(3, 2) è la voce nella matrice A nella terza riga e nella seconda colonna. Si supponga che A, B e C siano matrici e AB = C. Le voci di C vengono calcolate come segue:

C(i, j) = (riga i di A) • (colonna j di B)

La figura seguente mostra diversi esempi di moltiplicazione di matrici.

Illustration of matrix multiplication.

Se si pensa a un punto in un piano come matrice 1×2, è possibile trasformarlo moltiplicandolo per una matrice 2×2. La figura seguente mostra diverse trasformazioni applicate al punto (2, 1).

Matrix transformation to a point in a plane.

Tutte le trasformazioni illustrate nella figura precedente sono trasformazioni lineari. Alcune altre trasformazioni, ad esempio la traduzione, non sono lineari e non possono essere espresse come moltiplicazione per una matrice 2×2. Si supponga di voler iniziare con il punto (2, 1), ruotarlo di 90 gradi, convertirlo 3 unità nella direzione x e convertirlo 4 unità nella direzione y. A tale scopo, è possibile usare una moltiplicazione di matrici seguita da un'aggiunta di matrice.

Illustration of matrix multiplication followed by a matrix addition.

Una trasformazione lineare (moltiplicazione per una matrice 2×2) seguita da una conversione (aggiunta di una matrice 1×2) viene chiamata trasformazione affine. Un'alternativa all'archiviazione di una trasformazione affine in una coppia di matrici (una per la parte lineare e una per la traslazione) consiste nell'archiviare l'intera trasformazione in una matrice 3×3. Per fare questo lavoro, un punto nel piano deve essere archiviato in una matrice 1×3 con una coordinata fittizia 3a. La tecnica consueta consiste nel fare in modo che tutte le terze coordinate siano uguali a 1. Ad esempio, il punto (2, 1) è rappresentato dalla matrice [2 1 1]. La figura seguente mostra una trasformazione affine (ruotare 90 gradi; tradurre 3 unità nella direzione x, 4 unità nella direzione y) espresse come moltiplicazione per una singola matrice 3×3.

Illustration of an affine transformation.

Nell'esempio precedente il punto (2, 1) viene mappato al punto (2, 6). Si noti che la terza colonna della matrice 3×3 contiene i numeri 0, 0, 1. Questo sarà sempre il caso per la matrice 3×3 di una trasformazione affine. I numeri importanti sono i sei numeri nelle colonne 1 e 2. La parte superiore sinistra 2×2 della matrice rappresenta la parte lineare della trasformazione e le prime due voci nella terza riga rappresentano la traduzione.

Illustration of linear and translation part of a matrix transformation.

In GDI+ è possibile archiviare una trasformazione affine in un Matrix oggetto . Poiché la terza colonna di una matrice che rappresenta una trasformazione affine è sempre (0, 0, 1), si specificano solo i sei numeri nelle prime due colonne quando si costruisce un Matrix oggetto . L'istruzione Matrix myMatrix = new Matrix(0, 1, -1, 0, 3, 4) costruisce la matrice illustrata nella figura precedente.

Trasformazioni composite

Una trasformazione composita è una sequenza di trasformazioni, una seguita dall'altra. Si considerino le matrici e le trasformazioni nell'elenco seguente:

Con matrice Trasformazione
Matrice A Ruotare 90 gradi
Matrice B Scalare di un fattore pari a 2 nella direzione x
Matrice C Tradurre 3 unità nella direzione y

Se iniziamo con il punto (2, 1), rappresentato dalla matrice [2 1 1] e moltiplicato per A, poi B, C, il punto (2, 1) subirà le tre trasformazioni nell'ordine elencato.

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

Anziché archiviare le tre parti della trasformazione composita in tre matrici separate, è possibile moltiplicare A, B e C insieme per ottenere una singola matrice 3×3 che archivia l'intera trasformazione composita. Si supponga che ABC = D. Quindi un punto moltiplicato per D restituisce lo stesso risultato di un punto moltiplicato per A, quindi B, quindi C.

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

La figura seguente mostra le matrici A, B, C e D.

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

Il fatto che la matrice di una trasformazione composita possa essere formata moltiplicando le singole matrici di trasformazione, significa che qualsiasi sequenza di trasformazioni affine può essere archiviata in un singolo Matrix oggetto.

Attenzione

L'ordine di una trasformazione composita è importante. In generale, ruotare, quindi ridimensionare, quindi tradurre non è uguale alla scala, quindi ruotare, quindi traslare. Analogamente, l'ordine di moltiplicazione della matrice è importante. In generale, ABC non è uguale a BAC.

La Matrix classe fornisce diversi metodi per la compilazione di una trasformazione composita: Multiply, Rotate, RotateAtScale, Shear, e Translate. Nell'esempio seguente viene creata la matrice di una trasformazione composita che ruota prima di 30 gradi, quindi viene ridimensionata di un fattore pari a 2 nella direzione y e quindi vengono convertite 5 unità nella direzione 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)

La figura seguente mostra la matrice.

Matrix illustration of a composite transformation.

Vedi anche