quaternion.h
Go to the documentation of this file.
00001 
00018 #ifndef __QUATERNION_H
00019 #define __QUATERNION_H
00020 
00021 #include "complex.h"
00022 #include "quaternion.h"
00023 #include "math.h"
00024 
00025 struct quaternion 
00026 {
00027         double r,i,j,k;
00028 };              
00029 
00030 quaternion qzero= {0,0,0,0};
00031 
00032 quaternion qneg(quaternion a){
00033         quaternion r;
00034         r.r=-a.r;
00035         r.i=-a.i;
00036         r.j=-a.j;
00037         r.k=-a.k;
00038         return r;
00039 }
00040 
00041 quaternion qmul(quaternion a,quaternion b)
00042 { 
00043         quaternion r;
00044         r.r=a.r*b.r-a.i*b.i-a.j*b.j-a.k*b.k;
00045         r.i=a.r*b.i+a.i*b.r+a.j*b.k-a.k*b.j;
00046         r.j=a.r*b.j-a.i*b.k+a.j*b.r+a.k*b.i;
00047         r.k=a.r*b.k+a.i*b.j-a.j*b.i+a.k*b.r;
00048         return r;
00049 }
00050 
00051 quaternion qadd(quaternion a,quaternion b)
00052 {
00053         quaternion r;
00054         r.r=a.r+b.r;
00055         r.i=a.i+b.i;
00056         r.j=a.j+b.j;
00057         r.k=a.k+b.k;
00058         return r;
00059 }
00060 
00061 quaternion qsub(quaternion a,quaternion b)
00062 {
00063         quaternion r;
00064         r.r=a.r-b.r;
00065         r.i=a.i-b.i;
00066         r.j=a.j-b.j;
00067         r.k=a.k-b.k;
00068         return r;
00069 }
00070 
00071 quaternion r2q(double x)
00072 {
00073         quaternion r;
00074         r.r=x;
00075         r.i=0;
00076         r.j=0;
00077         r.k=0;
00078         return r;
00079 }
00080 
00081 bool isEqual(quaternion a,quaternion b)
00082 {
00083         return ((a.r==b.r)&&(a.i==b.i)&&(a.j==b.j)&&(a.k=b.k));
00084 }
00085 
00086 bool isEqualE(quaternion a,quaternion b)
00087 {
00088         return ((abs(a.r-b.r)<epsilon)&&(abs(a.i-b.i)<epsilon)&&(abs(a.j-b.j)<epsilon)&&(abs(a.k-b.k)<epsilon));
00089 }
00090 
00091 quaternion cpow(quaternion a,int b)
00092 {
00093         quaternion r;
00094     r=a;
00095         for (int i=1;i<b;i++) r=qmul(r,a);
00096         return r;
00097 }
00098 
00099 double abs(quaternion a)
00100 {
00101         return sqrt(a.r*a.r+a.i*a.i+a.j*a.j+a.k*a.k);
00102 }
00103 
00104 quaternion qabs(quaternion a)
00105 {
00106         quaternion r=qzero;
00107         r.r=abs(a);
00108         return r;
00109 }
00110 
00111 quaternion qscale(double s,quaternion a)
00112 {
00113         quaternion r;
00114         r.r=a.r*s;
00115         r.i=a.i*s;
00116         r.j=a.j*s;
00117         r.k=a.k*s;
00118         return r;
00119 }
00120 
00121 quaternion qNormalize(quaternion q)
00122 {
00123         return qscale(1/abs(q),q);
00124 }
00125 
00126 quaternion qconj(quaternion a)
00127 {
00128         quaternion r=qneg(a);
00129         r.r=a.r;
00130         return r;
00131 }
00132 
00133 
00134 quaternion qinv(quaternion a)
00135 {
00136         return qscale(1/abs(a),qconj(qscale(1/abs(a),a)));
00137         
00138 }
00139 /*
00140 quaternion cdiv(quaternion a,complex b)
00141 {
00142         quaternion r;
00143         double B=b.r*b.r+b.i*b.i;
00144         r.r=(a.r*b.r+a.i*b.i)/B;
00145         r.i=(a.i*b.r-a.r*b.i)/B;
00146         return r;
00147 }
00148 
00149 quaternion cexp(quaternion a){
00150         quaternion r;
00151         double length,angle;
00152         length=exp(a.r);
00153         angle=a.i;
00154         r.r=cos(angle)*length;
00155         r.i=sin(angle)*length;
00156         return r;
00157 }
00158 
00159 quaternion cln(quaternion a){
00160         quaternion r;
00161         double length,angle;
00162         length=sqrt(a.r*a.r+a.i*a.i);
00163         angle=atan2(a.i,a.r);
00164         r.r=log(length);
00165         r.i=angle;
00166         return r;
00167 }
00168 */
00169 
00170 quaternion qpos(quaternion a){
00171         return a;
00172 }
00173 /*
00174 quaternion csqrt(quaternion a)
00175 {
00176         quaternion r;
00177         double length,angle;
00178         length=sqrt(sqrt(a.r*a.r+a.i*a.i));
00179         angle=atan2(a.i,a.r)/2;
00180         r.r=cos(angle)*length;
00181         r.i=sin(angle)*length;
00182         return r;
00183 }
00184 */
00185 
00186 void qprint(quaternion c)
00187 {
00188         printf("%f",c.r);
00189         if (c.i>0) printf("+%fi",c.i);
00190         if (c.i<0)  printf("%fi",c.i);
00191         if (c.j>0) printf("+%fi",c.j);
00192         if (c.j<0)  printf("%fi",c.j);
00193         if (c.k>0) printf("+%fi",c.k);
00194         if (c.k<0)  printf("%fi",c.k);
00195         printf("\n");
00196 }
00197 
00198 bool isReal(quaternion x)
00199 {
00200                 return ((abs(x.i)<=epsilon)&&(abs(x.j)<=epsilon)&&(abs(x.k)<=epsilon));
00201 }
00202 
00203 void rotate(double* x,double* y,double* z,quaternion q){
00204         quaternion r;
00205         r.r=0;
00206         r.i=*x;
00207         r.j=*y;
00208         r.k=*z;
00209         r=qmul(qmul(q,r),qinv(q));
00210         *x=r.i;
00211         *y=r.j;
00212         *z=r.k;
00213 }
00214 
00215 #endif


asr_flock_of_birds
Author(s): Bernhardt Andre, Engelmann Stephan, Giesler Björn, Heller Florian, Jäkel Rainer, Nguyen Trung, Pardowitz Michael, Weckesser Peter, Yi Xie, Zöllner Raoul
autogenerated on Sat Jun 8 2019 19:36:21