Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members | Related Pages

PhxQuaternion.h

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     // not implemented yet
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 }; // namespace Phx
00161 
00162 
00163 #endif /* PHX_QUATERNION_H */

Generated on Wed Dec 21 22:05:37 2005 for Phoenix OSFS by  doxygen 1.4.2