_Euler4.h

Go to the documentation of this file.
00001 #ifndef __VECMATH_EULER4_HPP
00002 #define __VECMATH_EULER4_HPP
00003 
00004 // directly based upon the code from GemsIV (p.224)
00005 //
00006 
00007 #ifndef __LANG_MATH_HPP
00008 #include <vecmath/Math.h>
00009 #endif
00010 
00011 template <class Type> class _Euler4;
00012 
00013 #ifndef __VECMATH_TUPLE4_HPP
00014 #include <vecmath/_Tuple4.h>
00015 #endif
00016 
00017 //#ifndef __VECMATH_AXISANGLE_HPP
00018 //#include <vecmath/_AxisAngle4.h>
00019 //#endif
00020 
00021 #ifndef __VECMATH_MATRIX4_HPP
00022 #include <vecmath/_Matrix4.h>
00023 #endif
00024 
00025 typedef int order_t;
00026 
00027 //#define DEBUGEULER4(d) d
00028 #define DEBUGEULER4(d)
00029 
00030 #define EulSafe      "\000\001\002\000"
00031 #define EulNext      "\001\002\000\001"
00032 #define EulFrm(ord) ((unsigned)(ord)&1)
00033 #define EulRep(ord) (((unsigned)(ord)>>1)&1)
00034 #define EulPar(ord) (((unsigned)(ord)>>2)&1)
00035 #define EulOrd(i, p, r, f) (((((((i)<<1)+(p))<<1)+(r))<<1)+(f))
00036 #define EulGetOrd(ord,i,j,k,h,n,s,f) {unsigned o=ord;f=o&1;o>>=1;s=o&1;o>>=1;\
00037     n=o&1;o>>=1;i=EulSafe[o&3];j=EulNext[i+n];k=EulNext[i+1-n];h=s?k:i;}
00038 
00039 //template <class Type> ostream& operator <<(ostream& os, const _Euler4<Type>& t);
00040 //template <class Type> ostream& operator <<(ostream& os, const _Euler4<Type>* t);
00041 
00042 template <class Type> class VECMATH_EXPORT _Euler4 {
00043 public:
00044     enum { X, Y, Z, W };
00045     static const order_t EulFrmS = 0;
00046     static const order_t EulFrmR = 1;
00047     static const order_t EulRepNo = 0;
00048     static const order_t EulRepYes = 1;
00049     static const order_t EulParEven = 0;
00050     static const order_t EulParOdd = 1;
00051 
00052     /* Static axes */
00053     static const order_t EulOrdXYZs = EulOrd(X,EulParEven,EulRepNo,EulFrmS);
00054     static const order_t EulOrdXYXs = EulOrd(X,EulParEven,EulRepYes,EulFrmS);
00055     static const order_t EulOrdXZYs = EulOrd(X,EulParOdd,EulRepNo,EulFrmS);
00056     static const order_t EulOrdXZXs = EulOrd(X,EulParOdd,EulRepYes,EulFrmS);
00057     static const order_t EulOrdYZXs = EulOrd(Y,EulParEven,EulRepNo,EulFrmS);
00058     static const order_t EulOrdYZYs = EulOrd(Y,EulParEven,EulRepYes,EulFrmS);
00059     static const order_t EulOrdYXZs = EulOrd(Y,EulParOdd,EulRepNo,EulFrmS);
00060     static const order_t EulOrdYXYs = EulOrd(Y,EulParOdd,EulRepYes,EulFrmS);
00061     static const order_t EulOrdZXYs = EulOrd(Z,EulParEven,EulRepNo,EulFrmS);
00062     static const order_t EulOrdZXZs = EulOrd(Z,EulParEven,EulRepYes,EulFrmS);
00063     static const order_t EulOrdZYXs = EulOrd(Z,EulParOdd,EulRepNo,EulFrmS);
00064     static const order_t EulOrdZYZs = EulOrd(Z,EulParOdd,EulRepYes,EulFrmS);
00065     /* Rotating axes */
00066     static const order_t EulOrdZYXr = EulOrd(X,EulParEven,EulRepNo,EulFrmR);
00067     static const order_t EulOrdXYXr = EulOrd(X,EulParEven,EulRepYes,EulFrmR);
00068     static const order_t EulOrdYZXr = EulOrd(X,EulParOdd,EulRepNo,EulFrmR);
00069     static const order_t EulOrdXZXr = EulOrd(X,EulParOdd,EulRepYes,EulFrmR);
00070     static const order_t EulOrdXZYr = EulOrd(Y,EulParEven,EulRepNo,EulFrmR);
00071     static const order_t EulOrdYZYr = EulOrd(Y,EulParEven,EulRepYes,EulFrmR);
00072     static const order_t EulOrdZXYr = EulOrd(Y,EulParOdd,EulRepNo,EulFrmR);
00073     static const order_t EulOrdYXYr = EulOrd(Y,EulParOdd,EulRepYes,EulFrmR);
00074     static const order_t EulOrdYXZr = EulOrd(Z,EulParEven,EulRepNo,EulFrmR);
00075     static const order_t EulOrdZXZr = EulOrd(Z,EulParEven,EulRepYes,EulFrmR);
00076     static const order_t EulOrdXYZr = EulOrd(Z,EulParOdd,EulRepNo,EulFrmR);
00077     static const order_t EulOrdZYZr = EulOrd(Z,EulParOdd,EulRepYes,EulFrmR);
00078 
00079     static const Type EPS;// = 1.0e-06;
00080     static const Type EPS1;// = 1.0e-30;
00081     Type x, y, z;
00082     order_t order;
00083 
00084     _Euler4<Type>() {}
00085 
00086     explicit _Euler4<Type>(Type x, Type y = 0, Type z = 0, order_t order = EulOrdXYZs) : x(x), y(y), z(z), order(order) {
00087         DEBUGEULER4(cout << "_Euler4 explicit constructor x,y,z,w " << *this << endl);
00088     }
00089 
00090     _Euler4<Type>(const _Tuple4<double>& t) {
00091         set(t);
00092         DEBUGEULER4(cout << "_Euler4 constructor &double " << *this << endl);
00093     }
00094 
00095     _Euler4<Type>(const _Tuple4<float>& t) {
00096         set(t);
00097         DEBUGEULER4(cout << "_Euler4 constructor &float " << *this << endl);
00098     }
00099 
00100     _Euler4<Type>(const Type t[4]) {
00101         set(t);
00102         DEBUGEULER4(cout << "_Euler4 constructor t[4] " << *this << endl);
00103     }
00104 
00105 
00106     void get(_Matrix4<double>& m) const;
00107     void get(_Matrix4<float>& m) const;
00108     void get(_Matrix3<double>& m) const;
00109     void get(_Matrix3<float>& m) const;
00110 
00111     void get(_Quat4<double>& q) const;
00112 
00113     void interpolate(const _Euler4<Type>& q, Type d) {
00114         interpolate(*this, q, d);
00115     }
00116 
00117     void interpolate(const _Euler4<Type>& q, const _Euler4<Type>& q1, Type d) {}
00118 
00119     void set(Type _x, Type _y = 0.0, Type _z = 0.0, order_t _order = EulOrdXYZs) {
00120         x = _x;
00121         y = _y;
00122         z = _z;
00123         order = _order;
00124     }
00125 
00126     void set(const _Tuple4<double>& t) {
00127         set(t.x, t.y, t.z, (order_t) t.w);
00128     }
00129 
00130     void set(const _Tuple4<float>& t) {
00131         set(t.x, t.y, t.z, (order_t) t.w);
00132     }
00133 
00134     void set(const _Quat4<float>& m) {
00135         //FIXME
00136     }
00137 
00138     void set(const double v[4]) {
00139         set(v[0], v[1], v[2], (order_t) v[3]);
00140     }
00141 
00142     void set(const float v[4]) {
00143         set(v[0], v[1], v[2], (order_t) v[3]);
00144     }
00145 
00146     void set(const _Matrix4<double>& m, order_t _order = EulOrdXYZs);
00147     void set(const _Matrix4<float>& m, order_t _order = EulOrdXYZs);
00148     void set(const _Matrix3<double>& m, order_t _order = EulOrdXYZs);
00149     void set(const _Matrix3<float>& m, order_t _order = EulOrdXYZs);
00150 
00151     void set(const _Euler4<double>& e) {
00152         set(e.x, e.y, e.z, e.order);
00153     }
00154 
00155     void set(const _Euler4<float>& e) {
00156         set(e.x, e.y, e.z, e.order);
00157     }
00158 
00159 //    friend ostream & operator << <>( ostream &, const _Euler4<Type> & );
00160 //    friend ostream & operator << <>( ostream &, const _Euler4<Type> * );
00161 
00162 private:
00163     void setByMatrix(double m00, double m01, double m02,
00164                      double m10, double m11, double m12,
00165                      double m20, double m21, double m22) {}
00166 
00167     void setByAxis(double ax, double ay, double az, double aa) {}
00168 
00169 
00170 };
00171 
00172 #endif

Generated on Thu Sep 29 13:39:44 2005 for vecmath by  doxygen 1.4.4