00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00024
00025 #ifndef QVQUATERNION_H
00026 #define QVQUATERNION_H
00027
00028 #include <math.h>
00029 #include <iostream>
00030 #include <QVVector>
00031
00032 class QVMatrix;
00033
00043 class QVQuaternion: public QVVector
00044 {
00045 public:
00047
00048
00052 QVQuaternion();
00053
00060 QVQuaternion(const QVVector direction, const double phi);
00061
00067 QVQuaternion(const QVVector &source):QVVector(source) { };
00068
00075 QVQuaternion(const QVVector direction, float phi);
00076
00085 QVQuaternion(const double i, const double j, const double k, const double r);
00086
00093 QVQuaternion(const double xAngle, const double yAngle, const double zAngle);
00094
00100 QVQuaternion(const QVMatrix &matrix);
00101
00106 QVQuaternion operator*(const QVQuaternion &quaternion) const { return quaternionProduct(quaternion); };
00107
00113 QVQuaternion(const QVQuaternion &quaternion): QVVector(quaternion) { }
00114
00125 static QVQuaternion trackball(float p1x, float p1y, float p2x, float p2y);
00126
00134 QVQuaternion quaternionProduct(const QVQuaternion &quaternion) const;
00135
00141 void toEulerAngles(double &xAngle, double &yAngle, double &zAngle) const;
00142
00146 QVMatrix toRotationMatrix() const;
00147
00151 QVQuaternion conjugate() const;
00152
00156 QVQuaternion inverse() const;
00157
00161 double norm2() const;
00162
00169 QVVector rotate(const QVVector &v) const;
00170
00171 private:
00172 QVQuaternion normalizeQuaternion() const;
00173 };
00174
00175 std::ostream& operator << ( std::ostream &os, const QVQuaternion &quaternion );
00176
00177 #endif
00178