Biomechanical Joint Model
 Author: Anderson Maciel

comematrix.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2002 by Anderson Maciel                                 *
00003  *   andi.maciel@gmail.com                                                 *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
00009  *                                                                         *
00010  *   This program 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         *
00013  *   GNU General Public License for more details.                          *
00014  *                                                                         *
00015  *   You should have received a copy of the GNU General Public License     *
00016  *   along with this program; if not, write to the                         *
00017  *   Free Software Foundation, Inc.,                                       *
00018  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
00019  **************************************************************************/
00020 #include    <algebra/comematrix.h>
00021 #include        <algebra/comevector3d.h>
00022 #include        <algebra/comevertex3d.h>
00023 #include    <math.h>
00024 
00025 
00026 COME_Matrix::COME_Matrix( void ){
00027 
00028         // set the identity matrix
00029         data[0][1] = data[0][2] = data[0][3] =
00030         data[1][0] = data[1][2] = data[1][3] =
00031         data[2][0] = data[2][1] = data[2][3] =
00032         data[3][0] = data[3][1] = data[3][2] = 0.0;
00033         data[0][0] = data[1][1] = data[2][2] = data[3][3] = 1.0;
00034 
00035 }
00036 
00037 COME_Matrix::COME_Matrix( double fLines[] ){
00038 
00039         for( int l = 0; l < 4; l++ ){
00040                 for( int c = 0; c < 4; c++ ){
00041                         data[l][c] = fLines[l*4+c];
00042                 }
00043         }
00044 }
00045 
00046 COME_Matrix::COME_Matrix( double fm44[][4] ){
00047 
00048     for( int l = 0; l < 4; l++ ){
00049         for( int c = 0; c < 4; c++ ){
00050                 data[l][c] = fm44[l][c];
00051         }
00052     }
00053 }
00054 
00055 
00056 COME_Matrix::~COME_Matrix( void ){
00057         // do nothing
00058 }
00059 
00060 double
00061 COME_Matrix::getValueAt( int iL, int iC ) const{
00062 
00063         return data[iL][iC];
00064 }
00065 
00066 void
00067 COME_Matrix::setValueAt( int iL, int iC, double fValue ){
00068 
00069         data[iL][iC] = fValue;
00070 }
00071 
00072 void
00073 COME_Matrix::setMatrix( const COME_Matrix& matrixN ){
00074 
00075         for( int l = 0; l < 4; l++ ){
00076         for( int c = 0; c < 4; c++ ){
00077                 data[l][c] = matrixN.getValueAt( l, c );
00078         }
00079     }
00080 }
00081 
00082 const double**
00083 COME_Matrix::getMatrixD( void ){
00084 
00085         double **M;
00086         M = new double*[4];
00087 
00088   for( int l = 0; l < 4; l++ ){
00089         M[l] = new double[4];
00090         for( int c = 0; c < 4; c++ ){
00091         M[l][c] = data[c][l];
00092     }
00093   }
00094   return (const double**) M;
00095 
00096 }
00097 
00098 void
00099 COME_Matrix::getMatrixD( double **M ){
00100         
00101   for( int l = 0; l < 4; l++ ){
00102         for( int c = 0; c < 4; c++ ){
00103         M[l][c] = data[c][l];
00104     }
00105   }
00106 
00107 
00108 }
00109 
00110 double*
00111 COME_Matrix::getMatrixVD( void ){
00112 
00113         double *M = new double[16];
00114 
00115         for( int l = 0; l < 4; l++ ){
00116                 for( int c = 0; c < 4; c++ ){
00117                         M[l*4+c] = data[l][c];
00118                 }
00119         }
00120         return M;
00121 }
00122 
00123 
00124 // Calculate inverse matrix
00125 //
00126 //   -1
00127 
00128 //  A  =____1__ adjoint A
00129 //       det A
00130 //
00131 COME_Matrix
00132 COME_Matrix :: getInverse( void ){
00133 
00134         COME_Matrix Inv;
00135         double fDet;
00136 
00137         // calculate the adjoint matrix
00138         Inv = getAdjoint();
00139 
00140         // calculate the 4x4 determinent
00141         // if the determinent is zero, then the inverse matrix is not unique
00142         fDet = Inv.getDeterminent();
00143         if (fabs(fDet) < 0.0001){
00144                 printf("Non-singular matrix, no inverse!");
00145                 return Inv;
00146         }
00147         // scale the adjoint matrix to get the inverse
00148         Inv = Inv * ( 1/fDet );
00149         
00150         return Inv;
00151 }
00152 
00153 // Make the transposed matrix by changing columns and rows
00154 COME_Matrix
00155 COME_Matrix :: getTransposed( void ){
00156 
00157         double result [4][4];
00158 
00159         for( int l = 0; l < 4; l++ ){
00160                 for( int c = 0; c < 4; c++ ){
00161                         result[l][c] = data[c][l];
00162                 }
00163         }
00164         COME_Matrix trans( result );
00165         
00166         return trans;
00167 }
00168 
00169 
00170 // calculate the adjoint of a 4x4 matrix
00171 //
00172 // Let a  denote the minor determinant of matrix A obtained by
00173 //     ij
00174 // deleting the ith row and jth column from A.
00175 //             i+j
00176 // let b  = (-1)   a
00177 //     ij          ji
00178 // The matrix B = (b  ) is the adjoint of A
00179 //                  ij
00180 
00181 COME_Matrix
00182 COME_Matrix::getAdjoint(){
00183 
00184         COME_Matrix     A;
00185         double          a1, a2, a3, a4, b1, b2, b3, b4,
00186                         c1, c2, c3, c4, d1, d2, d3, d4;
00187 
00188         // Assign to individual variable names to aid selecting correct values
00189         a1 = data[0][0]; b1 = data[0][1];
00190         c1 = data[0][2]; d1 = data[0][3];
00191 
00192         a2 = data[1][0]; b2 = data[1][1];
00193         c2 = data[1][2]; d2 = data[1][3];
00194 
00195         a3 = data[2][0]; b3 = data[2][1];
00196         c3 = data[2][2]; d3 = data[2][3];
00197 
00198         a4 = data[3][0]; b4 = data[3][1];
00199         c4 = data[3][2]; d4 = data[3][3];
00200 
00201         // Row column labeling reversed since we transpose rows & columns
00202         A.setValueAt( 0, 0,  getDet33(b2, b3, b4, c2, c3, c4, d2, d3, d4) );
00203         A.setValueAt( 1, 0, -getDet33(a2, a3, a4, c2, c3, c4, d2, d3, d4) );
00204         A.setValueAt( 2, 0,  getDet33(a2, a3, a4, b2, b3, b4, d2, d3, d4) );
00205         A.setValueAt( 3, 0, -getDet33(a2, a3, a4, b2, b3, b4, c2, c3, c4) );
00206 
00207         A.setValueAt( 0, 1, -getDet33(b1, b3, b4, c1, c3, c4, d1, d3, d4) );
00208         A.setValueAt( 1, 1,  getDet33(a1, a3, a4, c1, c3, c4, d1, d3, d4) );
00209         A.setValueAt( 2, 1, -getDet33(a1, a3, a4, b1, b3, b4, d1, d3, d4) );
00210         A.setValueAt( 3, 1,  getDet33(a1, a3, a4, b1, b3, b4, c1, c3, c4) );
00211 
00212         A.setValueAt( 0, 2,  getDet33(b1, b2, b4, c1, c2, c4, d1, d2, d4) );
00213         A.setValueAt( 1, 2, -getDet33(a1, a2, a4, c1, c2, c4, d1, d2, d4) );
00214         A.setValueAt( 2, 2,  getDet33(a1, a2, a4, b1, b2, b4, d1, d2, d4) );
00215         A.setValueAt( 3, 2, -getDet33(a1, a2, a4, b1, b2, b4, c1, c2, c4) );
00216 
00217         A.setValueAt( 0, 3, -getDet33(b1, b2, b3, c1, c2, c3, d1, d2, d3) );
00218         A.setValueAt( 1, 3,  getDet33(a1, a2, a3, c1, c2, c3, d1, d2, d3) );
00219         A.setValueAt( 2, 3, -getDet33(a1, a2, a3, b1, b2, b3, d1, d2, d3) );
00220         A.setValueAt( 3, 3,  getDet33(a1, a2, a3, b1, b2, b3, c1, c2, c3) );
00221 
00222         return A;
00223 }
00224 
00225 
00226 // calculate the determinent of a 4x4 matrix
00227 double
00228 COME_Matrix::getDeterminent( void ){
00229 
00230         double ans, a1, a2, a3, a4, b1, b2, b3, b4, c1, c2, c3, c4, d1, d2, d3, d4;
00231 
00232 
00233         // assign to individual variable names to aid selecting correct elements
00234         a1 = data[0][0]; b1 = data[0][1];
00235         c1 = data[0][2]; d1 = data[0][3];
00236 
00237         a2 = data[1][0]; b2 = data[1][1];
00238         c2 = data[1][2]; d2 = data[1][3];
00239 
00240         a3 = data[2][0]; b3 = data[2][1];
00241         c3 = data[2][2]; d3 = data[2][3];
00242 
00243         a4 = data[3][0]; b4 = data[3][1];
00244         c4 = data[3][2]; d4 = data[3][3];
00245 
00246         ans =   a1 * getDet33(b2, b3, b4, c2, c3, c4, d2, d3, d4) -
00247                 b1 * getDet33(a2, a3, a4, c2, c3, c4, d2, d3, d4) +
00248                 c1 * getDet33(a2, a3, a4, b2, b3, b4, d2, d3, d4) -
00249                 d1 * getDet33(a2, a3, a4, b2, b3, b4, c2, c3, c4);
00250 
00251         return ans;
00252 }
00253 
00254 //
00255 // calcule the determinent of a 3x3 matrix in the form
00256 //
00257 //      | a1, b1, c1 |
00258 //      | a2, b2, c2 |
00259 //      | a3, b3, c3 |
00260 //
00261 double
00262 COME_Matrix::getDet33(double a1, double a2, double a3, double b1, double b2, double b3,
00263 double c1, double c2, double c3){
00264 
00265         double ans;
00266         double aux1, aux2, aux3;
00267 
00268         aux1 = getDet22(b2, b3, c2, c3);
00269         aux2 = getDet22(a2, a3, c2, c3);
00270         aux3 = getDet22(a2, a3, b2, b3);
00271         ans = a1 * aux1 - b1 * aux2 + c1 * aux3;
00272 
00273         return ans;
00274 }
00275 
00276 
00277 //
00278 // calculate the determinent of a 2x2 matrix
00279 //
00280 double
00281 COME_Matrix::getDet22(double a, double b, double c, double d){
00282 
00283         return (a * d - b * c);
00284 }
00285 
00286 
00288 // Return the result of x.T
00289 //
00290 COME_Matrix*
00291 COME_Matrix::multiplyScalar( double x ){
00292 
00293         COME_Matrix *M = new COME_Matrix();
00294 
00295         for( int l = 0; l < 4; l++ ){
00296                 for( int c = 0; c < 4; c++ ){
00297                         M->setValueAt( l, c, x * data[l][c] );
00298                 }
00299         }
00300         return M;
00301 }
00302 
00304 // Return the result of T.B
00305 // POTENTIAL BUG: Allocating matrix that can be never released
00306 //
00307 COME_Matrix*
00308 COME_Matrix::multiply( COME_Matrix B ){
00309 
00310         COME_Matrix *M = new COME_Matrix();
00311 
00312         M->setValueAt( 0, 0,    data[0][0]*B.getValueAt( 0, 0 )+
00313                                 data[0][1]*B.getValueAt( 1, 0 )+
00314                                 data[0][2]*B.getValueAt( 2, 0 )+
00315                                 data[0][3]*B.getValueAt( 3, 0 ) );
00316         M->setValueAt( 0, 1,    data[0][0]*B.getValueAt( 0, 1 )+
00317                                 data[0][1]*B.getValueAt( 1, 1 )+
00318                                 data[0][2]*B.getValueAt( 2, 1 )+
00319                                 data[0][3]*B.getValueAt( 3, 1 ) );
00320         M->setValueAt( 0, 2,    data[0][0]*B.getValueAt( 0, 2 )+
00321                                 data[0][1]*B.getValueAt( 1, 2 )+
00322                                 data[0][2]*B.getValueAt( 2, 2 )+
00323                                 data[0][3]*B.getValueAt( 3, 2 ) );
00324         M->setValueAt( 0, 3,    data[0][0]*B.getValueAt( 0, 3 )+
00325                                 data[0][1]*B.getValueAt( 1, 3 )+
00326                                 data[0][2]*B.getValueAt( 2, 3 )+
00327                                 data[0][3]*B.getValueAt( 3, 3 ) );
00328 
00329         M->setValueAt( 1, 0,    data[1][0]*B.getValueAt( 0, 0 )+
00330                                 data[1][1]*B.getValueAt( 1, 0 )+
00331                                 data[1][2]*B.getValueAt( 2, 0 )+
00332                                 data[1][3]*B.getValueAt( 3, 0 ) );
00333         M->setValueAt( 1, 1,    data[1][0]*B.getValueAt( 0, 1 )+
00334                                 data[1][1]*B.getValueAt( 1, 1 )+
00335                                 data[1][2]*B.getValueAt( 2, 1 )+
00336                                 data[1][3]*B.getValueAt( 3, 1 ) );
00337         M->setValueAt( 1, 2,    data[1][0]*B.getValueAt( 0, 2 )+
00338                                 data[1][1]*B.getValueAt( 1, 2 )+
00339                                 data[1][2]*B.getValueAt( 2, 2 )+
00340                                 data[1][3]*B.getValueAt( 3, 2 ) );
00341         M->setValueAt( 1, 3,    data[1][0]*B.getValueAt( 0, 3 )+
00342                                 data[1][1]*B.getValueAt( 1, 3 )+
00343                                 data[1][2]*B.getValueAt( 2, 3 )+
00344                                 data[1][3]*B.getValueAt( 3, 3 ) );
00345 
00346         M->setValueAt( 2, 0,    data[2][0]*B.getValueAt( 0, 0 )+
00347                                 data[2][1]*B.getValueAt( 1, 0 )+
00348                                 data[2][2]*B.getValueAt( 2, 0 )+
00349                                 data[2][3]*B.getValueAt( 3, 0 ) );
00350         M->setValueAt( 2, 1,    data[2][0]*B.getValueAt( 0, 1 )+
00351                                 data[2][1]*B.getValueAt( 1, 1 )+
00352                                 data[2][2]*B.getValueAt( 2, 1 )+
00353                                 data[2][3]*B.getValueAt( 3, 1 ) );
00354         M->setValueAt( 2, 2,    data[2][0]*B.getValueAt( 0, 2 )+
00355                                 data[2][1]*B.getValueAt( 1, 2 )+
00356                                 data[2][2]*B.getValueAt( 2, 2 )+
00357                                 data[2][3]*B.getValueAt( 3, 2 ) );
00358         M->setValueAt( 2, 3,    data[2][0]*B.getValueAt( 0, 3 )+
00359                                 data[2][1]*B.getValueAt( 1, 3 )+
00360                                 data[2][2]*B.getValueAt( 2, 3 )+
00361                                 data[2][3]*B.getValueAt( 3, 3 ) );
00362 
00363         M->setValueAt( 3, 0,    data[3][0]*B.getValueAt( 0, 0 )+
00364                                 data[3][1]*B.getValueAt( 1, 0 )+
00365                                 data[3][2]*B.getValueAt( 2, 0 )+
00366                                 data[3][3]*B.getValueAt( 3, 0 ) );
00367         M->setValueAt( 3, 1,    data[3][0]*B.getValueAt( 0, 1 )+
00368                                 data[3][1]*B.getValueAt( 1, 1 )+
00369                                 data[3][2]*B.getValueAt( 2, 1 )+
00370                                 data[3][3]*B.getValueAt( 3, 1 ) );
00371         M->setValueAt( 3, 2,    data[3][0]*B.getValueAt( 0, 2 )+
00372                                 data[3][1]*B.getValueAt( 1, 2 )+
00373                                 data[3][2]*B.getValueAt( 2, 2 )+
00374                                 data[3][3]*B.getValueAt( 3, 2 ) );
00375         M->setValueAt( 3, 3,    data[3][0]*B.getValueAt( 0, 3 )+
00376                                 data[3][1]*B.getValueAt( 1, 3 )+
00377                                 data[3][2]*B.getValueAt( 2, 3 )+
00378                                 data[3][3]*B.getValueAt( 3, 3 ) );
00379 
00380         return M;
00381 }
00382 
00383 COME_Matrix*
00384 COME_Matrix::subtract( COME_Matrix B ){
00385 
00386         COME_Matrix *M = new COME_Matrix();
00387 
00388         for( int l = 0; l < 4; l++ ){
00389                 for( int c = 0; c < 4; c++ ){
00390                         M->setValueAt( l, c,
00391                                         data[l][c] - B.getValueAt( l, c ) );
00392                 }
00393         }
00394         return M;
00395 }
00396 
00397 COME_Matrix*
00398 COME_Matrix::add( COME_Matrix B ){
00399 
00400         COME_Matrix *M = new COME_Matrix();
00401 
00402         for( int l = 0; l < 4; l++ ){
00403                 for( int c = 0; c < 4; c++ ){
00404                         M->setValueAt( l, c,
00405                                         data[l][c] + B.getValueAt( l, c ) );
00406                 }
00407         }
00408         return M;
00409 }
00410 
00411 COME_Point3D*
00412 COME_Matrix::multiply( COME_Point3D p ){
00413 
00414         COME_Point3D *temp = new COME_Point3D();
00415         double x,y,z,w;
00416 
00417         w =     data[3][0] * p.getX() + data[3][1] * p.getY() +
00418                 data[3][2] * p.getZ() + data[3][3] * 1;
00419         x =     (data[0][0] * p.getX() + data[0][1] * p.getY() +
00420                 data[0][2] * p.getZ() + data[0][3] * 1)/w;
00421         y =     (data[1][0] * p.getX() + data[1][1] * p.getY() +
00422                 data[1][2] * p.getZ() + data[1][3] * 1)/w;
00423         z =     (data[2][0] * p.getX() + data[2][1] * p.getY() +
00424                 data[2][2] * p.getZ() + data[2][3] * 1)/w;
00425 
00426         temp->setXYZ(x,y,z);
00427 
00428         return temp;
00429 }
00430 
00431 void
00432 COME_Matrix::reset(){
00433 
00434         for( int l = 0; l < 4; l++ ){
00435                 for( int c = 0; c < 4; c++ ){
00436                         data[l][c] = 0.0;
00437                 }
00438         }
00439 }
00440 
00441 COME_Matrix&
00442 COME_Matrix :: operator+= ( const COME_Matrix& mO ) {
00443 
00444         for( int l = 0; l < 4; l++ ){
00445         for( int c = 0; c < 4; c++ ){
00446                 data[l][c] += mO.getValueAt( l, c );
00447         }
00448     }
00449         return *this ;
00450 }
00451 
00452 COME_Matrix
00453 COME_Matrix :: operator+ ( const COME_Matrix& mO ) {
00454 
00455         double result [4][4];
00456 
00457         for( int l = 0; l < 4; l++ ){
00458         for( int c = 0; c < 4; c++ ){
00459                 result[l][c] = data[l][c] + mO.getValueAt( l, c );
00460         }
00461     }
00462         COME_Matrix resultM( result );
00463         return resultM;
00464 }
00465 
00466 COME_Matrix
00467 COME_Matrix :: operator* ( double scalar ) {
00468 
00469         double result [4][4];
00470 
00471         for( int l = 0; l < 4; l++ ){
00472         for( int c = 0; c < 4; c++ ){
00473                 result[l][c] = data[l][c] * scalar;
00474         }
00475     }
00476         COME_Matrix resultM( result );
00477         return resultM;
00478 }
00479 
00480 COME_Matrix
00481 COME_Matrix :: operator* ( const COME_Matrix& mO ) {
00482 
00483         
00484         double result [4][4];
00485 
00486         result[0][0] =  data[0][0]*mO.getValueAt( 0, 0 )+
00487                                 data[0][1]*mO.getValueAt( 1, 0 )+
00488                                 data[0][2]*mO.getValueAt( 2, 0 )+
00489                                 data[0][3]*mO.getValueAt( 3, 0 );
00490         result[0][1] =  data[0][0]*mO.getValueAt( 0, 1 )+
00491                                 data[0][1]*mO.getValueAt( 1, 1 )+
00492                                 data[0][2]*mO.getValueAt( 2, 1 )+
00493                                 data[0][3]*mO.getValueAt( 3, 1 );
00494         result[0][2] =  data[0][0]*mO.getValueAt( 0, 2 )+
00495                                 data[0][1]*mO.getValueAt( 1, 2 )+
00496                                 data[0][2]*mO.getValueAt( 2, 2 )+
00497                                 data[0][3]*mO.getValueAt( 3, 2 );
00498         result[0][3] =  data[0][0]*mO.getValueAt( 0, 3 )+
00499                                 data[0][1]*mO.getValueAt( 1, 3 )+
00500                                 data[0][2]*mO.getValueAt( 2, 3 )+
00501                                 data[0][3]*mO.getValueAt( 3, 3 );
00502 
00503         result[1][0] =  data[1][0]*mO.getValueAt( 0, 0 )+
00504                                 data[1][1]*mO.getValueAt( 1, 0 )+
00505                                 data[1][2]*mO.getValueAt( 2, 0 )+
00506                                 data[1][3]*mO.getValueAt( 3, 0 );
00507         result[1][1] =  data[1][0]*mO.getValueAt( 0, 1 )+
00508                                 data[1][1]*mO.getValueAt( 1, 1 )+
00509                                 data[1][2]*mO.getValueAt( 2, 1 )+
00510                                 data[1][3]*mO.getValueAt( 3, 1 );
00511         result[1][2] =  data[1][0]*mO.getValueAt( 0, 2 )+
00512                                 data[1][1]*mO.getValueAt( 1, 2 )+
00513                                 data[1][2]*mO.getValueAt( 2, 2 )+
00514                                 data[1][3]*mO.getValueAt( 3, 2 );
00515         result[1][3] =  data[1][0]*mO.getValueAt( 0, 3 )+
00516                                 data[1][1]*mO.getValueAt( 1, 3 )+
00517                                 data[1][2]*mO.getValueAt( 2, 3 )+
00518                                 data[1][3]*mO.getValueAt( 3, 3 );
00519 
00520         result[2][0] =  data[2][0]*mO.getValueAt( 0, 0 )+
00521                                 data[2][1]*mO.getValueAt( 1, 0 )+
00522                                 data[2][2]*mO.getValueAt( 2, 0 )+
00523                                 data[2][3]*mO.getValueAt( 3, 0 );
00524         result[2][1] =  data[2][0]*mO.getValueAt( 0, 1 )+
00525                                 data[2][1]*mO.getValueAt( 1, 1 )+
00526                                 data[2][2]*mO.getValueAt( 2, 1 )+
00527                                 data[2][3]*mO.getValueAt( 3, 1 );
00528         result[2][2] =  data[2][0]*mO.getValueAt( 0, 2 )+
00529                                 data[2][1]*mO.getValueAt( 1, 2 )+
00530                                 data[2][2]*mO.getValueAt( 2, 2 )+
00531                                 data[2][3]*mO.getValueAt( 3, 2 );
00532         result[2][3] =  data[2][0]*mO.getValueAt( 0, 3 )+
00533                                 data[2][1]*mO.getValueAt( 1, 3 )+
00534                                 data[2][2]*mO.getValueAt( 2, 3 )+
00535                                 data[2][3]*mO.getValueAt( 3, 3 );
00536 
00537         result[3][0] =  data[3][0]*mO.getValueAt( 0, 0 )+
00538                                 data[3][1]*mO.getValueAt( 1, 0 )+
00539                                 data[3][2]*mO.getValueAt( 2, 0 )+
00540                                 data[3][3]*mO.getValueAt( 3, 0 );
00541         result[3][1] =  data[3][0]*mO.getValueAt( 0, 1 )+
00542                                 data[3][1]*mO.getValueAt( 1, 1 )+
00543                                 data[3][2]*mO.getValueAt( 2, 1 )+
00544                                 data[3][3]*mO.getValueAt( 3, 1 );
00545         result[3][2] =  data[3][0]*mO.getValueAt( 0, 2 )+
00546                                 data[3][1]*mO.getValueAt( 1, 2 )+
00547                                 data[3][2]*mO.getValueAt( 2, 2 )+
00548                                 data[3][3]*mO.getValueAt( 3, 2 );
00549         result[3][3] =  data[3][0]*mO.getValueAt( 0, 3 )+
00550                                 data[3][1]*mO.getValueAt( 1, 3 )+
00551                                 data[3][2]*mO.getValueAt( 2, 3 )+
00552                                 data[3][3]*mO.getValueAt( 3, 3 );
00553         
00554         COME_Matrix resultM( result );
00555         return resultM;
00556 }
00557 
00558 COME_Vector3D
00559 COME_Matrix :: operator* ( COME_Vector3D& vO ){
00560         
00561         double x,y,z;
00562 
00563         /*x =   data[0][0] * vO.getX() + data[0][1] * vO.getY() + data[0][2] * vO.getZ() + data[0][3];
00564         y =     data[1][0] * vO.getX() + data[1][1] * vO.getY() + data[1][2] * vO.getZ() + data[1][3];
00565         z =     data[2][0] * vO.getX() + data[2][1] * vO.getY() + data[2][2] * vO.getZ() + data[2][3];*/
00566 
00567         x =     (data[0][0] * vO.getX() + data[1][0] * vO.getY() + data[2][0] * vO.getZ() + data[3][0] * 1);
00568         y =     (data[0][1] * vO.getX() + data[1][1] * vO.getY() + data[2][1] * vO.getZ() + data[3][1] * 1);
00569         z =     (data[0][2] * vO.getX() + data[1][2] * vO.getY() + data[2][2] * vO.getZ() + data[3][2] * 1);
00570         
00571         COME_Vector3D resultV( x, y, z );
00572         return resultV;
00573 }
00574 
00575 COME_Point3D
00576 COME_Matrix :: operator* ( const COME_Point3D& pO ) {
00577         
00578         double x,y,z;
00579 
00580         /*w =   data[3][0] * pO.getX() + data[3][1] * pO.getY() + data[3][2] * pO.getZ() + data[3][3] * 1;
00581         x =     (data[0][0] * pO.getX() + data[0][1] * pO.getY() + data[0][2] * pO.getZ() + data[0][3] * 1)/w;
00582         y =     (data[1][0] * pO.getX() + data[1][1] * pO.getY() + data[1][2] * pO.getZ() + data[1][3] * 1)/w;
00583         z =     (data[2][0] * pO.getX() + data[2][1] * pO.getY() + data[2][2] * pO.getZ() + data[2][3] * 1)/w;*/
00584 
00585         x =     (data[0][0] * pO.getX() + data[1][0] * pO.getY() + data[2][0] * pO.getZ() + data[3][0] * 1);
00586         y =     (data[0][1] * pO.getX() + data[1][1] * pO.getY() + data[2][1] * pO.getZ() + data[3][1] * 1);
00587         z =     (data[0][2] * pO.getX() + data[1][2] * pO.getY() + data[2][2] * pO.getZ() + data[3][2] * 1);
00588         
00589         COME_Point3D resultP( x, y, z );
00590         return resultP;
00591 }
00592 
00593 COME_Vertex3D
00594 COME_Matrix :: operator* ( const COME_Vertex3D& vO ) {
00595         
00596         double x,y,z;
00597 
00598         /*w =   data[3][0] * vO.getX() + data[3][1] * vO.getY() + data[3][2] * vO.getZ() + data[3][3] * 1;
00599         x =     (data[0][0] * vO.getX() + data[0][1] * vO.getY() + data[0][2] * vO.getZ() + data[0][3] * 1)/w;
00600         y =     (data[1][0] * vO.getX() + data[1][1] * vO.getY() + data[1][2] * vO.getZ() + data[1][3] * 1)/w;
00601         z =     (data[2][0] * vO.getX() + data[2][1] * vO.getY() + data[2][2] * vO.getZ() + data[2][3] * 1)/w;*/
00602 
00603         x =     (data[0][0] * vO.getX() + data[1][0] * vO.getY() + data[2][0] * vO.getZ() + data[3][0] * 1);
00604         y =     (data[0][1] * vO.getX() + data[1][1] * vO.getY() + data[2][1] * vO.getZ() + data[3][1] * 1);
00605         z =     (data[0][2] * vO.getX() + data[1][2] * vO.getY() + data[2][2] * vO.getZ() + data[3][2] * 1);
00606         
00607         COME_Vertex3D resultV( x, y, z );
00608         return resultV;
00609 }

Generated on Thu Dec 1 10:13:34 2005 for COME - Biomechanical Joint Model by  doxygen 1.4.5