00001
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #ifndef eman__quaternion_h__
00037 #define eman__quaternion_h__ 1
00038
00039 #include "vec3.h"
00040
00041 namespace EMAN
00042 {
00065 class Quaternion
00066 {
00067 public:
00068 Quaternion();
00069 Quaternion(float e0, float e1, float e2, float e3);
00070 Quaternion(float radians, const Vec3f &axis);
00071 Quaternion(const Vec3f &axis, float radians);
00072 explicit Quaternion(const vector<float> & matrix3);
00073
00074 ~Quaternion()
00075 {
00076 }
00077
00078 float norm() const
00079 {
00080 return (e0 * e0 + e1 * e1 + e2 * e2 + e3 * e3);
00081 }
00082
00083 Quaternion conj() const
00084 {
00085 return (Quaternion(e0, -e1, -e2, -e3));
00086 }
00087
00088 float abs() const
00089 {
00090 return sqrt(norm());
00091 }
00092
00093 void normalize();
00094 Quaternion & inverse();
00095 Quaternion create_inverse() const;
00096
00097 Vec3f rotate(const Vec3f &v) const;
00098
00099 float to_angle() const;
00100 Vec3f to_axis() const;
00101
00102 vector<float> to_matrix3() const;
00103
00104 float real() const;
00105 Vec3f unreal() const;
00106
00107 vector < float > as_list() const;
00108
00109 Quaternion & operator+=(const Quaternion & q);
00110 Quaternion & operator-=(const Quaternion & q);
00111 Quaternion & operator*=(const Quaternion & q);
00112 Quaternion & operator*=(float s);
00113 Quaternion & operator/=(const Quaternion & q);
00114 Quaternion & operator/=(float s);
00115
00116 static Quaternion interpolate(const Quaternion & from, const Quaternion & to,
00117 float percent);
00118 private:
00119 float e0;
00120 float e1;
00121 float e2;
00122 float e3;
00123 };
00124
00125 Quaternion operator+(const Quaternion & q1, const Quaternion & q2);
00126 Quaternion operator-(const Quaternion & q1, const Quaternion & q2);
00127
00128 Quaternion operator*(const Quaternion & q1, const Quaternion & q2);
00129 Quaternion operator*(const Quaternion & q, float s);
00130 Quaternion operator*(float s, const Quaternion & q);
00131 Quaternion operator/(const Quaternion & q1, const Quaternion & q2);
00132
00133 bool operator==(const Quaternion & q1, const Quaternion & q2);
00134 bool operator!=(const Quaternion & q1, const Quaternion & q2);
00135 }
00136
00137 #endif //eman__quaternion_h__