Back to index

radiance  4R0+20100331
mx3.c
Go to the documentation of this file.
00001 #ifndef lint
00002 static const char    RCSid[] = "$Id: mx3.c,v 2.3 2004/03/28 20:33:14 schorsch Exp $";
00003 #endif
00004 
00005 #include "mx3.h"
00006 
00007 extern double
00008 mx3d_adjoint(
00009        register double a[3][3],
00010        register double b[3][3]
00011 )
00012 {
00013     b[0][0] =  ((a[1][1])*( a[2][2]) - ( a[1][2])*( a[2][1]));
00014     b[1][0] =  ((a[1][2])*( a[2][0]) - ( a[1][0])*( a[2][2]));
00015     b[2][0] =  ((a[1][0])*( a[2][1]) - ( a[1][1])*( a[2][0]));
00016     b[0][1] =  ((a[2][1])*( a[0][2]) - ( a[2][2])*( a[0][1]));
00017     b[1][1] =  ((a[2][2])*( a[0][0]) - ( a[2][0])*( a[0][2]));
00018     b[2][1] =  ((a[2][0])*( a[0][1]) - ( a[2][1])*( a[0][0]));
00019     b[0][2] =  ((a[0][1])*( a[1][2]) - ( a[0][2])*( a[1][1]));
00020     b[1][2] =  ((a[0][2])*( a[1][0]) - ( a[0][0])*( a[1][2]));
00021     b[2][2] =  ((a[0][0])*( a[1][1]) - ( a[0][1])*( a[1][0]));
00022     return a[0][0]*b[0][0] + a[1][0]*b[0][1] + a[2][0]*b[0][2];
00023 }
00024 
00025 
00026 extern void
00027 mx3d_mul(
00028        register double a[3][3],
00029        register double b[3][3],
00030        register double c[3][3]
00031 )
00032 {
00033     c[0][0] = a[0][0]*b[0][0] + a[0][1]*b[1][0] + a[0][2]*b[2][0];
00034     c[0][1] = a[0][0]*b[0][1] + a[0][1]*b[1][1] + a[0][2]*b[2][1];
00035     c[0][2] = a[0][0]*b[0][2] + a[0][1]*b[1][2] + a[0][2]*b[2][2];
00036     c[1][0] = a[1][0]*b[0][0] + a[1][1]*b[1][0] + a[1][2]*b[2][0];
00037     c[1][1] = a[1][0]*b[0][1] + a[1][1]*b[1][1] + a[1][2]*b[2][1];
00038     c[1][2] = a[1][0]*b[0][2] + a[1][1]*b[1][2] + a[1][2]*b[2][2];
00039     c[2][0] = a[2][0]*b[0][0] + a[2][1]*b[1][0] + a[2][2]*b[2][0];
00040     c[2][1] = a[2][0]*b[0][1] + a[2][1]*b[1][1] + a[2][2]*b[2][1];
00041     c[2][2] = a[2][0]*b[0][2] + a[2][1]*b[1][2] + a[2][2]*b[2][2];
00042 }
00043 
00044 
00045 extern void
00046 mx3d_transform(
00047        register double p[3],
00048        register double a[3][3],
00049        register double q[3]
00050 )
00051 {
00052     q[0] = p[0]*a[0][0] + p[1]*a[1][0] + p[2]*a[2][0];
00053     q[1] = p[0]*a[0][1] + p[1]*a[1][1] + p[2]*a[2][1];
00054     q[2] = p[0]*a[0][2] + p[1]*a[1][2] + p[2]*a[2][2];
00055 }
00056 
00057 
00058 extern double
00059 mx3d_transform_div(
00060        register double p[3],
00061        register double a[3][3],
00062        register double q[2]
00063 )
00064 {
00065     double q2;
00066     q2 = p[0]*a[0][2] + p[1]*a[1][2] + p[2]*a[2][2];
00067     if (q2!=0.) {
00068        q[0] = (p[0]*a[0][0] + p[1]*a[1][0] + p[2]*a[2][0]) / q2;
00069        q[1] = (p[0]*a[0][1] + p[1]*a[1][1] + p[2]*a[2][1]) / q2;
00070     }
00071     return q2;
00072 }
00073 
00074 
00075 extern void
00076 mx3d_translate_mat(
00077        double tx,
00078        double ty,
00079        register double m[3][3]
00080 )
00081 {
00082     m[0][0] = 1.; m[0][1] = 0.; m[0][2] = 0.;
00083     m[1][0] = 0.; m[1][1] = 1.; m[1][2] = 0.;
00084     m[2][0] = tx; m[2][1] = ty; m[2][2] = 1.;
00085 }
00086 
00087 
00088 extern void
00089 mx3d_translate(
00090        register double m[3][3],
00091        double tx,
00092        double ty
00093 )
00094 {
00095     m[3][0] += tx*m[0][0]+ty*m[1][0];
00096     m[3][1] += tx*m[0][1]+ty*m[1][1];
00097     m[3][2] += tx*m[0][2]+ty*m[1][2];
00098 }
00099 
00100 
00101 extern void
00102 mx3d_scale_mat(
00103        double sx,
00104        double sy,
00105        register double m[3][3]
00106 )
00107 {
00108     m[0][0] = sx; m[0][1] = 0.; m[0][2] = 0.;
00109     m[1][0] = 0.; m[1][1] = sy; m[1][2] = 0.;
00110     m[2][0] = 0.; m[2][1] = 0.; m[2][2] = 1.;
00111 }
00112 
00113 
00114 extern void
00115 mx3d_scale(
00116        register double m[3][3],
00117        double sx,
00118        double sy
00119 )
00120 {
00121     m[0][0] *= sx; m[0][1] *= sx; m[0][2] *= sx;
00122     m[1][0] *= sy; m[1][1] *= sy; m[1][2] *= sy;
00123 }