Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

gul_matrix.h

Go to the documentation of this file.
00001 /* LIBGUL - Geometry Utility Library
00002  * Copyright (C) 1998-1999 Norbert Irmer
00003  *
00004  * This library is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU Library General Public
00006  * License as published by the Free Software Foundation; either
00007  * version 2 of the License, or (at your option) any later version.
00008  *
00009  * This library is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  * Library General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU Library General Public
00015  * License along with this library; if not, write to the
00016  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00017  * Boston, MA 02111-1307, USA.
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

Generated on Mon Jan 21 04:17:32 2002 for GUL 0.6 - Geometry Utility Library by doxygen1.2.13.1 written by Dimitri van Heesch, © 1997-2001