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 xprintf(
Warn,
"Normalization of nearly zero vector.\n");
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;
258 int gauss(
double *A,
double *B,
int s,
double *R)
260 int res=1,i,j,k,size;
264 M = (
double *)
xmalloc( (size-1) * size *
sizeof(double));
268 M[i*(size)+j]=A[i*s+j];
271 for(i=0;i<size-1;i++)
275 for(j=i+1;j<size-1;j++)
282 M[j*size+k]=M[i*size+k];
291 if (fabs(max)<fabs(M[i*size+k])) max=fabs(M[i*size+k]);
295 for(j=i+1;j<size-1;j++)
299 koef=M[i*size+i]/M[j*size+i];
301 if((M[i*size+i]>=0 && M[j*size+i]>=0) ||
302 (M[i*size+i]<0 && M[j*size+i]<0)) koef*=-1;
304 M[j*size+k]=M[j*size+k]*koef + M[i*size+k];
309 for(i=size-1-1;i>=0;i--)
312 for(j=i+1;j<size-1;j++)
314 koef=koef+R[j]*M[i*size+j];
316 if (!(
DBL_EQ(M[i*size+i],0)))
317 R[i]=(M[i*size + size-1]-koef)/M[i*size+i];
320 if (koef==0 && M[i*size + size-1]==0)
343 return fi * 180 /
M_PI;
351 double *B,
int rb,
int cb,
double *X)
354 OLD_ASSERT(!(ca != rb),
"Matrix A has different number of columns than matrix B rows in the function matrix_x_matrix()\n");
355 for (i = 0; i < ra; i++)
356 for (j = 0; j < cb; j++)
359 for (k = 0; k < rb; k++)
360 X[ i * cb + j] += A[ i * ca + k] * B[ k * cb + j];
void vector_product(double u[], double v[], double x[])
static double Inverse3(SmallMtx3 a, SmallMtx3 b)
#define SUBDET2(i, j, k, l)
void matrix_x_matrix(double *A, int ra, int ca, double *B, int rb, int cb, double *X)
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.
void * xmalloc(size_t size)
Memory allocation with checking.
double MatrixInverse(double *a, double *b, int size)
void vector_difference(double u[], double v[], double x[])
int gauss(double *A, double *B, int s, double *R)
static double Inverse4(SmallMtx4 a, SmallMtx4 b)
double get_vectors_angle(double u[3], double v[3])