#include "matrix.h" #include "math.h" void init_matrix(Matrix *m) { int i,j; for (i=0;i<4;i++) for (j=0;j<4;j++) m->index[i][j] = (i==j?1:0); } void init_vector(Vector *v) { int i; for (i=0;i<3;i++) v->index[i] = 0; v->index[3] = 1; } void copy_vector(Vector *v1, Vector *v2) { int i; for (i=0;i<4;i++) v1->index[i] = v2->index[i]; } void copy_matrix(Matrix *m1, Matrix *m2) { int i,j; for (i=0;i<4;i++) for (j=0;j<4;j++) m1->index[i][j] = m2->index[i][j]; } void multiply_vector_matrix(Matrix *m, Vector *v) { int i,j; Vector t; for (i=0;i<4;i++) { t.index[i] = 0; for (j=0;j<4;j++) t.index[i] += m->index[i][j] * v->index[j]; } copy_vector(v, &t); } void multiply_matrix_vector(Matrix *m, Vector *v) { int i,j; Vector t; for (i=0;i<4;i++) { t.index[i] = 0; for (j=0;j<4;j++) t.index[i] += m->index[j][i] * v->index[j]; } copy_vector(v, &t); } void multiply_matrix(Matrix *m2, Matrix *m1) { int i,j,k; Matrix m; for (i=0;i<4;i++) { for (j=0;j<4;j++) { m.index[i][j] = 0; for (k=0;k<4;k++) m.index[i][j] += m1->index[i][k]* m2->index[k][j]; } } copy_matrix(m2, &m); } void rotate_x(double angle, Matrix *m) { Matrix r; double c = cos(angle), s = sin(angle); init_matrix(&r); r.index[1][1] = c; r.index[1][2] = s; r.index[2][1] = -s; r.index[2][2] = c; multiply_matrix(m, &r); } void rotate_y(double angle, Matrix *m) { Matrix r; double c = cos(angle), s = sin(angle); init_matrix(&r); r.index[0][0] = c; r.index[0][2] = -s; r.index[2][0] = s; r.index[2][2] = c; multiply_matrix(m, &r); } void rotate_z(double angle, Matrix *m) { Matrix r; double c = cos(angle), s = sin(angle); init_matrix(&r); r.index[0][0] = c; r.index[0][1] = s; r.index[1][0] = -s; r.index[1][1] = c; multiply_matrix(m, &r); } void mcount() { }