Post by Kyle Gagner on Nov 27, 2011 0:00:12 GMT -5
Here's my first header file for matrices (intended to be used in 3D applications).
double Vdot(double *A, double *B)
{
int n;
double v=0;
for(n=0;n<3;n++)
{
v+=A[n]*B[n];
}
return v;
}
void Vcross(double *A, double *B, double *C)
{
int n;
for(n=0;n<3;n++)
{
C[n]=(A[(1+n)%3]*B[(2+n)%3])-(A[(2+n)%3]*B[(1+n)%3]);
}
}
void Vadd(double *A, double *B, double *C)
{
int n;
for(n=0;n<3;n++)
{
C[n]=A[n]+B[n];
}
}
void Vsub(double *A, double *B, double *C)
{
int n;
for(n=0;n<3;n++)
{
C[n]=A[n]-B[n];
}
}
void Vscale(double scale, double *A, double *B)
{
int n;
for(n=0;n<3;n++)
{
B[n]=A[n]*scale;
}
}
double Vmag(double *A)
{
int n;
double v;
for(n=0;n<3;n++)
{
v+=pow(A[n],2);
}
return pow(v,.5);
}
void Vunit(double *A, double *B)
{
int n;
for(n=0;n<3;n++)
{
B[n]=A[n];
}
Vscale(1.0/Vmag(B),B,B);
}
void Vtransform(double *matrix, double *A, double *B)
{
int x;
int n;
double v;
double *At;
double *Bt;
At=malloc(4*sizeof(double));
Bt=malloc(4*sizeof(double));
for(n=0;n<3;n++)
{
At[n]=A[n];
}
At[3]=1;
for(x=0;x<4;x++)
{
v=0;
for(n=0;n<4;n++)
{
v+=At[n]*matrix[x+(4*n)];
}
Bt[x]=v;
}
for(n=0;n<3;n++)
{
B[n]=Bt[n]/Bt[3];
}
free(At);
free(Bt);
}
void Vprint(double *A)
{
printf("<%f,%f,%f>\n",A[0],A[1],A[2]);
}
void Vxyz(double x, double y, double z, double *A)
{
A[0]=x;
A[1]=y;
A[2]=z;
}
void Mmultiply(double *A, double *B, double *C)
{
int x;
int y;
int n;
double v;
for(x=0;x<4;x++)
{
for(y=0;y<4;y++)
{
v=0;
for(n=0;n<4;n++)
{
v+=A[n+(4*y)]*B[x+(4*n)];
}
C[x+(4*y)]=v;
}
}
}
void Midentity(double *A)
{
int n;
for(n=0;n<16;n++)
{
A[n]=0;
}
for(n=0;n<4;n++)
{
A[5*n]=1;
}
}
void Mrotx(double angle, double *A)
{
Midentity(A);
A[6]=cos(angle);
A[7]=-sin(angle);
A[10]=sin(angle);
A[11]=cos(angle);
}
void Mroty(double angle, double *A)
{
Midentity(A);
A[0]=cos(angle);
A[2]=-sin(angle);
A[8]=sin(angle);
A[10]=cos(angle);
}
void Mrotz(double angle, double *A)
{
Midentity(A);
A[0]=cos(angle);
A[1]=-sin(angle);
A[4]=sin(angle);
A[5]=cos(angle);
}
void Mtranslate(double *vector, double *A)
{
int n;
Midentity(A);
for(n=0;n<3;n++)
{
A[12+n]=vector[n];
}
}
void Mscale(double *vector, double *A)
{
int n;
Midentity(A);
for(n=0;n<3;n++)
{
A[5*n]=vector[n];
}
}
void Mobject(double *pos, double *look, double *up, double *right, double *A)
{
int n;
Midentity(A);
for(n=0;n<3;n++)
{
A[n]=right[n];
A[n+4]=up[n];
A[n+8]=look[n];
A[n+12]=pos[n];
}
}
void Mcamera(double *pos, double *look, double *up, double *right, double *A)
{
int n;
Midentity(A);
for(n=0;n<3;n++)
{
A[(4*n)]=right[n];
A[(4*n)+1]=up[n];
A[(4*n)+2]=look[n];
}
A[12]=-Vdot(pos,right);
A[13]=-Vdot(pos,up);
A[14]=-Vdot(pos,look);
}
void LUR(double *at, double *above, double *look, double *up, double *right)
{
double *temp;
temp=malloc(6*sizeof(double));
Vunit(at,look);
Vunit(above,temp+3);
Vcross(look,temp+3,right);
Vcross(look,right,temp);
Vscale(-1.0,temp,up);
free(temp);
}