34 return sqrt( v[0]*v[0]+v[1]*v[1]+v[2]*v[2] );
41 return u[0]*v[0]+u[1]*v[1]+u[2]*v[2];
51 WarningOut() <<
"Normalization of nearly zero vector." << std::endl;
53 u[0] /= l; u[1] /= l; u[2] /= l;
60 u[ 0 ] *= k; u[ 1 ] *= k; u[ 2 ] *= k;
71 x[ 0 ] = u[ 1 ] * v[ 2 ] - u[ 2 ] * v[ 1 ];
72 x[ 1 ] = u[ 2 ] * v[ 0 ] - u[ 0 ] * v[ 2 ];
73 x[ 2 ] = u[ 0 ] * v[ 1 ] - u[ 1 ] * v[ 0 ];
80 x[ 0 ] = u[ 0 ] - v[ 0 ];
81 x[ 1 ] = u[ 1 ] - v[ 1 ];
82 x[ 2 ] = u[ 2 ] - v[ 2 ];
105 *b=1/(*a);
return (*a);
125 if ( fabs(Det) <
NUM_ZERO )
return Det;
127 b[1][0]=-a[1][0]/Det;
128 b[0][1]=-a[0][1]/Det;
145 Det=a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0];
146 if ( fabs(Det)<
NUM_ZERO)
return Det;
147 b[0][0]/=Det; b[1][0]/=Det; b[2][0]/=Det;
165 double u[6], l[6], Det;
183 b[0][0]=+a[1][1]*l[5]-a[1][2]*l[4]+a[1][3]*l[3];
184 b[1][0]=-a[1][0]*l[5]+a[1][2]*l[2]-a[1][3]*l[1];
185 b[2][0]=+a[1][0]*l[4]-a[1][1]*l[2]+a[1][3]*l[0];
186 b[3][0]=-a[1][0]*l[3]+a[1][1]*l[1]-a[1][2]*l[0];
188 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];
189 if ( fabs(Det)<
NUM_ZERO)
return Det;
190 b[0][0]/=Det; b[1][0]/=Det; b[2][0]/=Det; b[3][0]/=Det;
192 b[0][1]=(-a[0][1]*l[5]+a[0][2]*l[4]-a[0][3]*l[3])/Det;
193 b[1][1]=(+a[0][0]*l[5]-a[0][2]*l[2]+a[0][3]*l[1])/Det;
194 b[2][1]=(-a[0][0]*l[4]+a[0][1]*l[2]-a[0][3]*l[0])/Det;
195 b[3][1]=(+a[0][0]*l[3]-a[0][1]*l[1]+a[0][2]*l[0])/Det;
197 b[0][2]=(+a[3][1]*u[5]-a[3][2]*u[4]+a[3][3]*u[3])/Det;
198 b[1][2]=(-a[3][0]*u[5]+a[3][2]*u[2]-a[3][3]*u[1])/Det;
199 b[2][2]=(+a[3][0]*u[4]-a[3][1]*u[2]+a[3][3]*u[0])/Det;
200 b[3][2]=(-a[3][0]*u[3]+a[3][1]*u[1]-a[3][2]*u[0])/Det;
202 b[0][3]=(-a[2][1]*u[5]+a[2][2]*u[4]-a[2][3]*u[3])/Det;
203 b[1][3]=(+a[2][0]*u[5]-a[2][2]*u[2]+a[2][3]*u[1])/Det;
204 b[2][3]=(-a[2][0]*u[4]+a[2][1]*u[2]-a[2][3]*u[0])/Det;
205 b[3][3]=(+a[2][0]*u[3]-a[2][1]*u[1]+a[2][2]*u[0])/Det;
214 printf(
"matrix %d x %d :\n",size,size);
215 for (i=0;i<size;i++) {
216 for(j=0;j<size;j++)
printf(
"%f ",mtx[i*size+j]);
230 for(row=0;row<n-1;row++) {
232 Div=a[row][row];a[row][row]=1;
233 for(col=0;col<n;col++) a[row][col]/=Div;
235 for(subrow=row+1;subrow<n;subrow++) {
236 Mult=a[subrow][row];a[subrow][row]=0;
237 for(col=0;col<n;col++) a[subrow][col]-=a[row][col]*Mult;
241 Div=a[row][row];a[row][row]=1;
242 for(col=0;col<n;col++) a[row][col]/=Div;
246 for(subrow=row-1;subrow>=0;subrow--) {
247 Mult=a[subrow][row];a[subrow][row]=0;
248 for(col=0;col<n;col++) a[subrow][col]-=a[row][col]*Mult;
void vector_product(double u[], double v[], double x[])
static double Inverse3(SmallMtx3 a, SmallMtx3 b)
#define SUBDET2(i, j, k, l)
void normalize_vector(double u[])
double vector_length(double v[])
void scale_vector(double u[], double k)
Global macros to enhance readability and debugging, general constants.
static double Inverse2(SmallMtx2 a, SmallMtx2 b)
double scalar_product(double u[], double v[])
void MatInverse(int n, double **a)
void PrintSmallMatrix(double *mtx, int size)
#define NUM_ZERO
Numerical helpers.
double MatrixInverse(double *a, double *b, int size)
void vector_difference(double u[], double v[], double x[])
#define WarningOut()
Macro defining 'warning' record of log.
static double Inverse4(SmallMtx4 a, SmallMtx4 b)
void printf(BasicWriter< Char > &w, BasicCStringRef< Char > format, ArgList args)