Pergunta

Quero fazer alguns desenhos 2D e, portanto, implementar algumas transformações de matriz.Com minha leve formação em matemática, estou tentando entender como fazer isso em C # (qualquer outra linguagem oop faria isso, obviamente).

Tudo o que li é explicando que precisamos trabalhar com matrizes 3x3 para podermos lidar com as traduções.Porque você não pode fazer tradução com multiplicações.Mas é com multiplicações das matrizes que criamos as nossas transformações.Então trabalhamos com algo como:

{ x1, x2, tx }
{ y1, y2, ty }
{ 0,  0,  1  }

Entendo a média da terceira coluna, mas por que precisamos da terceira linha?Tanto numa matriz identidade como numa rotação, escala ou rotação a última linha é a mesma.Existem operações que ainda não alcancei e que precisarão delas?É porque algumas linguagens (Java) têm melhor desempenho com matrizes de "dimensões quadradas"?Nesse caso, posso usar 3 colunas e 2 linhas em C# (já que matrizes irregulares funcionam tão bem ou melhor).

Por exemplo, para uma rotação + translação eu tenho uma matriz como esta

{ cos(rot)*x1, (-sin(rot))*x2, tx }
{ sin(rot)*y1, cos(rot)*y2,    ty }
{ 0,           0,              1  }

Não há necessidade da última linha.

Foi útil?

Solução

é com multiplicações das matrizes que criamos nossas transformações

Esse é por isso que queremos matrizes quadradas.

Suponha que fizemos o que você propõe e usamos matrizes 2x3 para nossas transformações.

Então uma rotação seria

( x1, x2, 0 )
( y1, y2, 0 )

e uma tradução seria

( 1, 0, tx )
( 0, 1, ty )

e poderíamos realizar rotações ou translações multiplicando nossa matriz por um vetor coluna representando o ponto:

    ( x )
M   ( y )
    ( 0 )

para obter respostas corretas.

No entanto - como faríamos composição transformações?Na verdade, para o seu exemplo "para uma rotação + translação, tenho uma matriz como esta", como você chegar ao essa matriz?Claro, neste caso você pode simplesmente escrever, mas em geral?Bem, você sabe a resposta:

é com multiplicações das matrizes que criamos nossas transformações

Então deve ser possível multiplique duas matrizes de transformação para obter outra matriz de transformação.E as regras de multiplicação de matrizes mostram que isto:

( . . . ) ( . . . )
( . . . ) ( . . . ) = ???

não é uma multiplicação de matriz válida.Precisamos de matrizes que possam ser multiplicadas para que nossas transformações possam ser compostas.Então temos aquela linha extra.


Agora, a maneira como expressei isso aqui é, na verdade, completamente invertida em relação à apresentação matemática padrão, na qual as transformações familiares de rotação e translação são apenas casos especiais do poder total das transformações de coordenadas homogêneas no plano projetivo - mas acho que servirá para mostrar por que precisamos daquela linha extra - para tornar a matriz quadrada e, portanto, capaz de ser multiplicada por matrizes semelhantes.

Outras dicas

A resposta é Coordenadas Homogêneas.Para combinar rotação e translação em uma operação é necessária uma dimensão extra do que o modelo requer.Para coisas planas são 3 componentes e para coisas espaciais são 4 componentes.Os operadores pegam 3 componentes e retornam 3 componentes que requerem matrizes 3x3.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top