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 #include <QV3DPointF>
00032
00033 class QVMatrix;
00034
00044 class QVQuaternion: public QVVector
00045 {
00046 public:
00048
00049
00053 QVQuaternion();
00054
00061 QVQuaternion(const QVVector direction, const double phi);
00062
00068 QVQuaternion(const QVVector &source):QVVector(source) { Q_ASSERT(norm2() > 0); };
00069
00076 QVQuaternion(const QVVector direction, float phi);
00077
00086 QVQuaternion(const double i, const double j, const double k, const double r);
00087
00094 QVQuaternion(const double xAngle, const double yAngle, const double zAngle);
00095
00101 QVQuaternion(const QVMatrix &matrix);
00102
00107 QVQuaternion operator*(const QVQuaternion &quaternion) const { return quaternionProduct(quaternion); };
00108
00114 QVQuaternion(const QVQuaternion &quaternion): QVVector(quaternion) { }
00115
00126 static QVQuaternion trackball(float p1x, float p1y, float p2x, float p2y);
00127
00135 QVQuaternion quaternionProduct(const QVQuaternion &quaternion) const;
00136
00142 void toEulerAngles(double &xAngle, double &yAngle, double &zAngle) const;
00143
00147 QVMatrix toRotationMatrix() const;
00148
00152 QVQuaternion conjugate() const;
00153
00157 QVQuaternion inverse() const;
00158
00162 double norm2() const;
00163
00169 QV3DPointF rotate(const QV3DPointF &v) const;
00170
00172 inline double &real() { return operator[](3); }
00173
00175 inline double &i() { return operator[](0); }
00176
00178 inline double &j() { return operator[](1); }
00179
00181 inline double &k() { return operator[](2); }
00182
00184 inline double real() const { return operator[](3); }
00185
00187 inline double i() const { return operator[](0); }
00188
00190 inline double j() const { return operator[](1); }
00191
00193 inline double k() const { return operator[](2); }
00194
00196 QVQuaternion normalizeQuaternion() const;
00197 };
00198
00199 std::ostream& operator << ( std::ostream &os, const QVQuaternion &quaternion );
00200
00201 #endif
00202