00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 #ifndef _QUATERNION_H_
00018 #define _QUATERNION_H_
00019 #include <assert.h>
00020 #include <limits>
00021 #include <iostream>
00022 #include "rotation_matrix.h"
00023 
00024 using namespace std;
00025 
00028 
00034 template <typename Base=double>
00035   struct _Quaternion : public _Vector<4, Base>
00036 {
00037   static const int Angles=3;
00038   static const int Dimension=3;
00039   _Quaternion();
00040   _Quaternion(Base x, Base y, Base z, Base w);
00041   _Quaternion(const _RotationMatrix3<Base>& m);
00042   _Quaternion(const _Vector<3, Base>& vec);
00043   _Quaternion(Base roll, Base pitch, Base yaw);
00044   _Quaternion<Base>& operator*=(const _Quaternion& q);
00045   _Quaternion<Base>  operator* (const _Quaternion& q) const;
00046   template <typename Base2>
00047   _Quaternion(const _Quaternion<Base2>& other);  
00048   _Vector<3, Base> operator*(const _Vector<3, Base>& v) const;
00049   inline _Quaternion<Base> inverse() const;
00050   inline _Vector<3, Base> angles() const;
00051 
00052   _RotationMatrix3<Base> rotationMatrix() const;
00053   _Quaternion<Base> normalized() const;
00054   
00055   
00056   _Quaternion<Base>& normalize();
00057   Base  angle() const;
00058   static inline _Quaternion<Base> slerp(const _Quaternion<Base>& from, const _Quaternion<Base>& to, Base lambda);
00059  protected:
00060   _Quaternion(const _Vector<4, Base>& v);
00061 };
00062 
00063 typedef _Quaternion<double> Quaternion;
00064 typedef _Quaternion<float>  Quaternionf;
00065 
00067 
00068 #include "quaternion.hpp"
00069 
00070  
00071 #endif