matrix.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:2k
源码类别:

GIS编程

开发平台:

Visual C++

  1. #include "matrix.h"
  2. #include "math.h"
  3. void init_matrix(Matrix *m)
  4. {
  5.     int i,j;
  6.     for (i=0;i<4;i++)
  7. for (j=0;j<4;j++)
  8.     m->index[i][j] = (i==j?1:0);
  9. }
  10. void init_vector(Vector *v)
  11. {
  12.     int i;
  13.     for (i=0;i<3;i++)
  14. v->index[i] = 0;
  15.     v->index[3] = 1;
  16. }
  17. void copy_vector(Vector *v1, Vector *v2)
  18. {
  19.     int i;
  20.     for (i=0;i<4;i++)
  21. v1->index[i] = v2->index[i];
  22. }
  23. void copy_matrix(Matrix *m1, Matrix *m2)
  24. {
  25.     int i,j;
  26.     for (i=0;i<4;i++)
  27. for (j=0;j<4;j++)
  28.     m1->index[i][j] = m2->index[i][j];
  29. }
  30. void multiply_vector_matrix(Matrix *m, Vector *v)
  31. {
  32.     int i,j;
  33.     Vector t;
  34.     for (i=0;i<4;i++)
  35.     {
  36. t.index[i] = 0;
  37. for (j=0;j<4;j++)
  38.     t.index[i] += m->index[i][j] * v->index[j];
  39.     }
  40.     copy_vector(v, &t);
  41. }
  42. void multiply_matrix_vector(Matrix *m, Vector *v)
  43. {
  44.     int i,j;
  45.     Vector t;
  46.     for (i=0;i<4;i++)
  47.     {
  48. t.index[i] = 0;
  49. for (j=0;j<4;j++)
  50.     t.index[i] += m->index[j][i] * v->index[j];
  51.     }
  52.     copy_vector(v, &t);
  53. }
  54. void multiply_matrix(Matrix *m2, Matrix *m1)
  55. {
  56.     int i,j,k;
  57.     Matrix m;
  58.     for (i=0;i<4;i++)
  59.     {
  60. for (j=0;j<4;j++)
  61. {
  62.     m.index[i][j] = 0;
  63.     for (k=0;k<4;k++)
  64. m.index[i][j] += m1->index[i][k]* m2->index[k][j];
  65. }
  66.     }
  67.     copy_matrix(m2, &m);
  68. }
  69. void rotate_x(double angle, Matrix *m)
  70. {
  71.     Matrix r;
  72.     double c = cos(angle), s = sin(angle);
  73.     init_matrix(&r);
  74.     r.index[1][1] = c;
  75.     r.index[1][2] = s;
  76.     r.index[2][1] = -s;
  77.     r.index[2][2] = c;
  78.     multiply_matrix(m, &r);
  79. }
  80. void rotate_y(double angle, Matrix *m)
  81. {
  82.     Matrix r;
  83.     double c = cos(angle), s = sin(angle);
  84.     init_matrix(&r);
  85.     r.index[0][0] = c;
  86.     r.index[0][2] = -s;
  87.     r.index[2][0] = s;
  88.     r.index[2][2] = c;
  89.     multiply_matrix(m, &r);
  90. }
  91. void rotate_z(double angle, Matrix *m)
  92. {
  93.     Matrix r;
  94.     double c = cos(angle), s = sin(angle);
  95.     init_matrix(&r);
  96.     r.index[0][0] = c;
  97.     r.index[0][1] = s;
  98.     r.index[1][0] = -s;
  99.     r.index[1][1] = c;
  100.     multiply_matrix(m, &r);
  101. }
  102. void mcount() {}