00001 #include "Frame.h"
00002 #include "assertions.h"
00003
00004 #include "ConstrainedVertex.h"
00005
00006 namespace animal
00007 {
00008 namespace octree
00009 {
00010
00011 Frame::Frame() :
00012 _frame(3)
00013 {
00014 _matrix.resize(4,4);
00015 _invMatrix.resize(4,4);
00016 }
00017
00018 Frame::Frame( const Vec3d origin, const Vec3d u, const Vec3d v, const Vec3d w ) :
00019 _frame(3), _origin(origin), _invMatrixComputed(false)
00020 {
00021 _frame[0] = u;
00022 _frame[1] = v;
00023 _frame[2] = w;
00024
00025 _matrix.resize(4,4);
00026 _invMatrix.resize(4,4);
00027
00028 for( unsigned short i=0 ; i<3 ; ++i )
00029 for( unsigned short j=0 ; j<3 ; ++j )
00030 _matrix[i][j] = this->getVector(j)[i];
00031
00032 for( unsigned short i=0 ; i<3 ; ++i )
00033 _matrix[i][3] = this->getOrigin()[i];
00034
00035 _matrix[3][0] = 0; _matrix[3][1] = 0; _matrix[3][2] = 0; _matrix[3][3] = 1;
00036 }
00037
00038 Frame::~Frame()
00039 {}
00040
00041 void Frame::setVector( unsigned int i, Vec3d v )
00042 {
00043 _frame[i] = v;
00044
00045 for( unsigned short j=0 ; j<3 ; ++j )
00046 _matrix[j][i] = v[j];
00047 }
00048
00049 void Frame::setOrigin( Vec3d v )
00050 {
00051 _origin = v;
00052 for( unsigned short i=0 ; i<3 ; ++i )
00053 _matrix[i][3] = this->getOrigin()[i];
00054 }
00055
00056
00057 Vec3d Frame::getVector( unsigned int i ) const
00058 {
00059 Require( i < 3 );
00060 return _frame[i];
00061 }
00062 Vec3d Frame::operator[]( unsigned int i ) const
00063 {
00064 return getVector(i);
00065 }
00066
00067 Vec3d Frame::computePosition( Vec3d params, Vec3d scaling ) const
00068 {
00069
00070
00071
00072
00073
00074 return (getOrigin() + scaling[0]*params[0]*getVector(0) + scaling[1]*params[1]*getVector(1) + scaling[2]*params[2]*getVector(2) );
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092 }
00093
00094 Vec3d Frame::getLocalCoordinates( Vec3d Q )
00095 {
00096 if( !_invMatrixComputed )
00097 {
00098 _invMatrix = getMatrixInverse( _matrix );
00099 _invMatrixComputed = true;
00100 }
00101
00102 HVec res(4);
00103 v_eq_Ab( res, _invMatrix, Vec3dToHVec(Q) );
00104 return HVecToVec3d( res );
00105 }
00106
00107 }
00108 }