Google

Main Page   Class Hierarchy   Compound List   File List   Compound Members  

ctmspat.h

00001 /*
00002     Dynamics/Kinematics modeling and simulation library.
00003     Copyright (C) 1999 by Michael Alexander Ewert
00004 
00005     This library is free software; you can redistribute it and/or
00006     modify it under the terms of the GNU Library General Public
00007     License as published by the Free Software Foundation; either
00008     version 2 of the License, or (at your option) any later version.
00009 
00010     This library is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013     Library General Public License for more details.
00014 
00015     You should have received a copy of the GNU Library General Public
00016     License along with this library; if not, write to the Free
00017     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00018 
00019 */
00020 
00021 #ifndef CT_SPATIALMATRIX
00022 #define CT_SPATIALMATRIX
00023 
00024 #include "csphyzik/ctmatrix.h"
00025 #include "csphyzik/ctvspat.h"
00026 
00027 #define ctSpatialMatrix ctSpatialMatrix6
00028 
00029 
00030 //************   MATRIX6
00031 
00032 class ctSpatialMatrix6 : public ctMatrix
00033 {
00034 public:
00035   ctSpatialMatrix6 ()
00036   {
00037     dimen = 6;
00038         int idx, idy;
00039     for(idx = 0; idx < 6; idx++)
00040       for(idy = 0; idy < 6; idy++)
00041         rows[idx][idy] = ( idx == idy ) ? 1.0 : 0.0;
00042   }
00043 
00049   void form_spatial_transformation ( const ctMatrix3 &pR, const ctVector3 &pr );
00050 
00055   void form_spatial_I ( const ctMatrix3 &pI, real pmass );
00056 
00057   real * operator[] ( const int index )
00058   { return (real *)(rows[index]); }
00059 
00060   real * operator[] ( const int index ) const
00061   { return (real *)(rows[index]); } 
00062 
00063   void operator=( const ctSpatialMatrix6 &pm )
00064   {
00065     int idx, idy;
00066     for( idx = 0; idx < 6; idx++ )
00067       for( idy = 0; idy < 6; idy++ )
00068         rows[idx][idy] = pm[idx][idy];
00069   }
00070 
00071   void identity ()
00072   {
00073         int idx, idy;
00074     for (idx = 0; idx < 6; idx++)
00075       for (idy = 0; idy < 6; idy++)
00076       {
00077         if( idx == idy )
00078           rows[idx][idy] = 1.0;
00079         else
00080           rows[idx][idy] = 0.0;
00081       }
00082   }
00083 
00084   ctSpatialMatrix6 get_transpose () const
00085   {
00086     ctSpatialMatrix6 Mret;
00087         int idx, idy;
00088     for (idx = 0; idx < 6; idx++)
00089       for (idy = 0; idy < 6; idy++)
00090         Mret[idx][idy] = rows[idy][idx];
00091     return Mret;
00092   }
00093 
00094   void orthonormalize ();
00095 
00096   void mult_v ( ctSpatialVector6 &pdest, const ctSpatialVector6 &pv )
00097   {
00098         int idx, idy;
00099     for(idx = 0; idx < 6; idx++)
00100     {
00101       pdest[idx] = 0;
00102       for(idy = 0; idy < 6; idy++)
00103         pdest[idx] += rows[idx][idy]*pv[idy];
00104     }
00105   }
00106 
00107   ctSpatialVector6 operator* ( const ctSpatialVector6 &pv )
00108   {
00109     ctSpatialVector6 rv (0,0,0,0,0,0);
00110     int idx, idx2;
00111     for (idx = 0; idx < 6; idx++)
00112       for(idx2 = 0; idx2 < 6; idx2++)
00113         rv[idx] += rows[idx][idx2]*pv[idx2];
00114 
00115     return rv;
00116   }
00117 
00118   ctSpatialVector6 operator* ( const ctSpatialVector6 &pv ) const
00119   {
00120     ctSpatialVector6 rv( 0,0,0,0,0,0);
00121     int idx, idx2;
00122     for( idx = 0; idx < 6; idx++ )
00123       for( idx2 = 0; idx2 < 6; idx2++ )
00124         rv[idx] += rows[idx][idx2]*pv[idx2];
00125     return rv;
00126   }
00127 
00128   ctSpatialMatrix6 operator* ( const ctSpatialMatrix6 &MM ) const
00129   {
00130     ctSpatialMatrix6 Mret;
00131         int idr, idc, adder;
00132     for(idr = 0; idr < 6; idr++)
00133       for(idc = 0; idc < 6; idc++)
00134       {
00135         Mret[idr][idc] = 0.0;
00136         for(adder = 0; adder < 6; adder++)
00137           Mret[idr][idc] += rows[idr][adder]*MM[adder][idc];
00138       }
00139 
00140     return Mret;
00141   }
00142 
00143   void mult_M( ctSpatialMatrix6 &Mret, const ctSpatialMatrix6 &MM ) const
00144   {
00145         int idr, idc, adder;
00146     for (idr = 0; idr < 6; idr++)
00147       for (idc = 0; idc < 6; idc++)
00148       {
00149         Mret[idr][idc] = 0.0;
00150         for(adder = 0; adder < 6; adder++)
00151           Mret[idr][idc] += rows[idr][adder]*MM[adder][idc];
00152       }
00153   }
00154 
00155   void operator*=( const ctSpatialMatrix6 &MM )
00156   {
00157     ctSpatialMatrix6 Mret;
00158         int idr, idc, adder;
00159     for (idr = 0; idr < 6; idr++)
00160       for (idc = 0; idc < 6; idc++)
00161       {
00162         Mret[idr][idc] = 0.0;
00163         for (adder = 0; adder < 6; adder++)
00164           Mret[idr][idc] += rows[idr][adder]*MM[adder][idc];
00165       }
00166     *this = Mret;
00167   }
00168 
00169   ctSpatialMatrix6 operator* ( const real pk ) const
00170   {
00171     ctSpatialMatrix6 Mret;
00172         int idr, idc;
00173     for (idr = 0; idr < 6; idr++)
00174       for (idc = 0; idc < 6; idc++)
00175         Mret[idr][idc] = rows[idr][idc]*pk;
00176     return Mret;
00177   }
00178 
00179   void operator*= ( const real pm )
00180   {
00181         int idx, idy;
00182     for (idx = 0; idx < 6; idx++)
00183       for (idy = 0; idy < 6; idy++)
00184         rows[idx][idy] *= pm;
00185   }
00186 
00187   // addition
00188   void add ( const ctSpatialMatrix6 &pm )
00189   {
00190         int idx, idy;
00191     for (idx = 0; idx < 6; idx++)
00192       for (idy = 0; idy < 6; idy++)
00193         rows[idx][idy] += pm.rows[idx][idy];
00194   }
00195 
00196   void add2 ( const ctSpatialMatrix6 &pm1, const ctSpatialMatrix6 &pm2 )
00197   {
00198         int idx, idy;
00199     for (idx = 0; idx < 6; idx++)
00200       for (idy = 0; idy < 6; idy++)
00201         rows[idx][idy] = pm1.rows[idx][idy] + pm2.rows[idx][idy];
00202   }
00203 
00204   void add3 ( ctSpatialMatrix6 &pmdest,
00205               const ctSpatialMatrix6 &pm1, const ctSpatialMatrix6 &pm2 )
00206   {
00207         int idx, idy;
00208     for (idx = 0; idx < 6; idx++)
00209       for (idy = 0; idy < 6; idy++)
00210         pmdest.rows[idx][idy] = pm1.rows[idx][idy] + pm2.rows[idx][idy];
00211   }
00212 
00213   void operator+= ( const ctSpatialMatrix6 &pm )
00214   {
00215         int idx, idy;
00216     for (idx = 0; idx < 6; idx++)
00217       for (idy = 0; idy < 6; idy++)
00218         rows[idx][idy] += pm.rows[idx][idy];
00219   }
00220 
00221   ctSpatialMatrix6 operator+ ( const ctSpatialMatrix6 &pm )
00222   {
00223     ctSpatialMatrix6 Mret;
00224         int idx, idy;
00225     for (idx = 0; idx < 6; idx++)
00226       for (idy = 0; idy < 6; idy++)
00227         Mret.rows[idx][idy] = rows[idx][idy] + pm.rows[idx][idy];
00228 
00229     return Mret;
00230   }
00231 
00232   // subtraction
00233   void subtract ( const ctSpatialMatrix6 &pm )
00234   {
00235         int idx, idy;
00236     for (idx = 0; idx < 6; idx++)
00237       for (idy = 0; idy < 6; idy++)
00238         rows[idx][idy] -= pm.rows[idx][idy];
00239   }
00240 
00241   void subtract2 ( const ctSpatialMatrix6 &pm1, const ctSpatialMatrix6 &pm2 )
00242   {
00243         int idx, idy;
00244     for (idx = 0; idx < 6; idx++)
00245       for (idy = 0; idy < 6; idy++)
00246         rows[idx][idy] = pm1.rows[idx][idy] - pm2.rows[idx][idy];
00247   }
00248 
00249   void subtract3 ( ctSpatialMatrix6 &pmdest,
00250                   const ctSpatialMatrix6 &pm1, const ctSpatialMatrix6 &pm2 )
00251   {
00252         int idx, idy;
00253     for (idx = 0; idx < 6; idx++)
00254       for (idy = 0; idy < 6; idy++)
00255         pmdest.rows[idx][idy] = pm1.rows[idx][idy] - pm2.rows[idx][idy];
00256   }
00257 
00258   void operator-= ( const ctSpatialMatrix6 &pm )
00259   {
00260         int idx, idy;
00261     for (idx = 0; idx < 6; idx++)
00262       for (idy = 0; idy < 6; idy++)
00263         rows[idx][idy] -= pm.rows[idx][idy];
00264   }
00265 
00266   ctSpatialMatrix6 operator- ( ctSpatialMatrix6 &pm )
00267   {
00268     ctSpatialMatrix6 Mret;
00269         int idx, idy;
00270     for (idx = 0; idx < 6; idx++)
00271       for (idy = 0; idy < 6; idy++)
00272         Mret.rows[idx][idy] = rows[idx][idy] - pm.rows[idx][idy];
00273     return Mret;
00274   }
00275 
00277   // solve the linear system Ax = b where x is an unknown vector
00278   // b is a known vector and A is this matrix
00279   // solved x will be returned in px
00280   void solve ( ctSpatialVector6 &px, const ctSpatialVector6 &pb )
00281   {
00282     real **A;
00283     real *b;
00284     real *x;
00285     int idx, idy;
00286 
00287     b = (real *)malloc ( sizeof( real )*6 );
00288     A = (real **)malloc ( sizeof( real * )*6 );
00289     x = px.get_elements();
00290 
00291     for(idx = 0; idx < 6; idx++)
00292     {
00293       b[idx] = pb[idx];
00294       A[idx] = (real *)malloc( sizeof( real )*6 );
00295       for(idy = 0; idy < 6; idy++)
00296         A[idx][idy] = rows[idx][idy];
00297     }
00298 
00299     // solve this sucker
00300     linear_solve( A, 6, x, b );
00301 
00302     free( b );
00303     free( A );
00304   }
00305 
00306   void debug_print ()
00307   {
00308         int i, j;
00309     for(i = 0; i < dimen; i++)
00310     {
00311       for(j = 0; j < dimen; j++)
00312       {
00313 //        Debug::logf( CT_DEBUG_LEVEL, "%lf :: ", rows[i][j] );
00314 //      Debug::logf( CT_DEBUG_LEVEL, "\n" );
00315       }
00316     }
00317   }
00318 
00319 protected:
00320   real rows[6][6];
00321 
00322 };
00323 
00324 inline ctSpatialMatrix6 ctSpatialVector6::operator*
00325    ( const ctVectorTranspose6 &pv )
00326 {
00327   ctSpatialMatrix6 Mret;
00328   int idr, idc;
00329   for(idr = 0; idr < 6; idr++)
00330     for(idc = 0; idc < 6; idc++)
00331       Mret[idr][idc] = elements[idr]*pv[idc];
00332   return Mret;
00333 }
00334 
00335 inline void ctSpatialMatrix::form_spatial_transformation
00336    ( const ctMatrix3 &pR, const ctVector3 &pr )
00337 {
00338   // -~rR     ~r is the x-product matrix thing
00339   rows[3][0]/*M21.m11*/ = pr[2]*pR[1][0] - pr[1] * pR[2][0];
00340   rows[3][1]/*M21.m12*/ = pr[2]*pR[1][1] - pr[1] * pR[2][1];
00341   rows[3][2]/*M21.m13*/ = pr[2]*pR[1][2] - pr[1] * pR[2][2];
00342 
00343   rows[4][0]/*M21.m21*/ = - pr[2]*pR[0][0] + pr[0] * pR[2][0];
00344   rows[4][1]/*M21.m22*/ = - pr[2]*pR[0][1] + pr[0] * pR[2][1];
00345   rows[4][2]/*M21.m23*/ = - pr[2]*pR[0][2] + pr[0] * pR[2][2];
00346 
00347   rows[5][0]/*M21.m31*/ =  pr[1]*pR[0][0] - pr[0] * pR[1][0];
00348   rows[5][1]/*M21.m32*/ =  pr[1]*pR[0][1] - pr[0] * pR[1][1];
00349   rows[5][2]/*M21.m33*/ =  pr[1]*pR[0][2] - pr[0] * pR[1][2];
00350 
00351   int idr, idc;
00352   for (idr = 0; idr < 3; idr++)
00353   {
00354     for(idc = 0; idc < 3; idc++)
00355     {
00356       rows[idr][idc] = pR[idr][idc];
00357       rows[idr+3][idc+3] = pR[idr][idc];
00358       rows[idr][idc+3] = 0.0;
00359     }
00360   }
00361 }
00362 
00363 inline void ctSpatialMatrix::form_spatial_I( const ctMatrix3 &pI, real pmass )
00364 {
00365 /*      M11 *= 0;
00366         M12.Identity();
00367         M12 *= pmass;
00368         M21 = pI;
00369         M22 *= 0;
00370 */
00371 
00372   int idr, idc;
00373   for (idr = 0; idr < 3; idr++)
00374   {
00375     for (idc = 0; idc < 3; idc++)
00376     {
00377       rows[idr][idc] = 0;
00378       rows[idr][idc+3] = ( idc == idr ) ? pmass : 0.0;
00379       rows[idr+3][idc] = pI[idr][idc];
00380       rows[idr+3][idc+3] = 0.0;
00381     }
00382   }
00383 }
00384 
00385 #endif

Generated for Crystal Space by doxygen 1.2.5 written by Dimitri van Heesch, ©1997-2000