00001 #ifndef animal_frame_h______________________________
00002 #define animal_frame_h______________________________
00003 
00004 
00005 namespace animal
00006 {
00007 
00014 
00018 template<class Vec1, class Basis, class Vec2>
00019 void v_eq_project_vec( Vec1& v, const Basis& b, const Vec2& a );
00020 
00024 template<class Basis1, class Basis2>
00025 void b_eq_inverse( Basis1& b, const Basis2& a );
00026 
00029 template<class Basis,class Real>
00030 void b_eq_eulerX( Basis& b, Real a );
00031 
00034 template<class Basis,class Real>
00035 void b_eq_eulerY( Basis& b, Real a );
00036 
00039 template<class Basis,class Real>
00040 void b_eq_eulerZ( Basis& b, Real a );
00041 
00042 
00046 template<class Basis,class Real>
00047 void b_eq_eulerXYZ( Basis& b, Real a, Real b, Real c );
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 
00066 
00067 
00068 
00069 
00070 
00071 
00072 
00073 
00074 template<class Vec1, class Frame, class Vec2>
00075 void v_eq_project_point( Vec1& v, const Frame& f, const Vec2& a );
00076 
00077 
00078 
00079 
00080 
00081 
00082 template<class Frame>
00083 void f_eq_inverse( Frame& f, const Frame& a );
00084 
00085 
00086 
00087 
00088 
00091 template<int N=3, class Real=float>
00092 struct Frame
00093 {
00094     typedef  Array<N,Real> Vec;     
00095     typedef Array< N,Vec > Basis; 
00096     
00098     Frame();
00099     
00101     Frame( const Basis& b, const Vec& t );
00102 
00103     Basis basis; 
00104     Vec displacement; 
00105 };
00106 
00108 template<class Basis, class Vec>
00109 const Vec& get_translation( const Frame<Basis,Vec>& f );
00110  
00112 template<class Basis, class Vec>
00113 Vec& set_translation( Frame<Basis,Vec>& f );
00114  
00116 template<class Basis, class Vec>
00117 const Basis& get_basis( const Frame<Basis,Vec>& f );
00118  
00120 template<class Basis, class Vec>
00121 Basis& set_basis( Frame<Basis,Vec>& f );
00122  
00126 }
00127 
00128 
00129 
00130 
00131 #endif