Estou me ensinando matemática 3D e, no processo, construindo meu próprio mecanismo rudimentar (das sortes). Eu queria saber qual seria a melhor maneira de estruturar minha classe de matriz C ++. Existem algumas opções:
Variáveis de membro separadas:
struct Mat4 { float m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44; // methods }
Uma matriz multidimensional:
struct Mat4 { float[4][4] m; // methods }
Uma matriz de vetores
struct Mat4 { Vec4[4] m; // methods }
Eu estou supondo que haveria pontos positivos e negativos para cada um.
Do 3D Math Primer para desenvolvimento de gráficos e jogos, 2ª edição, p.155:
As matrizes usam índices com base em 1; portanto, a primeira linha e a coluna são numeradas 1. Por exemplo,
a12
(leia “a
um dois”, não “a
doze”) é o elemento na primeira linha, segunda coluna. Observe que isso é diferente das linguagens de programação como C ++ e Java, que usam índices de matriz baseados em 0. Uma matriz não possui uma coluna 0 ou linha 0. Essa diferença na indexação pode causar alguma confusão se as matrizes forem armazenadas usando um tipo de dados de matriz real. Por esse motivo, é comum que as classes que armazenam matrizes pequenas e de tamanho fixo do tipo usado para fins geométricos forneçam a cada elemento sua própria variável de membro nomeada, comofloat a11
, em vez de usar o suporte de matriz nativa da linguagem com algo como floatelem[3][3]
.
Então esse é um voto para o método um.
Essa é realmente a maneira aceita de fazer as coisas? Parece bastante complicado se o único benefício seria manter a notação matemática convencional.
Respostas:
Por que escolher? Você pode ter os dois. (Sem nenhuma complexidade adicional à lógica e sem nenhum requisito adicional de memória graças às uniões.)
fonte