home *** CD-ROM | disk | FTP | other *** search
/ Xentax forum attachments archive / xentax.7z / 4799 / source.7z / slEuler.h < prev    next >
Encoding:
C/C++ Source or Header  |  2011-09-18  |  2.3 KB  |  118 lines

  1. #ifndef __SL_EULER_H
  2. #define __SL_EULER_H
  3.  
  4. #include "slMathTraits.h"
  5. #include "slVector3D.h"
  6.  
  7. namespace sl {
  8.  
  9. template<class T>
  10. class euler_angle {
  11.  public :
  12.   static const unsigned int ZXY = 0;
  13.   static const unsigned int XYZ = 1;
  14.  private :
  15.   T data[3];
  16.  public :
  17.   inline const T& heading(void)const { return data[0]; }
  18.   inline const T& pitch(void)const { return data[1]; }
  19.   inline const T& bank(void)const { return data[2]; }
  20.   inline const T& roll(void)const { return data[2]; }
  21.  public :
  22.   bool from_vector(const vector3D<T>& v);
  23.   bool from_vector_lw(const vector3D<T>& v);
  24.  public :
  25.   inline T& operator [](int index) { return data[index]; }
  26.   inline const T& operator [](int index)const { return data[index]; }
  27.  public :
  28.   euler_angle& operator =(const euler_angle<T>& e);
  29.  public :
  30.   euler_angle();
  31.   euler_angle(const euler_angle& e);
  32.  ~euler_angle();
  33. };
  34.  
  35. template<class T>
  36. inline euler_angle<T>::euler_angle()
  37. {
  38. }
  39.  
  40. template<class T>
  41. inline euler_angle<T>::euler_angle(const euler_angle& e)
  42. {
  43.  data[0] = e.data[0];
  44.  data[1] = e.data[1];
  45.  data[2] = e.data[2];
  46. }
  47.  
  48. template<class T>
  49. inline euler_angle<T>::~euler_angle()
  50. {
  51. }
  52.  
  53. template<class T>
  54. inline euler_angle<T>& euler_angle<T>::operator =(const euler_angle<T>& e)
  55. {
  56.  if(this == &e) return *this;
  57.  data[0] = e.data[0];
  58.  data[1] = e.data[1];
  59.  data[2] = e.data[2];
  60.  return *this;
  61. }
  62.  
  63. template<class T>
  64. inline bool euler_angle<T>::from_vector(const vector3D<T>& v)
  65. {
  66.  // copy vector
  67.  T x = v[0];
  68.  T y = v[1];
  69.  T z = v[2];
  70.  
  71.  // copy and compute length
  72.  T denom = std::sqrt(x*x + y*y + z*z);
  73.  if(denom == 0) return false;
  74.  
  75.  // normalize vector
  76.  T scale = math_traits<T>::one()/denom;
  77.  x *= scale;
  78.  y *= scale;
  79.  z *= scale;
  80.  
  81.  // compute angles
  82.  data[0] = std::acos(-z);
  83.  data[1] = math_traits<T>::zero();
  84.  data[2] = atan2(-y, -x);
  85.  
  86.  return true;
  87. }
  88.  
  89. template<class T>
  90. inline bool euler_angle<T>::from_vector_lw(const vector3D<T>& v)
  91. {
  92.  // copy vector
  93.  T x = v[0];
  94.  T y = v[1];
  95.  T z = v[2];
  96.  
  97.  // copy and compute length
  98.  T denom = std::sqrt(x*x + y*y + z*z);
  99.  if(denom == 0) return false;
  100.  
  101.  // normalize vector
  102.  T scale = math_traits<T>::one()/denom;
  103.  x *= scale;
  104.  y *= scale;
  105.  z *= scale;
  106.  
  107.  // compute angles
  108.  data[0] = std::asin(x);
  109.  data[1] = std::atan2(-y, z);
  110.  data[2] = math_traits<T>::zero();
  111.  
  112.  return true;
  113. }
  114.  
  115. };
  116.  
  117. #endif
  118.