00001
00002
00003
00004
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 #ifndef _GMTL_AXISANGLE_H_
00036 #define _GMTL_AXISANGLE_H_
00037
00038 #include <gmtl/Math.h>
00039 #include <gmtl/VecBase.h>
00040 #include <gmtl/Vec.h>
00041
00042 namespace gmtl
00043 {
00044
00063 template <typename DATA_TYPE>
00064 class AxisAngle : public VecBase<DATA_TYPE, 4>
00065 {
00066 public:
00067 enum Params { Size = 4 };
00068
00070 AxisAngle() :
00071 VecBase<DATA_TYPE, 4>( (DATA_TYPE)0.0, (DATA_TYPE)1.0,
00072 (DATA_TYPE)0.0, (DATA_TYPE)0.0 )
00073 {
00074 }
00075
00077 AxisAngle( const AxisAngle& e ) : VecBase<DATA_TYPE, 4>( e )
00078 {
00079 }
00080
00082 AxisAngle( const DATA_TYPE& rad_angle, const DATA_TYPE& x,
00083 const DATA_TYPE& y, const DATA_TYPE& z ) :
00084 VecBase<DATA_TYPE, 4>( rad_angle, x, y, z )
00085 {
00086 }
00087
00089 AxisAngle( const DATA_TYPE& rad_angle, const Vec<DATA_TYPE, 3>& axis ) :
00090 VecBase<DATA_TYPE, 4>( rad_angle, axis[0], axis[1], axis[2] )
00091 {
00092 }
00093
00095 void set( const DATA_TYPE& rad_angle, const DATA_TYPE& x,
00096 const DATA_TYPE& y, const DATA_TYPE& z )
00097 {
00098 VecBase<DATA_TYPE, 4>::set( rad_angle, x, y, z );
00099 }
00100
00102 void set( const DATA_TYPE& rad_angle, const Vec<DATA_TYPE, 3>& axis )
00103 {
00104 VecBase<DATA_TYPE, 4>::set( rad_angle, axis[0], axis[1], axis[2] );
00105 }
00106
00111 void setAxis( const Vec<DATA_TYPE, 3>& axis )
00112 {
00113 VecBase<DATA_TYPE, 4>::operator[]( 1 ) = axis[0];
00114 VecBase<DATA_TYPE, 4>::operator[]( 2 ) = axis[1];
00115 VecBase<DATA_TYPE, 4>::operator[]( 3 ) = axis[2];
00116 }
00117
00122 void setAngle( const DATA_TYPE& rad_angle )
00123 {
00124 VecBase<DATA_TYPE, 4>::operator[]( 0 ) = rad_angle;
00125 }
00126
00130 Vec<DATA_TYPE, 3> getAxis() const
00131 {
00132 return Vec<DATA_TYPE, 3>( VecBase<DATA_TYPE, 4>::operator[]( 1 ),
00133 VecBase<DATA_TYPE, 4>::operator[]( 2 ),
00134 VecBase<DATA_TYPE, 4>::operator[]( 3 ) );
00135 }
00136
00140 const DATA_TYPE& getAngle() const
00141 {
00142 return VecBase<DATA_TYPE, 4>::operator[]( 0 );
00143 }
00144 };
00145
00146 const AxisAngle<float> AXISANGLE_IDENTITYF( 0.0f, 1.0f, 0.0f, 0.0f );
00147 const AxisAngle<double> AXISANGLE_IDENTITYD( 0.0, 1.0, 0.0, 0.0 );
00148
00149 typedef AxisAngle<float> AxisAnglef;
00150 typedef AxisAngle<double> AxisAngled;
00151
00152 }
00153
00154 #endif