Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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 no Direct2D. Leia este tópico se você estiver interessado em matemática; caso contrário, sinta-se à vontade para pular este tópico.
- Introdução às Matrizes
-
Affine transforma
- Transformação de Tradução
- de transformação de dimensionamento
- rotação em torno do de origem
- rotação em torno de um ponto arbitrário
- Skew Transform
- Representando transformações no Direct2D
- Próximo
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 são geralmente mostradas com os elementos da matriz entre parênteses retos:
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 row e j'th column da matriz A.
O diagrama a seguir mostra uma matriz i × j, com os elementos individuais em cada célula da matriz.
Operações matriciais
Esta seção descreve as operações básicas definidas em matrizes.
Adição. A soma A + B de duas matrizes obtém-se adicionando os elementos correspondentes de A e B:
- A + B = \[ a*ij* \] + \[ b*ij* \] = \[ a*ij* + b*ij* \]
Multiplicação escalar. Esta operação multiplica uma matriz por um número real. Dado um número real k, o produto escalar kA obtém-se multiplicando cada elemento de A por k.
- kA = k\[ a*ij* \] = \[ k × a*ij* \]
Multiplicação matricial. Dadas 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 forma:
ou, equivalentemente:
- 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-ésima linha de A e a j'ésima coluna 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 matricial não é comutativa. Ou seja, A × B ≠ B × A. Além disso, da definição decorre que nem todos os pares de matrizes podem ser multiplicados. O número de colunas na matriz da esquerda deve ser igual ao número de linhas da matriz da direita. Caso contrário, o operador × não será definido.
Identificar matriz. Uma matriz de identidade, designada I, é uma matriz quadrada definida da seguinte forma:
- I*ij* = 1 se *i* = *j*, ou 0 de outra forma.
Em outras palavras, uma matriz de identidade contém 1 para cada elemento onde 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 seguintes igualdades são válidas para qualquer matriz M.
- M x I = M I x M = M
Transformações afins
Uma transformada afim é uma operação matemática que mapeia um espaço coordenado para outro. Em outras palavras, ele mapeia um conjunto de pontos para outro conjunto de pontos. As transformações afins têm algumas características que as tornam úteis na computação gráfica.
- As transformações afins preservam colinearidade. Se três ou mais pontos caírem em uma linha, eles ainda formam uma linha após a transformação. As linhas retas permanecem retas.
- A composição de duas transformadas afins é uma transformada afim.
As transformações afins para espaço 2D têm a seguinte forma.
Se você aplicar a definição de multiplicação de matriz dada anteriormente, poderá mostrar que o produto de duas transformações afins é outra transformação afim. Para transformar um ponto 2D usando uma transformação afim, 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 fazer a matemática funcionar corretamente. Para aplicar a transformação, multiplique as duas matrizes da seguinte forma.
- P' = P × M
Isso se expande para o seguinte.
em que
- x' = ax + cy + e y' = bx + dy + f
Para obter o ponto transformado, pegue 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. O Direct2D e o 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 a forma vetorial 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 a seguinte forma.
Ligando um ponto P a esta equação obtém-se:
- 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 escala tem a seguinte forma.
Ligando um ponto P a esta equação obtém-se:
- P' = (*x* ∙ *dx*, *y* ∙ *dy*)
que corresponde ao ponto (x,y) dimensionado por dx e dy.
Rotação em torno da origem
A matriz para girar um ponto em torno da origem tem a seguinte forma.
O ponto transformado é:
- P' = (*x*cosΘ – ysinΘ, *x*sinΘ + *y*cosΘ)
Comprovação. Para mostrar que P' representa uma rotação, considere o diagrama a seguir.
Dado:
-
P = (x,y)
-
O ponto original a transformar.
-
Φ
-
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) até P. Também o raio do círculo de rotação.
Observação
Este diagrama usa o sistema de coordenadas padrão usado na geometria, onde o eixo y positivo aponta para cima. O Direct2D usa o sistema de coordenadas do Windows, onde o eixo y positivo aponta para baixo.
O ângulo entre o eixo x e a linha (0,0) a P' é Φ + Θ. As seguintes identidades mantê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étricas:
- x' = R(cosΦcosΘ – sinΦsinΘ) = RcosΦcosΘ – RsinΦsinΘ y' = R(sinΦcosΘ + cosΦsinΘ) = RsinΦcosΘ + RcosΦsinΘ
Substituindo, temos:
- x' = xcosΘ – ysinΘ y' = xsinΘ + ycosΘ
que corresponde ao ponto transformado P' mostrado anteriormente.
Rotação em torno de um ponto arbitrário
Para rodar em torno de um ponto (x,y) diferente da origem, utiliza-se a seguinte matriz.
Você pode derivar essa matriz tomando o ponto (x,y) como a origem.
Seja (x1, y1) o ponto que resulta da rotação do ponto (x0, y0) em torno do ponto (x,y). Podemos derivar x1 da seguinte forma.
- x1 = (x0 – x)cosΘ– (y0 – y)sinΘ + x x1 = x0cosΘ – y0sinΘ + \[ (1 – cosΘ) + ysinΘ \]
Agora conecte esta 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.
Transformada de inclinação
A transformada de inclinação é definida por quatro parâmetros:
- Θ: Quantidade a inclinar ao longo do eixo x, medida como um ângulo em relação ao eixo y.
- Φ: A quantidade a inclinar ao longo do eixo y, medida como um ângulo a partir do eixo x.
- (px, py): As coordenadas x e y do ponto sobre o qual a inclinação é executada.
A transformação de inclinação usa a seguinte matriz.
O ponto transformado é:
- P' = (*x* + *y*tanΘ – *py*tanΘ, *y* + *x*tanΦ) – *py*tanΦ
ou 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 por uma quantidade igual a tanΘ. O diagrama a seguir mostra a relação entre Θ e a inclinação do eixo x.
Aqui está a mesma inclinação aplicada a um retângulo:
O parâmetro Φ tem o mesmo efeito, mas ao longo do eixo y:
O diagrama seguinte mostra a inclinação do eixo y aplicada a um retângulo.
Finalmente, os parâmetros px e py deslocam o ponto central para a inclinação ao longo dos eixos x e y.
Representando transformações no Direct2D
Todas as transformações Direct2D são transformações afim. O Direct2D não suporta transformações não afim. As transformações são representadas pela estrutura D2D1_MATRIX_3X2_F. Esta estrutura define uma matriz 3 × 2. Como a terceira coluna de uma transformação afim é sempre a mesma ([0, 0, 1]), e como o Direct2D não suporta transformações não afim, não há necessidade de especificar toda a matriz 3 × 3. Internamente, o Direct2D usa 3 × 3 matrizes para calcular as transformações.
Os membros do D2D1_MATRIX_3X2_F são nomeados de acordo com sua posição de índice: o _11 membro é o elemento (1,1), o _12 membro é o elemento (1,2) e assim por diante. Embora você possa inicializar os membros da estrutura diretamente, é recomendável usar a classeD2D1::Matrix3x2F. Essa classe herda D2D1_MATRIX_3X2_F e fornece métodos auxiliares para criar qualquer uma das transformações afins básicas. A classe também define operador *() para compor duas ou mais transformações, conforme descrito em Aplicando transformações no Direct2D.
Seguinte