include/quaternion.h
Go to the documentation of this file.
1 
18 #ifndef __QUATERNION_H
19 #define __QUATERNION_H
20 
21 #include "complex.h"
22 #include "quaternion.h"
23 #include "math.h"
24 
25 struct quaternion
26 {
27  double r,i,j,k;
28 };
29 
30 quaternion qzero= {0,0,0,0};
31 
33  quaternion r;
34  r.r=-a.r;
35  r.i=-a.i;
36  r.j=-a.j;
37  r.k=-a.k;
38  return r;
39 }
40 
42 {
43  quaternion r;
44  r.r=a.r*b.r-a.i*b.i-a.j*b.j-a.k*b.k;
45  r.i=a.r*b.i+a.i*b.r+a.j*b.k-a.k*b.j;
46  r.j=a.r*b.j-a.i*b.k+a.j*b.r+a.k*b.i;
47  r.k=a.r*b.k+a.i*b.j-a.j*b.i+a.k*b.r;
48  return r;
49 }
50 
52 {
53  quaternion r;
54  r.r=a.r+b.r;
55  r.i=a.i+b.i;
56  r.j=a.j+b.j;
57  r.k=a.k+b.k;
58  return r;
59 }
60 
62 {
63  quaternion r;
64  r.r=a.r-b.r;
65  r.i=a.i-b.i;
66  r.j=a.j-b.j;
67  r.k=a.k-b.k;
68  return r;
69 }
70 
71 quaternion r2q(double x)
72 {
73  quaternion r;
74  r.r=x;
75  r.i=0;
76  r.j=0;
77  r.k=0;
78  return r;
79 }
80 
82 {
83  return ((a.r==b.r)&&(a.i==b.i)&&(a.j==b.j)&&(a.k=b.k));
84 }
85 
87 {
88  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));
89 }
90 
92 {
93  quaternion r;
94  r=a;
95  for (int i=1;i<b;i++) r=qmul(r,a);
96  return r;
97 }
98 
99 double abs(quaternion a)
100 {
101  return sqrt(a.r*a.r+a.i*a.i+a.j*a.j+a.k*a.k);
102 }
103 
105 {
107  r.r=abs(a);
108  return r;
109 }
110 
112 {
113  quaternion r;
114  r.r=a.r*s;
115  r.i=a.i*s;
116  r.j=a.j*s;
117  r.k=a.k*s;
118  return r;
119 }
120 
122 {
123  return qscale(1/abs(q),q);
124 }
125 
127 {
128  quaternion r=qneg(a);
129  r.r=a.r;
130  return r;
131 }
132 
133 
135 {
136  return qscale(1/abs(a),qconj(qscale(1/abs(a),a)));
137 
138 }
139 /*
140 quaternion cdiv(quaternion a,complex b)
141 {
142  quaternion r;
143  double B=b.r*b.r+b.i*b.i;
144  r.r=(a.r*b.r+a.i*b.i)/B;
145  r.i=(a.i*b.r-a.r*b.i)/B;
146  return r;
147 }
148 
149 quaternion cexp(quaternion a){
150  quaternion r;
151  double length,angle;
152  length=exp(a.r);
153  angle=a.i;
154  r.r=cos(angle)*length;
155  r.i=sin(angle)*length;
156  return r;
157 }
158 
159 quaternion cln(quaternion a){
160  quaternion r;
161  double length,angle;
162  length=sqrt(a.r*a.r+a.i*a.i);
163  angle=atan2(a.i,a.r);
164  r.r=log(length);
165  r.i=angle;
166  return r;
167 }
168 */
169 
171  return a;
172 }
173 /*
174 quaternion csqrt(quaternion a)
175 {
176  quaternion r;
177  double length,angle;
178  length=sqrt(sqrt(a.r*a.r+a.i*a.i));
179  angle=atan2(a.i,a.r)/2;
180  r.r=cos(angle)*length;
181  r.i=sin(angle)*length;
182  return r;
183 }
184 */
185 
187 {
188  printf("%f",c.r);
189  if (c.i>0) printf("+%fi",c.i);
190  if (c.i<0) printf("%fi",c.i);
191  if (c.j>0) printf("+%fi",c.j);
192  if (c.j<0) printf("%fi",c.j);
193  if (c.k>0) printf("+%fi",c.k);
194  if (c.k<0) printf("%fi",c.k);
195  printf("\n");
196 }
197 
199 {
200  return ((abs(x.i)<=epsilon)&&(abs(x.j)<=epsilon)&&(abs(x.k)<=epsilon));
201 }
202 
203 void rotate(double* x,double* y,double* z,quaternion q){
204  quaternion r;
205  r.r=0;
206  r.i=*x;
207  r.j=*y;
208  r.k=*z;
209  r=qmul(qmul(q,r),qinv(q));
210  *x=r.i;
211  *y=r.j;
212  *z=r.k;
213 }
214 
215 #endif
quaternion qadd(quaternion a, quaternion b)
bool isEqualE(quaternion a, quaternion b)
quaternion r2q(double x)
quaternion qzero
quaternion qpos(quaternion a)
quaternion qneg(quaternion a)
quaternion qscale(double s, quaternion a)
bool isReal(quaternion x)
quaternion qsub(quaternion a, quaternion b)
bool isEqual(quaternion a, quaternion b)
quaternion qabs(quaternion a)
quaternion qmul(quaternion a, quaternion b)
quaternion qinv(quaternion a)
quaternion cpow(quaternion a, int b)
void qprint(quaternion c)
void rotate(double *x, double *y, double *z, quaternion q)
quaternion qconj(quaternion a)
double abs(quaternion a)
quaternion qNormalize(quaternion q)
double epsilon


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 Mon Jun 10 2019 12:44:40