Partilhar via


Representação matricial de transformações

Uma matriz m×n é um conjunto de números dispostos em m linhas e n colunas. A ilustração a seguir mostra várias matrizes.

Ilustração de matrizes.

Você pode adicionar duas matrizes do mesmo tamanho adicionando elementos individuais. A ilustração a seguir mostra dois exemplos de adição de matriz.

Ilustração da adição matricial.

Uma matriz m×n pode ser multiplicada por uma matriz n×p, e o resultado é uma matriz m×p. O número de colunas na primeira matriz deve ser igual ao número de linhas na segunda matriz. Por exemplo, uma matriz 4×2 pode ser multiplicada por uma matriz 2×3 para produzir uma matriz 4×3.

Pontos no plano e linhas e colunas de uma matriz podem ser pensados como vetores. Por exemplo, (2, 5) é um vetor com dois componentes, e (3, 7, 1) é um vetor com três componentes. O produto do ponto de dois vetores é definido da seguinte forma:

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

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

Por exemplo, o produto ponto de (2, 3) e (5, 4) é (2)(5) + (3)(4) = 22. O produto do ponto de (2, 5, 1) e (4, 3, 1) é (2)(4) + (5)(3) + (1)(1) = 24. Note que o produto ponto de dois vetores é um número, não outro vetor. Observe também que você pode calcular o produto ponto somente se os dois vetores tiverem o mesmo número de componentes.

Seja A(i, j) a entrada na matriz A na i-ésima linha e na j-ésima coluna. Por exemplo, A(3, 2) é a entrada na matriz A na 3ª linha e na 2ª coluna. Suponha que A, B e C são matrizes, e AB = C. As entradas de C são calculadas da seguinte forma:

C(i, j) = (linha i de A) • (coluna j de B)

A ilustração a seguir mostra vários exemplos de multiplicação matricial.

Ilustração da multiplicação matricial.

Se você pensar em um ponto em um plano como uma matriz 1×2, você pode transformar esse ponto multiplicando-o por uma matriz 2×2. A ilustração a seguir mostra várias transformações aplicadas ao ponto (2, 1).

Transformação da matriz para um ponto em um plano.

Todas as transformações mostradas na figura anterior são transformações lineares. Certas outras transformações, como a tradução, não são lineares e não podem ser expressas como multiplicação por uma matriz 2×2. Suponha que você queira começar com o ponto (2, 1), girá-lo 90 graus, traduzi-lo 3 unidades na direção x e traduzi-lo 4 unidades na direção y. Você pode fazer isso usando uma multiplicação de matriz seguida por uma adição de matriz.

Ilustração da multiplicação matricial seguida de adição matricial.

Uma transformação linear (multiplicação por uma matriz 2×2) seguida por uma translação (adição de uma matriz 1×2) é chamada de transformação afim. Uma alternativa para armazenar uma transformação afim em um par de matrizes (uma para a parte linear e outra para a tradução) é armazenar toda a transformação em uma matriz 3×3. Para que isso funcione, um ponto no plano deve ser armazenado em uma matriz 1×3 com uma 3ª coordenada fictícia. A técnica usual é fazer todas as terceiras coordenadas iguais a 1. Por exemplo, o ponto (2, 1) é representado pela matriz [2 1 1]. A ilustração a seguir mostra uma transformação afim (girar 90 graus; traduzir 3 unidades na direção x, 4 unidades na direção y) expressa como multiplicação por uma única matriz 3×3.

Ilustração de uma transformação afim.

No exemplo anterior, o ponto (2, 1) é mapeado para o ponto (2, 6). Note que a terceira coluna da matriz 3×3 contém os números 0, 0, 1. Será sempre esse o caso da matriz 3×3 de uma transformação afim. Os números importantes são os seis números das colunas 1 e 2. A parte 2×2 superior esquerda da matriz representa a parte linear da transformação, e as duas primeiras entradas na 3ª linha representam a tradução.

Ilustração de parte linear e translacional de uma transformação matricial.

No GDI+, você pode armazenar uma transformação afim em um objeto Matrix. Como a terceira coluna de uma matriz que representa uma transformação afim é sempre (0, 0, 1), você especifica apenas os seis números nas duas primeiras colunas ao construir um objeto Matrix. A instrução Matrix myMatrix = new Matrix(0, 1, -1, 0, 3, 4) constrói a matriz mostrada na figura anterior.

Transformações compostas

Uma transformação composta é uma sequência de transformações, uma seguida da outra. Considere as matrizes e transformações na lista a seguir:

Matriz Transformação
Matriz A Rodar 90 graus
Matriz B Aumentar a escala por um fator de 2 na direção x
Matriz C Traduzir 3 unidades na direção y

Se começarmos com o ponto (2, 1) — representado pela matriz [2 1 1] — e multiplicarmos por A, então B, depois C, o ponto (2, 1) sofrerá as três transformações na ordem listada.

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

Em vez de armazenar as três partes da transformação composta em três matrizes separadas, você pode multiplicar A, B e C juntas para obter uma única matriz 3×3 que armazena toda a transformação composta. Suponha ABC = D. Em seguida, um ponto multiplicado por D dá o mesmo resultado que um ponto multiplicado por A, depois B, depois C.

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

A ilustração a seguir mostra as matrizes A, B, C e D.

Ilustração das matrizes A, B, C e D.

O fato de que a matriz de uma transformação composta pode ser formada pela multiplicação das matrizes de transformação individuais significa que qualquer sequência de transformações afins pode ser armazenada em um único objeto Matrix.

Atenção

A ordem de uma transformação composta é importante. Regra geral, girar, depois escalar e depois traduzir não é o mesmo que escalar, depois girar e depois traduzir. Da mesma forma, a ordem de multiplicação matricial é importante. Em geral, ABC não é o mesmo que BAC.

A classe Matrix fornece vários métodos para construir uma transformação composta: Multiply, Rotate, RotateAt, Scale, Sheare Translate. O exemplo a seguir cria a matriz de uma transformação composta que primeiro gira 30 graus, depois escala por um fator de 2 na direção y e, em seguida, traduz 5 unidades na direção 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)

A ilustração a seguir mostra a matriz.

Ilustração matricial de uma transformação composta.

Ver também