1

我在玩矩阵,以期在 GDI 中进行 3D 转换(为了好玩)。目前我正在检查我是否从单位矩阵中得到正确的值,给定一个正方形排列的四个顶点的表示。我一直在摸不着头脑,为什么它没有给出预期的输出。我已经完成了研究,但看不到我在这里做错了什么。

这是我对矩阵的定义。

typedef struct m{
    float _m01, _m05, _m09, _m13;
    float _m02, _m06, _m10, _m14;
    float _m03, _m07, _m11, _m15;
    float _m04, _m08, _m12, _m16;
}mat;

struct m matIdentity(struct m *m1){
   m1->_m01 = 1.0; m1->_m05 = 0.0; m1->_m09 = 0.0; m1->_m13 = 0.0;
   m1->_m02 = 0.0; m1->_m06 = 1.0; m1->_m10 = 0.0; m1->_m14 = 0.0;
   m1->_m03 = 0.0; m1->_m07 = 0.0; m1->_m11 = 1.0; m1->_m15 = 0.0;
   m1->_m04 = 0.0; m1->_m08 = 0.0; m1->_m12 = 0.0; m1->_m16 = 1.0;
}

这是使用矩阵

 struct m matrix;
 matIdentity(&matrix);

//represent 4 vertices(x,y,z,w);

float square[4][4] = {
        {0.0, 0.0, 0.0, 1.0},
        {0.0, 20.0, 0.0, 1.0},
        {20.0, 20.0, 0.0, 1.0},
        {20.0, 0.0, 0.0, 1.0}
    };

           float result[4][4];

           int i = 0;
           for(i = 0; i < 4; i++){
           result[i][1] = (matrix._m01 * square[i][0]) + (matrix._m05 * square[i][1]) +    (matrix._m09 * square[i][2]) + (matrix._m13 * square[i][3]);
           result[i][2] = (matrix._m02 * square[i][0]) + (matrix._m06 * square[i][1]) + (matrix._m10 * square[i][2]) + (matrix._m14 * square[i][3]);
           result[i][3] = (matrix._m03 * square[i][0]) + (matrix._m07 * square[i][1]) + (matrix._m11 * square[i][2]) + (matrix._m15 * square[i][3]);
           result[i][4] = (matrix._m04 * square[i][0]) + (matrix._m08 * square[i][1]) + (matrix._m12 * square[i][2]) + (matrix._m16 * square[i][3]);
           }


 char strOutput[500];
           sprintf(strOutput,"%f %f %f %f\n %f %f %f %f\n %f %f %f %f\n %f %f %f %f\n ", 
           result[0][0], result[0][1], result[0][2], result[0][3],
           result[1][0], result[1][1], result[1][2], result[1][3],
           result[2][0], result[2][1], result[2][2], result[2][3],
           result[3][0], result[3][1], result[3][2], result[3][3]
           );

我有一种感觉,这个问题与使用列主矩阵乘以基于行的顶点表示有关。谁能建议我应该怎么做。

4

2 回答 2

2
  1. 我不明白你为什么不先使用数组,然后开始使用数组和迭代,最后放弃迭代。拜托,这样的程序只会造成混乱。
  2. 正确的公式是C(i, j)=sigma(A(i, k)*B(k, j), k=1..n),其中 C=AB 和 n 是 4 对于您的情况。(例如,这一行应该是这样result[i][0] = (matrix._m01 * square[0][i]) + (matrix._m02 * square[1][i]) + (matrix._m03 * square[2][i]) + (matrix._m04 * square[3][i]);的:)编写一个简单的嵌套 for 迭代来计算这个......
  3. 这不是针对一个向量,而是针对 n 个向量....
于 2013-09-26T14:22:53.243 回答
0

这不是矩阵乘法。将向量乘以矩阵如下所示:

float mat[4][4];
float vec_in[4];
float vec_out[4];
// todo: initialize values
for (int j = 0; j < 4; ++j)
{
    vec_out[j] = 0.0f;
    for (int i = 0; i < 4; ++i)
    {
        vec_out[j] += vec_in[i] * mat[i][j];
    }
}
于 2013-09-26T14:39:32.633 回答