www.pudn.com > View3D.zip > GA_math.cpp
#include "GA_math.h"
void GAMath::Mat3Transp(float mat[][3])
{
float t;
t = mat[0][1] ;
mat[0][1] = mat[1][0] ;
mat[1][0] = t;
t = mat[0][2] ;
mat[0][2] = mat[2][0] ;
mat[2][0] = t;
t = mat[1][2] ;
mat[1][2] = mat[2][1] ;
mat[2][1] = t;
}
void GAMath::Mat4MulMat4(float m1[][4], float m2[][4], float m3[][4])
{
/* matrix product: m1[j][k] = m2[j][i].m3[i][k] */
m1[0][0] = m2[0][0]*m3[0][0] + m2[0][1]*m3[1][0] + m2[0][2]*m3[2][0] + m2[0][3]*m3[3][0];
m1[0][1] = m2[0][0]*m3[0][1] + m2[0][1]*m3[1][1] + m2[0][2]*m3[2][1] + m2[0][3]*m3[3][1];
m1[0][2] = m2[0][0]*m3[0][2] + m2[0][1]*m3[1][2] + m2[0][2]*m3[2][2] + m2[0][3]*m3[3][2];
m1[0][3] = m2[0][0]*m3[0][3] + m2[0][1]*m3[1][3] + m2[0][2]*m3[2][3] + m2[0][3]*m3[3][3];
m1[1][0] = m2[1][0]*m3[0][0] + m2[1][1]*m3[1][0] + m2[1][2]*m3[2][0] + m2[1][3]*m3[3][0];
m1[1][1] = m2[1][0]*m3[0][1] + m2[1][1]*m3[1][1] + m2[1][2]*m3[2][1] + m2[1][3]*m3[3][1];
m1[1][2] = m2[1][0]*m3[0][2] + m2[1][1]*m3[1][2] + m2[1][2]*m3[2][2] + m2[1][3]*m3[3][2];
m1[1][3] = m2[1][0]*m3[0][3] + m2[1][1]*m3[1][3] + m2[1][2]*m3[2][3] + m2[1][3]*m3[3][3];
m1[2][0] = m2[2][0]*m3[0][0] + m2[2][1]*m3[1][0] + m2[2][2]*m3[2][0] + m2[2][3]*m3[3][0];
m1[2][1] = m2[2][0]*m3[0][1] + m2[2][1]*m3[1][1] + m2[2][2]*m3[2][1] + m2[2][3]*m3[3][1];
m1[2][2] = m2[2][0]*m3[0][2] + m2[2][1]*m3[1][2] + m2[2][2]*m3[2][2] + m2[2][3]*m3[3][2];
m1[2][3] = m2[2][0]*m3[0][3] + m2[2][1]*m3[1][3] + m2[2][2]*m3[2][3] + m2[2][3]*m3[3][3];
m1[3][0] = m2[3][0]*m3[0][0] + m2[3][1]*m3[1][0] + m2[3][2]*m3[2][0] + m2[3][3]*m3[3][0];
m1[3][1] = m2[3][0]*m3[0][1] + m2[3][1]*m3[1][1] + m2[3][2]*m3[2][1] + m2[3][3]*m3[3][1];
m1[3][2] = m2[3][0]*m3[0][2] + m2[3][1]*m3[1][2] + m2[3][2]*m3[2][2] + m2[3][3]*m3[3][2];
m1[3][3] = m2[3][0]*m3[0][3] + m2[3][1]*m3[1][3] + m2[3][2]*m3[2][3] + m2[3][3]*m3[3][3];
}
void GAMath::Mat4Transp(float mat[][4])
{
float t;
t = mat[0][1] ;
mat[0][1] = mat[1][0] ;
mat[1][0] = t;
t = mat[0][2] ;
mat[0][2] = mat[2][0] ;
mat[2][0] = t;
t = mat[0][3] ;
mat[0][3] = mat[3][0] ;
mat[3][0] = t;
t = mat[1][2] ;
mat[1][2] = mat[2][1] ;
mat[2][1] = t;
t = mat[1][3] ;
mat[1][3] = mat[3][1] ;
mat[3][1] = t;
t = mat[2][3] ;
mat[2][3] = mat[3][2] ;
mat[3][2] = t;
}
/*
* invertmat -
* computes the inverse of mat and puts it in inverse. Returns
* TRUE on success (i.e. can always find a pivot) and FALSE on failure.
* Uses Gaussian Elimination with partial (maximal column) pivoting.
*
* Mark Segal - 1992
*/
int GAMath::Mat4Invert(float inverse[][4], float mat[][4])
{
int i, j, k;
double temp;
float tempmat[4][4];
float max;
int maxj;
/* Set inverse to identity */
for (i=0; i<4; i++)
for (j=0; j<4; j++)
inverse[i][j] = 0;
for (i=0; i<4; i++)
inverse[i][i] = 1;
/* Copy original matrix so we don't mess it up */
for(i = 0; i < 4; i++)
for(j = 0; j <4; j++)
tempmat[i][j] = mat[i][j];
for(i = 0; i < 4; i++) {
/* Look for row with max pivot */
max = ABS(tempmat[i][i]);
maxj = i;
for(j = i + 1; j < 4; j++) {
if(ABS(tempmat[j][i]) > max) {
max = ABS(tempmat[j][i]);
maxj = j;
}
}
/* Swap rows if necessary */
if (maxj != i) {
for( k = 0; k < 4; k++) {
SWAP(float, tempmat[i][k], tempmat[maxj][k]);
SWAP(float, inverse[i][k], inverse[maxj][k]);
}
}
temp = tempmat[i][i];
if (temp == 0)
return 0; /* No non-zero pivot */
for(k = 0; k < 4; k++) {
tempmat[i][k] = (float)(tempmat[i][k]/temp);
inverse[i][k] = (float)(inverse[i][k]/temp);
}
for(j = 0; j < 4; j++) {
if(j != i) {
temp = tempmat[j][i];
for(k = 0; k < 4; k++) {
tempmat[j][k] -= (float)(tempmat[i][k]*temp);
inverse[j][k] -= (float)(inverse[i][k]*temp);
}
}
}
}
return 1;
}
float GAMath::Det2x2(float a,float b,float c,float d)
{
return a*d - b*c;
}
float GAMath::Det3x3(float a1, float a2, float a3,
float b1, float b2, float b3,
float c1, float c2, float c3 )
{
float ans;
ans = a1 * Det2x2( b2, b3, c2, c3 )
- b1 * Det2x2( a2, a3, c2, c3 )
+ c1 * Det2x2( a2, a3, b2, b3 );
return ans;
}
float GAMath::Det4x4(float m[][4])
{
float ans;
float a1,a2,a3,a4,b1,b2,b3,b4,c1,c2,c3,c4,d1,d2,d3,d4;
a1= m[0][0];
b1= m[0][1];
c1= m[0][2];
d1= m[0][3];
a2= m[1][0];
b2= m[1][1];
c2= m[1][2];
d2= m[1][3];
a3= m[2][0];
b3= m[2][1];
c3= m[2][2];
d3= m[2][3];
a4= m[3][0];
b4= m[3][1];
c4= m[3][2];
d4= m[3][3];
ans = a1 * Det3x3( b2, b3, b4, c2, c3, c4, d2, d3, d4)
- b1 * Det3x3( a2, a3, a4, c2, c3, c4, d2, d3, d4)
+ c1 * Det3x3( a2, a3, a4, b2, b3, b4, d2, d3, d4)
- d1 * Det3x3( a2, a3, a4, b2, b3, b4, c2, c3, c4);
return ans;
}
float GAMath::Normalise(float *n)
{
float d;
d = n[0]*n[0]+n[1]*n[1]+n[2]*n[2];
if(d>1.0e-35F){
d = (float)sqrt(d);
n[0] /= d;
n[1] /= d;
n[2] /= d;
}else{
n[0] = n[1] = n[2] = 0.0;
d = 0.0;
}
return d;
}
void GAMath::Crossf(float *c, float *a, float *b)
{
c[0] = a[1]*b[2]-a[2]*b[1];
c[1] = a[2]*b[0]-a[0]*b[2];
c[2] = a[0]*b[1]-a[1]*b[0];
}
void GAMath::Subtract(float *c, float * a, float * b)
{
c[0] = a[0] - b[0];
c[1] = a[1] - b[1];
c[2] = a[2] - b[2];
}