00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "quaternion.h"
00024 #include <stdio.h>
00025 #include <math.h>
00026 #include "log.h"
00027
00028 inline Quaternion::Quaternion(){
00029 u=x=y=z=0;
00030 }
00031
00032 inline Quaternion::Quaternion(double _u,double _x,double _y,double _z){
00033 u=_u;
00034 x=_x;
00035 y=_y;
00036 z=_z;
00037 }
00038
00039 inline Quaternion::Quaternion(const Vector3d &_V, double _a){
00040 u=cos(_a/2);
00041 Vector3d V=_V;
00042 V=V.normalized()*sin(_a/2);
00043 x=V.X();
00044 y=V.Y();
00045 z=V.Z();
00046 }
00047
00048 inline string Quaternion::toString(){
00049 char s[256];
00050 sprintf(s,"[%f,(%f,%f,%f)]",u,x,y,z);
00051 return string(s);
00052 }
00053
00054 inline double Quaternion::module(){
00055 return sqrt(u*u+x*x+y*y+z*z);
00056 }
00057
00058 inline Quaternion operator+(const Quaternion &a,const Quaternion &b){
00059 return Quaternion(a.u+b.u, a.x+b.x, a.y+b.y, a.z+b.z);
00060 }
00061
00062 inline Quaternion Quaternion::operator+=(const Quaternion &a){
00063 u+=a.u;
00064 x+=a.x;
00065 y+=a.y;
00066 z+=a.z;
00067 return *this;
00068 }
00069
00070 inline Quaternion operator-(const Quaternion &a,const Quaternion &b){
00071 return Quaternion(a.u-b.u, a.x-b.x, a.y-b.y, a.z-b.z);
00072 }
00073
00074 inline Quaternion Quaternion::operator-=(const Quaternion &a){
00075 u-=a.u;
00076 x-=a.x;
00077 y-=a.y;
00078 z-=a.z;
00079 return *this;
00080 }
00081
00082 inline Quaternion operator*(const Quaternion &a, double s){
00083 return Quaternion(a.u*s, a.x*s, a.y*s, a.z*s);
00084 }
00085
00086 inline Quaternion Quaternion::operator*=(double s){
00087 u*=s;
00088 x*=s;
00089 y*=s;
00090 z*=s;
00091 return *this;
00092 }
00093
00094 inline Quaternion operator/(const Quaternion &a, double s){
00095 return Quaternion(a.u/s, a.x/s, a.y/s, a.z/s);
00096 }
00097
00098 inline Quaternion Quaternion::operator/=(double s){
00099 u/=s;
00100 x/=s;
00101 y/=s;
00102 z/=s;
00103 return *this;
00104 }
00105
00106 inline Quaternion operator~(const Quaternion &a){
00107 return Quaternion(a.u, -a.x, -a.y, -a.z);
00108 }
00109
00110 inline Quaternion operator*(const Quaternion &a, const Quaternion &b){
00111 return Quaternion(a.u*b.u - a.x*b.x - a.y*b.y - a.z*b.z,
00112 a.u*b.x + a.x*b.u + a.y*b.z - a.z*b.y,
00113 a.u*b.y + a.y*b.u + a.z*b.x - a.x*b.z,
00114 a.u*b.z + a.z*b.u + a.x*b.y - a.y*b.x);
00115 }
00116
00117 inline Quaternion operator*(const Quaternion &q,const Vector3d &v){
00118 return Quaternion( -(q.x*v.x + q.y*v.y + q.z*v.z),
00119 q.u*v.x + q.y*v.z - q.z*v.y,
00120 q.u*v.y + q.z*v.x - q.x*v.z,
00121 q.u*v.z + q.x*v.y - q.y*v.x);
00122 }
00123
00124 inline Quaternion operator*(const Vector3d &v,const Quaternion &q){
00125 return Quaternion( -(q.x*v.x + q.y*v.y + q.z*v.z),
00126 q.u*v.x + q.z*v.y - q.y*v.z,
00127 q.u*v.y + q.x*v.z - q.z*v.x,
00128 q.u*v.z + q.y*v.x - q.x*v.y);
00129 }
00130
00131 inline Quaternion Quaternion::operator=(const Vector3d &_v){
00132 Vector3d v(_v);
00133 u=0;
00134 x=v.X(); y=v.Y(); z=v.Z();
00135 return *this;
00136 }
00137
00138 inline Vector3d Quaternion::getAxis(void){
00139 return Vector3d(x,y,z);
00140 }
00141
00142 inline Quaternion Quaternion::rotate(const Vector3d &v){
00143 Quaternion q=(*this)*v*(~(*this));
00144 return q;
00145 }
00146
00147
00148
00149
00150 inline Quaternion Quaternion::rotate(const Quaternion &q){
00151 Quaternion rq=(*this)*q*(~(*this));
00152 return rq;
00153 }
00154
00155 inline Quaternion Quaternion::rotate(const Vector3d &axis, double angle){
00156 log <<"Check this!"<<endl;
00157 return Quaternion(axis,angle).rotate(*this);
00158 }
00159
00160
00161
00162
00163 inline Vector3d Quaternion::toWorld(const Vector3d &v){
00164 return ((*this)*v*(~(*this))).getAxis();
00165 }
00166
00167
00168
00169
00170 inline Vector3d Quaternion::toBody(const Vector3d &v){
00171 return ((~(*this))*v*(*this)).getAxis();
00172 }