#include "string.h"
Go to the source code of this file.
Functions | |
template<class T> void | Multiply (const T *M, const T *v, T *r) |
template<class T> void | Invert (const T *pb, T *pa) |
|
Definition at line 31 of file math.h.
00032 { 00033 T a[4][4]; 00034 T b[4][4]; 00035 memcpy( a, pa, sizeof( T ) * 16); 00036 memcpy( b, pb, sizeof( T ) * 16); 00037 00038 long indxc[4], indxr[4], ipiv[4]; 00039 long i, icol=0, irow=0, j, ir, ic; 00040 float big, dum, pivinv, temp, bb; 00041 ipiv[0] = -1; ipiv[1] = -1; ipiv[2] = -1; ipiv[3] = -1; 00042 a[0][0] = b[0][0]; 00043 a[1][0] = b[1][0]; 00044 a[2][0] = b[2][0]; 00045 a[3][0] = b[3][0]; 00046 a[0][1] = b[0][1]; 00047 a[1][1] = b[1][1]; 00048 a[2][1] = b[2][1]; 00049 a[3][1] = b[3][1]; 00050 a[0][2] = b[0][2]; 00051 a[1][2] = b[1][2]; 00052 a[2][2] = b[2][2]; 00053 a[3][2] = b[3][2]; 00054 a[0][3] = b[0][3]; 00055 a[1][3] = b[1][3]; 00056 a[2][3] = b[2][3]; 00057 a[3][3] = b[3][3]; 00058 for (i = 0; i < 4; i++) { 00059 big = 0.0f; 00060 for (j = 0; j < 4; j++) { 00061 if (ipiv[j] != 0) { 00062 if (ipiv[0] == -1) { 00063 if ((bb = ( float) fabs(a[j][0])) > big) { 00064 big = bb; irow = j; icol = 0; 00065 } 00066 } 00067 else if (ipiv[0] > 0) { 00068 memcpy( pa, a, 16*sizeof( T )); 00069 return; 00070 } 00071 00072 if (ipiv[1] == -1) { 00073 if ((bb = ( float) fabs(( float) a[j][1])) > big) { 00074 big = bb; irow = j; icol = 1; 00075 } 00076 } 00077 else if (ipiv[1] > 0) { 00078 memcpy( pa, a, 16*sizeof( T )); 00079 return; 00080 } 00081 00082 if (ipiv[2] == -1) { 00083 if ((bb = ( float) fabs(( float) a[j][2])) > big) { 00084 big = bb; irow = j; icol = 2; 00085 } 00086 } 00087 else if (ipiv[2] > 0) { 00088 memcpy( pa, a, 16*sizeof( T )); 00089 return; 00090 } 00091 00092 if (ipiv[3] == -1) { 00093 if ((bb = ( float) fabs(( float) a[j][3])) > big) { 00094 big = bb; irow = j; icol = 3; 00095 } 00096 } 00097 else if (ipiv[3] > 0) { 00098 memcpy( pa, a, 16*sizeof( T )); 00099 return; 00100 } 00101 } 00102 } 00103 ++(ipiv[icol]); 00104 00105 if (irow != icol) { 00106 temp = a[irow][0]; a[irow][0] = a[icol][0]; a[icol][0] = temp; 00107 temp = a[irow][1]; a[irow][1] = a[icol][1]; a[icol][1] = temp; 00108 temp = a[irow][2]; a[irow][2] = a[icol][2]; a[icol][2] = temp; 00109 temp = a[irow][3]; a[irow][3] = a[icol][3]; a[icol][3] = temp; 00110 } 00111 00112 indxr[i] = irow; indxc[i] = icol; 00113 if (a[icol][icol] == 0.0) { 00114 memcpy( pa, a, 16*sizeof( T )); 00115 return; 00116 } 00117 00118 pivinv = 1.0f / a[icol][icol]; 00119 a[icol][icol] = 1.0f; 00120 a[icol][0] *= pivinv; 00121 a[icol][1] *= pivinv; 00122 a[icol][2] *= pivinv; 00123 a[icol][3] *= pivinv; 00124 00125 if (icol != 0) { 00126 dum = a[0][icol]; 00127 a[0][icol] = 0.0f; 00128 a[0][0] -= a[icol][0] * dum; 00129 a[0][1] -= a[icol][1] * dum; 00130 a[0][2] -= a[icol][2] * dum; 00131 a[0][3] -= a[icol][3] * dum; 00132 } 00133 00134 if (icol != 1) { 00135 dum = a[1][icol]; 00136 a[1][icol] = 0.0f; 00137 a[1][0] -= a[icol][0] * dum; 00138 a[1][1] -= a[icol][1] * dum; 00139 a[1][2] -= a[icol][2] * dum; 00140 a[1][3] -= a[icol][3] * dum; 00141 } 00142 00143 if (icol != 2) { 00144 dum = a[2][icol]; 00145 a[2][icol] = 0.0f; 00146 a[2][0] -= a[icol][0] * dum; 00147 a[2][1] -= a[icol][1] * dum; 00148 a[2][2] -= a[icol][2] * dum; 00149 a[2][3] -= a[icol][3] * dum; 00150 } 00151 00152 if (icol != 3) { 00153 dum = a[3][icol]; 00154 a[3][icol] = 0.0f; 00155 a[3][0] -= a[icol][0] * dum; 00156 a[3][1] -= a[icol][1] * dum; 00157 a[3][2] -= a[icol][2] * dum; 00158 a[3][3] -= a[icol][3] * dum; 00159 } 00160 } 00161 00162 if (indxr[3] != indxc[3]) { 00163 ir = indxr[3]; ic = indxc[3]; 00164 temp = a[0][ir]; a[0][ir] = a[0][ic]; a[0][ic] = temp; 00165 temp = a[1][ir]; a[1][ir] = a[1][ic]; a[1][ic] = temp; 00166 temp = a[2][ir]; a[2][ir] = a[2][ic]; a[2][ic] = temp; 00167 temp = a[3][ir]; a[3][ir] = a[3][ic]; a[3][ic] = temp; 00168 } 00169 00170 if (indxr[2] != indxc[2]) { 00171 ir = indxr[2]; ic = indxc[2]; 00172 temp = a[0][ir]; a[0][ir] = a[0][ic]; a[0][ic] = temp; 00173 temp = a[1][ir]; a[1][ir] = a[1][ic]; a[1][ic] = temp; 00174 temp = a[2][ir]; a[2][ir] = a[2][ic]; a[2][ic] = temp; 00175 temp = a[3][ir]; a[3][ir] = a[3][ic]; a[3][ic] = temp; 00176 } 00177 00178 if (indxr[1] != indxc[1]) { 00179 ir = indxr[1]; ic = indxc[1]; 00180 temp = a[0][ir]; a[0][ir] = a[0][ic]; a[0][ic] = temp; 00181 temp = a[1][ir]; a[1][ir] = a[1][ic]; a[1][ic] = temp; 00182 temp = a[2][ir]; a[2][ir] = a[2][ic]; a[2][ic] = temp; 00183 temp = a[3][ir]; a[3][ir] = a[3][ic]; a[3][ic] = temp; 00184 } 00185 00186 if (indxr[0] != indxc[0]) { 00187 ir = indxr[0]; ic = indxc[0]; 00188 temp = a[0][ir]; a[0][ir] = a[0][ic]; a[0][ic] = temp; 00189 temp = a[1][ir]; a[1][ir] = a[1][ic]; a[1][ic] = temp; 00190 temp = a[2][ir]; a[2][ir] = a[2][ic]; a[2][ic] = temp; 00191 temp = a[3][ir]; a[3][ir] = a[3][ic]; a[3][ic] = temp; 00192 } 00193 00194 memcpy( pa, a, 16*sizeof( T )); 00195 } |
|
Definition at line 11 of file math.h.
00012 { 00013 *(r++) = M[0]*v[0] + M[1]*v[1] + M[2]*v[2] + M[3]*v[3]; 00014 *(r++) = M[4]*v[0] + M[5]*v[1] + M[6]*v[2] + M[7]*v[3]; 00015 *(r++) = M[8]*v[0] + M[9]*v[1] + M[10]*v[2] + M[11]*v[3]; 00016 *(r++) = M[12]*v[0] + M[13]*v[1] + M[14]*v[2] + M[15]*v[3]; 00017 } |