Biomechanical Joint Model
 Author: Anderson Maciel

hmat.cpp

Go to the documentation of this file.
00001 #include "hmat.h"
00002 
00003 
00004 namespace LinAlg{
00005 
00006   VEC HMAT::operator*(const VEC &V) const
00007   {
00008     assert (V.dim()==3);
00009     static VEC tmp(4, 1);
00010     tmp.insert(V);
00011     return this->MAT::operator*(tmp);
00012   }
00013   
00014   void HMAT::makeVecRotVec(HMAT &mat, const VEC &v0, const VEC &v1)
00015   {
00016     static VEC absv0(3), leastCoordAxis(3);
00017     
00018     REAL cosTheta = dot_prod(v0, v1);
00019     VEC  axis = cross_prod(v0, v1);
00020     REAL sinTheta = axis.norm();
00021     
00022     if (fabs(sinTheta) > 1E-7)
00023       {
00024         axis /= sinTheta;
00025       }
00026     else if (cosTheta < 0.0)
00027       {
00028         absv0 = v0; abs(absv0);
00029         leastCoordAxis = 0;
00030         leastCoordAxis[absv0[0]<=absv0[1] ? absv0[0]<=absv0[2] ? 0 : 2
00031                       : absv0[1]<=absv0[2] ? 1 : 2] = 1;
00032         axis = cross_prod(v0, leastCoordAxis);
00033         axis.normalize();
00034       }
00035     else
00036       {
00037         mat.setIdt();
00038         return;
00039       }
00040     
00041     REAL x = axis[0];
00042     REAL y = axis[1];
00043     REAL z = axis[2];
00044     
00045     REAL t = 1.0f - cosTheta;
00046     
00047     mat(0,3) = 0.0; // zero translation
00048     mat(1,3) = 0.0;
00049     mat(2,3) = 0.0;
00050     mat(0,0) = t * x * x + cosTheta;
00051     mat(1,0) = t * x * y + sinTheta * z;
00052     mat(2,0) = t * x * z - sinTheta * y;
00053     mat(0,1) = t * y * x - sinTheta * z;
00054     mat(1,1) = t * y * y + cosTheta;
00055     mat(2,1) = t * y * z + sinTheta * x;
00056     mat(0,2) = t * z * x + sinTheta * y;
00057     mat(1,2) = t * z * y - sinTheta * x;
00058     mat(2,2) = t * z * z + cosTheta;
00059   }
00060 
00061 }

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