#ifndef QUAT_H #define QUAT_H #include #include #include const float D2R = M_PI/180.; class Rotate; class Point; class Quat { friend Quat operator+( const Quat&, const Quat& ); friend Quat operator-( const Quat& ); friend Quat operator*( const Quat&, const Quat& ); friend Quat operator*( float, const Quat& ); friend Quat operator*( const Quat&, float ); friend Rotate Slerp( float, const Quat&, const Quat& ); public: float s; // scalar portion = cos( theta/2 ) float vx, vy, vz; // vector portion = sin( theta/2 ) * axis of rotation float mat[4][4]; // [M]*{p} -> {p'} 4x4 matrix float tpose[4][4]; // transpose of mat[][], suitable for glMultMatrixf() char str[128]; // toString() buffer Quat( float s=0., float vx=0., float vy=0., float vz=0. ); void setIdentity(); char * toString(); void unitize(); }; class Rotate : public Quat { friend int operator==( Rotate&, Rotate& ); friend int operator!=( Rotate&, Rotate& ); friend Rotate operator*( const Rotate&, const Rotate& ); friend Point operator*( const Rotate&, const Point& ); public: Rotate( float angr=0., float vx=0., float vy=0., float vz=1. ); Rotate( float, float, float, float, float, float, float scale=1. ); float getAng(); void getAxis( float&, float&, float& ); float * getAxis(); void getAngAxis( float&, float&, float&, float& ); float * getMatrix(); float * getOpenglMatrix(); void printMatrix(); char * toString(); Rotate& operator=( const Quat& ); }; Rotate operator*( const Rotate&, const Rotate& ); class Point : public Quat { public: Point( float, float, float ); char * toString(); friend Point operator*( const Rotate&, const Point& ); }; Point operator*( const Rotate&, const Point& ); #endif