Apêndice: Transformações de Matriz
Este tópico fornece uma visão geral matemática das transformações de matriz para gráficos 2D. No entanto, você não precisa saber matemática de matriz para usar transformações em Direct2D. Leia este tópico se você estiver interessado em matemática; caso contrário, fique à vontade para ignorar este tópico.
Introdução às Matrizes
Uma matriz é uma matriz retangular de números reais. A ordem da matriz é o número de linhas e colunas. Por exemplo, se a matriz tiver 3 linhas e 2 colunas, a ordem será 3 × 2. As matrizes geralmente são mostradas com os elementos de matriz entre colchetes:
Notação: uma matriz é designada por uma letra maiúscula. Os elementos são designados por letras minúsculas. Subscritos indicam o número de linha e coluna de um elemento. Por exemplo, umij é o elemento na i'th linha e j'th coluna da matriz A.
O diagrama a seguir mostra uma matriz i × j, com os elementos individuais em cada célula da matriz.
Operações de matriz
Esta seção descreve as operações básicas definidas em matrizes.
Adição. A soma A + B de duas matrizes é obtida adicionando os elementos correspondentes de A e B:
- A + B = \[ a*ij* \] + \[ b*ij* \] = \[ a*ij* + b*ij* \]
Multiplicação escalar. Essa operação multiplica uma matriz por um número real. Dado um número real k, o kA do produto escalar é obtido multiplicando cada elemento de A por k.
- kA = k\[ a*ij* \] = \[ k × a*ij* \]
Multiplicação de matriz. Considerando duas matrizes A e B com ordem (m × n) e (n × p), o produto C = A × B é uma matriz com ordem (m × p), definida da seguinte maneira:
ou, de forma equivalente:
- c*ij* = a*i*1 x b1*j* + a*i*2 x b2*j* + ... + a*in* + b*nj*
Ou seja, para calcular cada elemento cij, faça o seguinte:
- Pegue a i'ª linha de A e a coluna j'th de B.
- Multiplique cada par de elementos na linha e coluna: a primeira entrada de linha pela primeira entrada de coluna, a segunda entrada de linha pela segunda entrada de coluna e assim por diante.
- Somar o resultado.
Aqui está um exemplo de multiplicação de uma matriz (2 × 2) por uma matriz (2 × 3).
A multiplicação de matriz não é comutativa. Ou seja, A × B ≠ B × A. Além disso, na definição a seguir, nem todos os pares de matrizes podem ser multiplicados. O número de colunas na matriz à esquerda deve ser igual ao número de linhas na matriz à direita. Caso contrário, o operador × não será definido.
Identificar matriz. Uma matriz de identidade, designada como I, é uma matriz quadrada definida da seguinte maneira:
- I*ij* = 1 se *i* = *j*, ou 0 caso contrário.
Em outras palavras, uma matriz de identidade contém 1 para cada elemento em que o número da linha é igual ao número da coluna e zero para todos os outros elementos. Por exemplo, aqui está a matriz de identidade 3 × 3.
As igualdades a seguir são para qualquer matriz M.
- M x I = M I x M = M
Transformações de Affine
Uma transformação afim é uma operação matemática que mapeia um espaço de coordenadas para outro. Em outras palavras, ele mapeia um conjunto de pontos para outro conjunto de pontos. As transformações de afim têm alguns recursos que as tornam úteis em elementos gráficos de computação.
- Transformações afim preservam a collinearidade. Se três ou mais pontos cairem em uma linha, eles ainda formarão uma linha após a transformação. Linhas retas permanecem retas.
- A composição de duas transformações afim é uma transformação afim.
As transformações de afim para o espaço 2D têm o seguinte formato.
Se você aplicar a definição de multiplicação de matriz fornecida anteriormente, poderá mostrar que o produto de duas transformações de afim é outra transformação afim. Para transformar um ponto 2D usando uma transformação affine, o ponto é representado como uma matriz de 1 × 3.
- P = \| x y 1 \|
Os dois primeiros elementos contêm as coordenadas x e y do ponto. O 1 é colocado no terceiro elemento para que a matemática funcione corretamente. Para aplicar a transformação, multiplique as duas matrizes da seguinte maneira.
- P' = P × M
Isso se expande para o seguinte.
onde
- x' = ax + cy + e y' = bx + dy + f
Para obter o ponto transformado, use os dois primeiros elementos da matriz P'.
- p = (x', y') = (ax + cy + e, bx + dy + f)
Observação
Uma matriz de 1 × n é chamada de vetor de linha. Direct2D e Direct3D usam vetores de linha para representar pontos no espaço 2D ou 3D. Você pode obter um resultado equivalente usando um vetor de coluna (n × 1) e transpondo a matriz de transformação. A maioria dos textos gráficos usa o formulário de vetor de coluna. Este tópico apresenta o formulário de vetor de linha para consistência com Direct2D e Direct3D.
As próximas seções derivam as transformações básicas.
Transformação de Tradução
A matriz de transformação de tradução tem o seguinte formato.
Conectar um ponto P a esta equação gera:
- P' = (*x* + *dx*, *y* + *dy*)
que corresponde ao ponto (x, y) traduzido por dx no eixo X e dy no eixo Y.
Transformação de dimensionamento
A matriz de transformação de dimensionamento tem a seguinte forma.
Conectar um ponto P a esta equação gera:
- P' = (*x* ∙ *dx*, *y* ∙ *dy*)
que corresponde ao ponto (x,y) dimensionado por dx e dy.
Rotação ao redor da origem
A matriz para girar um ponto ao redor da origem tem a seguinte forma.
O ponto transformado é:
- P' = (*x*cosΘ – ysinΘ, *x*sinΘ + *y*cosΘ)
Prova. Para mostrar que P' representa uma rotação, considere o diagrama a seguir.
Considerando:
-
P = (x,y)
-
O ponto original a ser transformado.
-
Φ
-
O ângulo formado pela linha (0,0) a P.
-
Θ
-
O ângulo pelo qual girar (x,y) sobre a origem.
-
P' = (x',y')
-
O ponto transformado.
-
R
-
O comprimento da linha (0,0) a P. Além disso, o raio do círculo de rotação.
Observação
Este diagrama usa o sistema de coordenadas padrão usado na geometria, em que o eixo y positivo aponta para cima. Direct2D usa o sistema de coordenadas do Windows, em que o eixo y positivo aponta para baixo.
O ângulo entre o eixo x e a linha (0,0) para P' é Φ + Θ. As seguintes identidades contêm:
- x = R cosΦ y = R sinΦ x' = R cos(Φ + Θ) y' = R sin(Φ+ Θ)
Agora resolva para x' e y' em termos de Θ. Pelas fórmulas de adição trigonométrica:
- x' = R(cosΦcosΘ – sinΦsinΘ) = RcosΦcosΘ – RsinΦsinΘ y' = R(sinΦcosΘ + cosΦsinΘ) = RsinΦcosΘ + RcosΦsinΘ
Substituindo, obtemos:
- x' = xcosΘ – ysinΘ y' = xsinΘ + ycosΘ
que corresponde ao ponto transformado P' mostrado anteriormente.
Rotação em torno de um ponto arbitrário
Para girar em torno de um ponto (x,y) diferente da origem, a matriz a seguir é usada.
Você pode derivar essa matriz usando o ponto (x,y) para ser a origem.
Let (x1, y1) be the point that results from rotating the point (x0, y0) around the point (x,y). Podemos derivar x1 da seguinte maneira.
- x1 = (x0 – x)cosΘ– (y0 – y)sinΘ + x1 = x0cosΘ – y0sinΘ + \[ (1 – cosΘ) + ysinΘ \]
Agora conecte essa equação de volta à matriz de transformação, usando a fórmula x1 = ax0 + cy0 + e de antes. Use o mesmo procedimento para derivar y1.
Transformação distorção
A transformação de distorção é definida por quatro parâmetros:
- Θ: a quantidade a ser distorcida ao longo do eixo x, medida como um ângulo do eixo y.
- Φ: a quantidade a ser distorcida ao longo do eixo y, medida como um ângulo do eixo x.
- (px, py): as coordenadas x e y do ponto sobre o qual a distorção é executada.
A transformação de distorção usa a matriz a seguir.
O ponto transformado é:
- P' = (*x* + *y*tanΘ – *py*tanΘ, *y* + *x*tanΦ) – *py*tanΦ
ou de forma equivalente:
- P' = (*x* + (*y* – *py*)tanΘ, *y* + (*x* – *px*)tanΦ)
Para ver como essa transformação funciona, considere cada componente individualmente. O parâmetro Θ move cada ponto na direção x em uma quantidade igual a tanΘ. O diagrama a seguir mostra a relação entre Θ e a distorção do eixo x.
Aqui está a mesma distorção aplicada a um retângulo:
O parâmetro Φ tem o mesmo efeito, mas ao longo do eixo y:
O próximo diagrama mostra a distorção do eixo y aplicada a um retângulo.
Por fim, os parâmetros px e py deslocam o ponto central para a distorção ao longo dos eixos x e y.
Representando transformações em Direct2D
Todas as transformações Direct2D são transformações afim. Direct2D não dá suporte a transformações não afim. As transformações são representadas pela estrutura D2D1_MATRIX_3X2_F . Essa estrutura define uma matriz de 3 × 2. Como a terceira coluna de uma transformação afim é sempre a mesma ([0, 0, 1]) e, como Direct2D não dá suporte a transformações não afim, não é necessário especificar a matriz inteira de 3 × 3. Internamente, Direct2D usa três matrizes × 3 para calcular as transformações.
Os membros do D2D1_MATRIX_3X2_F são nomeados de acordo com sua posição de índice: o membro _11 é o elemento (1,1), o membro _12 é o elemento (1,2) e assim por diante. Embora você possa inicializar os membros da estrutura diretamente, é recomendável usar a classe D2D1::Matrix3x2F . Essa classe herda D2D1_MATRIX_3X2_F e fornece métodos auxiliares para criar qualquer uma das transformações básicas de affine. A classe também define operator*() para compor duas ou mais transformações, conforme descrito em Aplicando transformações em Direct2D.
Avançar