|
1 /* |
|
2 * Pyrit Ray Tracer |
|
3 * file: quaternion.h |
|
4 * |
|
5 * Radek Brich, 2006-2007 |
|
6 */ |
|
7 |
|
8 #ifndef QUATERNION_H |
|
9 #define QUATER_H |
|
10 |
|
11 class Quaternion |
|
12 { |
|
13 public: |
|
14 union { |
|
15 struct { |
|
16 Float a,b,c,d; |
|
17 }; |
|
18 struct { |
|
19 Float t,x,y,z; |
|
20 }; |
|
21 }; |
|
22 Quaternion(): a(0), b(0), c(0), d(0) {}; |
|
23 Quaternion(const Float aa, const Float ab, const Float ac, const Float ad): |
|
24 a(aa), b(ab), c(ac), d(ad) {}; |
|
25 Quaternion(const Vector3& v): a(1), b(v.x), c(v.y), d(v.z) {}; |
|
26 |
|
27 Vector3 toVector() { return Vector3(b/a, c/a, d/a); }; |
|
28 |
|
29 Quaternion normalize() |
|
30 { |
|
31 Float f = 1.0f / sqrtf(a * a + b * b + c * c + d * d); |
|
32 a *= f; |
|
33 b *= f; |
|
34 c *= f; |
|
35 d *= f; |
|
36 return *this; |
|
37 }; |
|
38 Float mag2() const |
|
39 { |
|
40 return (a*a + b*b + c*c + d*d); |
|
41 }; |
|
42 Float mag() const |
|
43 { |
|
44 return sqrtf(mag()); |
|
45 }; |
|
46 friend Quaternion operator*(const Quaternion &q1, const Quaternion &q2) |
|
47 { |
|
48 return Quaternion( |
|
49 q1.a*q2.a - q1.b*q2.b - q1.c*q2.c - q1.d*q2.d, |
|
50 q1.a*q2.b + q1.b*q2.a + q1.c*q2.d - q1.d*q2.c, |
|
51 q1.a*q2.c - q1.b*q2.d + q1.c*q2.a + q1.d*q2.b, |
|
52 q1.a*q2.d + q1.b*q2.c - q1.c*q2.b + q1.d*q2.a); |
|
53 }; |
|
54 friend Float dot(const Quaternion &q1, const Quaternion &q2) |
|
55 { |
|
56 return q1.a*q2.a + q1.b*q2.b + q1.c*q2.c + q1.d*q2.d; |
|
57 }; |
|
58 friend Quaternion conjugate(const Quaternion &q) |
|
59 { |
|
60 return Quaternion(q.a, -q.b, -q.c, -q.d); |
|
61 }; |
|
62 }; |
|
63 |
|
64 #endif |