00001 #ifndef PHX_QUATERNION_H
00002 #define PHX_QUATERNION_H
00003
00004 #include <Phx/PhxConfig.h>
00005 #include <Phx/PhxTypes.h>
00006 #include <Phx/Util/PhxMatrix.h>
00007 #include <math.h>
00008
00009 namespace Phx {
00010
00011 class Quaternion {
00012 double mData[4];
00013
00014 public:
00015
00016 Quaternion() {
00017 mData[0] = 1;
00018 mData[1] = mData[2] = mData[3] = 0;
00019 }
00020
00021 Quaternion(double w, const Vector3& v) {
00022 mData[0] = w;
00023 mData[1] = v.element(0,0);
00024 mData[2] = v.element(1,0);
00025 mData[3] = v.element(2,0);
00026 }
00027
00028 Quaternion(const double* array) {
00029 if (!array) {
00030 std::clog << "Constructing quaternion from 0 array." << std::endl;
00031 throw RangeException();
00032 }
00033 for (uint32_t i = 0; i < 4; i++) {
00034 mData[i] = array[i];
00035 }
00036 }
00037
00038 Quaternion(double w, double x, double y, double z) {
00039 mData[0] = w;
00040 mData[1] = x;
00041 mData[2] = y;
00042 mData[3] = z;
00043 }
00044
00045 double x() const { return mData[1]; }
00046 double y() const { return mData[2]; }
00047 double z() const { return mData[3]; }
00048 double w() const { return real(); }
00049
00050 Vector3 complex() const { return Vector3(mData+1); }
00051 double real() const { return mData[0]; }
00052
00053
00054 Quaternion conjugate(void) const {
00055 return Quaternion(real(), -complex());
00056 }
00057
00068 Quaternion inverse(void) const {
00069 return conjugate() / norm();
00070 }
00071
00072
00073 Quaternion product(const Quaternion& rhs) const {
00074 return Quaternion();
00075 }
00076
00093 Quaternion operator*(const Quaternion& rhs) const {
00094 return product(rhs);
00095 }
00096
00103 Quaternion operator*(double s) const {
00104 return Quaternion(real()*s, complex()*s);
00105 }
00106
00113 Quaternion operator/(double s) const {
00114 if (s == 0) std::clog << "Dividing quaternion by 0." << std::endl;
00115 return Quaternion(real()/s, complex()/s);
00116 }
00117
00131 Matrix4 matrix() const {
00132 return Matrix4();
00133 }
00134
00135 Vector4 vector() const { return Vector4(mData); }
00136
00141 double norm() const { return sqrt(mData[0]*mData[0]+mData[1]*mData[1]+
00142 mData[2]*mData[2]+mData[3]*mData[3]); }
00143
00153 Matrix3 rotationMatrix() const {
00155 return Matrix3::identity();
00156 }
00157 };
00158
00159
00160 };
00161
00162
00163 #endif