00001
00014 #ifndef _DLR_QUATERNION_H_
00015 #define _DLR_QUATERNION_H_
00016
00017 namespace dlr {
00018
00019 namespace numeric {
00020
00033 class Quaternion {
00034 public:
00035
00040 Quaternion()
00041 : m_s(1.0), m_i(0.0), m_j(0.0), m_k(0.0), m_isNormalized(true) {}
00042
00063 Quaternion(double s, double i, double j, double k,
00064 bool isNormalized=false)
00065 : m_s(s), m_i(i), m_j(j), m_k(k), m_isNormalized(isNormalized) {}
00066
00073 Quaternion(const Quaternion &source) :
00074 m_s(source.m_s), m_i(source.m_i), m_j(source.m_j), m_k(source.m_k),
00075 m_isNormalized(source.m_isNormalized) {}
00076
00080 virtual
00081 inline
00082 ~Quaternion() {}
00083
00091 inline
00092 double
00093 s() const { return m_s; };
00094
00102 inline
00103 double
00104 i() const { return m_i; };
00105
00113 inline
00114 double
00115 j() const { return m_j; };
00116
00124 inline
00125 double
00126 k() const { return m_k; };
00127
00144 inline
00145 void
00146 setValue(double s, double i, double j, double k) {
00147 m_s = s; m_i = i; m_j = j; m_k = k; m_isNormalized = false;
00148 }
00149
00157 void
00158 normalize();
00159
00167 inline
00168 Quaternion&
00169 operator=(const Quaternion &source) {
00170 setValue(source.m_s, source.m_i, source.m_j, source.m_k);
00171 m_isNormalized = source.m_isNormalized;
00172 return *this;
00173 }
00174
00175 private:
00176
00177 double m_s;
00178 double m_i;
00179 double m_j;
00180 double m_k;
00181
00182
00183 bool m_isNormalized;
00184 };
00185
00186
00187
00202 inline
00203 Quaternion
00204 conjugate(const Quaternion& source) {
00205 return Quaternion(source.s(), -(source.i()), -(source.j()), -(source.k()));
00206 }
00207
00208 }
00209
00210 }
00211
00212
00213
00214
00215 namespace dlr {
00216
00217 using numeric::Quaternion;
00218
00219 }
00220
00221 #endif // #ifndef _DLR_QUATERNION_H_