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 mostrando seis matrizes de dimensões variadas

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 que mostra como executar a adição de matriz

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 ith row e a jth 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 que mostra como realizar a multiplicação matricial

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

ilustração que mostra como usar a multiplicação de matriz para escalar, girar ou refletir 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 de 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 executando uma multiplicação de matriz seguida por uma adição de matriz.

ilustração que mostra como a multiplicação e a adição de matrizes podem girar um ponto e traduzi-lo duas vezes

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 de 1 × 3 com uma 3ª coordenada fictícia. A técnica usual é fazer todas as 3ª 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 que mostra como a multiplicação matricial pode realizar 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. Este será sempre 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 superior esquerda de 2 × 2 da matriz representa a parte linear da transformação, e as duas primeiras entradas na 3ª linha representam a tradução.

ilustração mostrando que as duas primeiras colunas são mais significativas para uma matriz 3x3 de uma transformação afim

No Windows GDI+, você pode armazenar uma transformação afim em um objetoMatrix. 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(0.0f, 1.0f, -1.0f, 0.0f, 3.0f, 4.0f); 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 A Rodar 90 graus
  • Escala da matriz B por um fator de 2 na direção x
  • Matriz C Traduzir 3 unidades na direção y

Se você começar com o ponto (2, 1) — representado pela matriz [2 1 1] — e multiplicar por A, então B, então 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 mostrando como realizar múltiplas transformações multiplicando as matrizes constituintes

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 uma única matriz objeto.

Observação

A ordem de uma transformação composta é importante. Em geral, girar, depois escalar, depois traduzir não é o mesmo que escalar, depois girar, 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: Matrix::Multiply, Matrix::Rotate, Matrix::RotateAt, Matrix::Scale, Matrix::Sheare Matrix::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;
myMatrix.Rotate(30.0f);
myMatrix.Scale(1.0f, 2.0f, MatrixOrderAppend);
myMatrix.Translate(5.0f, 0.0f, MatrixOrderAppend);

A ilustração a seguir mostra a matriz.

ilustração que mostra uma matriz com valores expressos como funções trigonométricas e uma matriz com valores aproximados dessas funções