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
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170 quaternion qpos(quaternion a){
00171 return a;
00172 }
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
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