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
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 #ifndef __FK_QUATERNION_HEADER__
00073 #define __FK_QUATERNION_HEADER__
00074
00075 #include <FK/Vector.h>
00076 #include <FK/Angle.h>
00077 #include <FK/Matrix.h>
00078
00080
00113 class fk_Quaternion {
00114 public:
00115 double s;
00116 fk_Vector v;
00117
00119
00123 fk_Quaternion(void);
00124
00126
00139 fk_Quaternion(double s, double x, double y, double z);
00140
00142
00153 fk_Quaternion(const double s, const fk_Vector &v);
00154
00156 fk_Quaternion(const fk_Quaternion &);
00157
00159
00160
00162
00173 fk_Quaternion & operator -(void) const;
00174
00176
00189 fk_Quaternion & operator ~(void) const;
00190
00192
00211 fk_Quaternion & operator !(void) const;
00212
00213
00214
00216
00217
00219
00232 bool operator ==(const fk_Quaternion &) const;
00233
00235
00248 bool operator !=(const fk_Quaternion &) const;
00249
00250
00251
00253
00254
00256 fk_Quaternion & operator =(const fk_Quaternion &);
00257
00259
00278 fk_Quaternion & operator *=(const fk_Quaternion &);
00279
00281
00295 fk_Quaternion & operator *=(double);
00296
00298
00312 fk_Quaternion & operator /=(double);
00313
00315
00329 fk_Quaternion & operator +=(const fk_Quaternion &);
00330
00332
00346 fk_Quaternion & operator -=(const fk_Quaternion &);
00347
00348
00349
00351
00352
00354
00357 void init(void);
00358
00360
00374 void set(double s, double x, double y, double z);
00375
00377
00390 void set(double s, const fk_Vector &v);
00391
00393
00412 void setRotate(double theta, double x, double y, double z);
00413
00415
00432 void setRotate(double theta, const fk_Vector &V);
00433
00435
00444 void makeEuler(double h, double p, double b);
00445
00447
00454 void makeEuler(const fk_Angle &angle);
00455
00457
00464 fk_Angle & getEuler(void) const;
00465
00467
00476 double norm(void) const;
00477
00479
00488 double abs(void) const;
00489
00491
00497 bool normalize(void);
00498
00500
00509 void conj(void);
00510
00512
00529 bool inverse(void);
00530
00532
00536 fk_Matrix & conv(void) const;
00537
00538
00539
00541
00542 friend fk_Quaternion operator *(const fk_Quaternion &,
00543 const fk_Quaternion &);
00544 friend fk_Quaternion operator +(const fk_Quaternion &,
00545 const fk_Quaternion &);
00546 friend fk_Quaternion operator -(const fk_Quaternion &,
00547 const fk_Quaternion &);
00548
00549 friend fk_Quaternion operator *(const fk_Quaternion &, double);
00550 friend fk_Quaternion operator *(double, const fk_Quaternion &);
00551 friend fk_Quaternion operator /(const fk_Quaternion &, double);
00552
00553 friend fk_Vector operator *(const fk_Quaternion &,
00554 const fk_Vector &);
00555
00556 friend double operator ^(const fk_Quaternion &,
00557 const fk_Quaternion &);
00558
00559 };
00560
00562
00588 fk_Quaternion operator *(const fk_Quaternion &, const fk_Quaternion &);
00589
00591
00600 fk_Quaternion operator +(const fk_Quaternion &, const fk_Quaternion &);
00601
00603
00612 fk_Quaternion operator -(const fk_Quaternion &, const fk_Quaternion &);
00613
00615
00626 fk_Quaternion operator *(const fk_Quaternion &, double);
00627
00629
00640 fk_Quaternion operator *(double, const fk_Quaternion &);
00641
00643
00652 fk_Quaternion operator /(const fk_Quaternion &, double);
00653
00655
00671 fk_Vector operator *(const fk_Quaternion &, const fk_Vector &);
00672
00674
00698 double operator ^(const fk_Quaternion &, const fk_Quaternion &);
00699
00700 fk_Quaternion & fk_Q_Inter_Linear(const fk_Quaternion &,
00701 const fk_Quaternion &, double);
00702
00703 fk_Quaternion & fk_Q_Inter_Sphere(const fk_Quaternion &,
00704 const fk_Quaternion &, double);
00705
00706 #endif // !__FK_QUATERNION_HEADER__