36 return sqrt( v[0]*v[0]+v[1]*v[1]+v[2]*v[2] );
43 return u[0]*v[0]+u[1]*v[1]+u[2]*v[2];
53 WarningOut() <<
"Normalization of nearly zero vector." << std::endl;
55 u[0] /= l; u[1] /= l; u[2] /= l;
62 u[ 0 ] *= k; u[ 1 ] *= k; u[ 2 ] *= k;
73 x[ 0 ] = u[ 1 ] * v[ 2 ] - u[ 2 ] * v[ 1 ];
74 x[ 1 ] = u[ 2 ] * v[ 0 ] - u[ 0 ] * v[ 2 ];
75 x[ 2 ] = u[ 0 ] * v[ 1 ] - u[ 1 ] * v[ 0 ];
82 x[ 0 ] = u[ 0 ] - v[ 0 ];
83 x[ 1 ] = u[ 1 ] - v[ 1 ];
84 x[ 2 ] = u[ 2 ] - v[ 2 ];
107 *b=1/(*a);
return (*a);
127 if ( fabs(Det) <
NUM_ZERO )
return Det;
129 b[1][0]=-a[1][0]/Det;
130 b[0][1]=-a[0][1]/Det;
147 Det=a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0];
148 if ( fabs(Det)<
NUM_ZERO)
return Det;
149 b[0][0]/=Det; b[1][0]/=Det; b[2][0]/=Det;
167 double u[6], l[6], Det;
185 b[0][0]=+a[1][1]*l[5]-a[1][2]*l[4]+a[1][3]*l[3];
186 b[1][0]=-a[1][0]*l[5]+a[1][2]*l[2]-a[1][3]*l[1];
187 b[2][0]=+a[1][0]*l[4]-a[1][1]*l[2]+a[1][3]*l[0];
188 b[3][0]=-a[1][0]*l[3]+a[1][1]*l[1]-a[1][2]*l[0];
190 Det=a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0]+a[0][3]*b[3][0];
191 if ( fabs(Det)<
NUM_ZERO)
return Det;
192 b[0][0]/=Det; b[1][0]/=Det; b[2][0]/=Det; b[3][0]/=Det;
194 b[0][1]=(-a[0][1]*l[5]+a[0][2]*l[4]-a[0][3]*l[3])/Det;
195 b[1][1]=(+a[0][0]*l[5]-a[0][2]*l[2]+a[0][3]*l[1])/Det;
196 b[2][1]=(-a[0][0]*l[4]+a[0][1]*l[2]-a[0][3]*l[0])/Det;
197 b[3][1]=(+a[0][0]*l[3]-a[0][1]*l[1]+a[0][2]*l[0])/Det;
199 b[0][2]=(+a[3][1]*u[5]-a[3][2]*u[4]+a[3][3]*u[3])/Det;
200 b[1][2]=(-a[3][0]*u[5]+a[3][2]*u[2]-a[3][3]*u[1])/Det;
201 b[2][2]=(+a[3][0]*u[4]-a[3][1]*u[2]+a[3][3]*u[0])/Det;
202 b[3][2]=(-a[3][0]*u[3]+a[3][1]*u[1]-a[3][2]*u[0])/Det;
204 b[0][3]=(-a[2][1]*u[5]+a[2][2]*u[4]-a[2][3]*u[3])/Det;
205 b[1][3]=(+a[2][0]*u[5]-a[2][2]*u[2]+a[2][3]*u[1])/Det;
206 b[2][3]=(-a[2][0]*u[4]+a[2][1]*u[2]-a[2][3]*u[0])/Det;
207 b[3][3]=(+a[2][0]*u[3]-a[2][1]*u[1]+a[2][2]*u[0])/Det;
216 printf(
"matrix %d x %d :\n",size,size);
217 for (i=0;i<size;i++) {
218 for(j=0;j<size;j++)
printf(
"%f ",mtx[i*size+j]);
232 for(row=0;row<n-1;row++) {
234 Div=a[row][row];a[row][row]=1;
235 for(col=0;col<n;col++) a[row][col]/=Div;
237 for(subrow=row+1;subrow<n;subrow++) {
238 Mult=a[subrow][row];a[subrow][row]=0;
239 for(col=0;col<n;col++) a[subrow][col]-=a[row][col]*Mult;
243 Div=a[row][row];a[row][row]=1;
244 for(col=0;col<n;col++) a[row][col]/=Div;
248 for(subrow=row-1;subrow>=0;subrow--) {
249 Mult=a[subrow][row];a[subrow][row]=0;
250 for(col=0;col<n;col++) a[subrow][col]-=a[row][col]*Mult;
#define WarningOut()
Macro defining 'warning' record of log.
static double Inverse4(SmallMtx4 a, SmallMtx4 b)
static double Inverse2(SmallMtx2 a, SmallMtx2 b)
double MatrixInverse(double *a, double *b, int size)
static double Inverse3(SmallMtx3 a, SmallMtx3 b)
void MatInverse(int n, double **a)
double vector_length(double v[])
void vector_difference(double u[], double v[], double x[])
void scale_vector(double u[], double k)
double scalar_product(double u[], double v[])
void vector_product(double u[], double v[], double x[])
void normalize_vector(double u[])
void PrintSmallMatrix(double *mtx, int size)
#define NUM_ZERO
Numerical helpers.
#define SUBDET2(i, j, k, l)
void printf(BasicWriter< Char > &w, BasicCStringRef< Char > format, ArgList args)