00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef GUL_MATRIX_H
00021 #define GUL_MATRIX_H
00022
00023 namespace gul {
00024
00025 template< class T >
00026 mat4x4<T> operator*( mat4x4<T> a, mat4x4<T> b )
00027 {
00028 int i,j,k;
00029 mat4x4<T> c;
00030 T sum;
00031
00032 for( i = 0; i < 4; i++)
00033 {
00034 for( j =0; j < 4; j++)
00035 {
00036 sum = (T)0.0;
00037
00038 for( k = 0; k < 4; k++)
00039 sum += a[i][k]*b[k][j];
00040
00041 c[i][j] = sum;
00042 }
00043 }
00044 return c;
00045 }
00046
00047 template< class T, class T2 >
00048 void MCopy( int m, int n, const Ptr< Ptr<T2> >& A, Ptr< Ptr<T> >& C )
00049 {
00050 int i,j;
00051
00052 for( i = 0; i < m; i++)
00053 for( j =0; j < n; j++)
00054 C[i][j] = (T)A[i][j];
00055 }
00056 template< class T, class T2 >
00057 void MCopy( int m, int n, const Ptr< Ptr<T2> >& A, Ptr<T>& C )
00058 {
00059 int i,j;
00060
00061 for( i = 0; i < m; i++)
00062 for( j =0; j < n; j++)
00063 C[i*n+j] = (T)A[i][j];
00064 }
00065 template< class T, class T2 >
00066 void MCopy( int m, int n, const Ptr<T2>& A, Ptr< Ptr<T> >& C )
00067 {
00068 int i,j;
00069
00070 for( i = 0; i < m; i++)
00071 for( j =0; j < n; j++)
00072 C[i][j] = (T)A[i*n+j];
00073 }
00074
00075
00076 template< class T >
00077 void MMProduct( int r, int s, int t,
00078 Ptr< Ptr<T> >& A, Ptr< Ptr<T> >& B, Ptr< Ptr<T> >& C )
00079 {
00080 int i,j,k;
00081 T sum;
00082
00083 for( i = 0; i < r; i++)
00084 {
00085 for( j =0; j < t; j++)
00086 {
00087 sum = (T)0.0;
00088
00089 for( k = 0; k < s; k++)
00090 sum += A[i][k]*B[k][j];
00091
00092 C[i][j] = sum;
00093 }
00094 }
00095 }
00096
00097 template< class T >
00098 void MMProduct( int r, int s, int t, Ptr<T>& A, Ptr<T>& B, Ptr<T>& C )
00099 {
00100 int i,j,k;
00101 T sum;
00102
00103 for( i = 0; i < r; i++)
00104 {
00105 for( j =0; j < t; j++)
00106 {
00107 sum = (T)0.0;
00108
00109 for( k = 0; k < s; k++)
00110 sum += A[i*s+k]*B[k*t+j];
00111
00112 C[i*t+j] = sum;
00113 }
00114 }
00115 }
00116
00117
00118 template< class T >
00119 vec4<T> operator*( mat4x4<T> a, vec4<T> b )
00120 {
00121 int i,k;
00122 vec4<T> c;
00123 T sum;
00124
00125 for( i = 0; i < 4; i++)
00126 {
00127 sum = (T)0.0;
00128
00129 for( k = 0; k < 4; k++)
00130 sum += a[i][k]*b[k];
00131
00132 c[i] = sum;
00133 }
00134 return c;
00135 }
00136
00137 template< class T >
00138 void MVProduct( int n, int m, Ptr< Ptr<T> >& A, Ptr<T>& x, Ptr<T>& b )
00139 {
00140 int i,k;
00141 T sum;
00142
00143 for( i = 0; i < n; i++)
00144 {
00145 sum = (T)0.0;
00146
00147 for( k = 0; k < m; k++)
00148 sum += A[i][k]*x[k];
00149
00150 b[i] = sum;
00151 }
00152 }
00153
00154 template< class T >
00155 void VMProduct( int n, int m, const Ptr<T>& x, const Ptr< Ptr<T> >& A, Ptr<T>& b )
00156 {
00157 int i,k;
00158 T sum;
00159
00160 for( i = 0; i < m; i++)
00161 {
00162 sum = (T)0.0;
00163
00164 for( k = 0; k < n; k++)
00165 sum += x[k]*A[k][i];
00166
00167 b[i] = sum;
00168 }
00169 }
00170
00171 template< class T >
00172 void VMProduct( int n, int m, const Ptr<T>& x, const Ptr<T>& A, Ptr<T>& b )
00173 {
00174 int i,k;
00175 T sum;
00176
00177 for( i = 0; i < m; i++)
00178 {
00179 sum = (T)0.0;
00180
00181 for( k = 0; k < n; k++)
00182 sum += x[k]*A[k*m+i];
00183
00184 b[i] = sum;
00185 }
00186 }
00187
00188
00189 template< class T >
00190 vec4<T> operator*( vec4<T> b, mat4x4<T> a )
00191 {
00192 int i,k;
00193 vec4<T> c;
00194 T sum;
00195
00196 for( i = 0; i < 4; i++)
00197 {
00198 sum = (T)0.0;
00199
00200 for( k = 0; k < 4; k++)
00201 sum += b[k] * a[k][i];
00202
00203 c[i] = sum;
00204 }
00205 return c;
00206 }
00207
00208 template< class T >
00209 void CubeVerts( const T& xmin, const T& xmax,
00210 const T& ymin, const T& ymax,
00211 const T& zmin, const T& zmax,
00212 vec4<T> *v )
00213 {
00214 v[0][0] = xmin;
00215 v[0][1] = ymin;
00216 v[0][2] = zmin;
00217 v[0][3] = (T)1.0;
00218
00219 v[1][0] = xmax;
00220 v[1][1] = ymin;
00221 v[1][2] = zmin;
00222 v[1][3] = (T)1.0;
00223
00224 v[2][0] = xmax;
00225 v[2][1] = ymax;
00226 v[2][2] = zmin;
00227 v[2][3] = (T)1.0;
00228
00229 v[3][0] = xmin;
00230 v[3][1] = ymax;
00231 v[3][2] = zmin;
00232 v[3][3] = (T)1.0;
00233
00234
00235 v[4][0] = xmin;
00236 v[4][1] = ymin;
00237 v[4][2] = zmax;
00238 v[4][3] = (T)1.0;
00239
00240 v[5][0] = xmax;
00241 v[5][1] = ymin;
00242 v[5][2] = zmax;
00243 v[5][3] = (T)1.0;
00244
00245 v[6][0] = xmax;
00246 v[6][1] = ymax;
00247 v[6][2] = zmax;
00248 v[6][3] = (T)1.0;
00249
00250 v[7][0] = xmin;
00251 v[7][1] = ymax;
00252 v[7][2] = zmax;
00253 v[7][3] = (T)1.0;
00254 }
00255
00256 template< class T >
00257 void CubeVerts( const T& xmin, const T& xmax,
00258 const T& ymin, const T& ymax,
00259 const T& zmin, const T& zmax,
00260 point<T> *v )
00261 {
00262 v[0].x = xmin;
00263 v[0].y = ymin;
00264 v[0].z = zmin;
00265
00266 v[1].x = xmax;
00267 v[1].y = ymin;
00268 v[1].z = zmin;
00269
00270 v[2].x = xmax;
00271 v[2].y = ymax;
00272 v[2].z = zmin;
00273
00274 v[3].x = xmin;
00275 v[3].y = ymax;
00276 v[3].z = zmin;
00277
00278 v[4].x = xmin;
00279 v[4].y = ymin;
00280 v[4].z = zmax;
00281
00282 v[5].x = xmax;
00283 v[5].y = ymin;
00284 v[5].z = zmax;
00285
00286 v[6].x = xmax;
00287 v[6].y = ymax;
00288 v[6].z = zmax;
00289
00290 v[7].x = xmin;
00291 v[7].y = ymax;
00292 v[7].z = zmax;
00293 }
00294
00295 template< class T >
00296 void CubeVerts( const Ptr<T>& bb, Ptr< point<T> >& v )
00297 {
00298 CubeVerts<T>( bb[0], bb[1], bb[2], bb[3], bb[4], bb[5], &v[0] );
00299 }
00300
00301
00302
00303 }
00304
00305 #endif