1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
/******************************************************************************
*
* MantaFlow fluid solver framework
* Copyright 2011 Tobias Pfaff, Nils Thuerey
*
* This program is free software, distributed under the terms of the
* Apache License, Version 2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Basic quaternion class
*
******************************************************************************/
#ifndef _QUATERNION_H
#define _QUATERNION_H
#include "vectorbase.h"
namespace Manta {
//! Very basic quaternion class
class Quaternion {
public:
//! default constructor
Quaternion() : x(0), y(0), z(0), w(0)
{
}
//! copy constructor
Quaternion(const Quaternion &q) : x(q.x), y(q.y), z(q.z), w(q.w)
{
}
//! construct a quaternion from members
Quaternion(Real _x, Real _y, Real _z, Real _w) : x(_x), y(_y), z(_z), w(_w)
{
}
//! construct a quaternion from imag/real parts
Quaternion(Vec3 i, Real r) : x(i.x), y(i.y), z(i.z), w(r)
{
}
//! Assign operator
inline Quaternion &operator=(const Quaternion &q)
{
x = q.x;
y = q.y;
z = q.z;
w = q.w;
return *this;
}
//! Assign multiplication operator
inline Quaternion &operator*=(const Real a)
{
x *= a;
y *= a;
z *= a;
w *= a;
return *this;
}
//! return inverse quaternion
inline Quaternion inverse() const
{
Real mag = 1.0 / (x * x + y * y + z * z + w * w);
return Quaternion(-x * mag, -y * mag, -z * mag, w * mag);
}
//! imaginary part accessor
inline Vec3 imag()
{
return Vec3(x, y, z);
}
// imaginary part
Real x;
Real y;
Real z;
// real part
Real w;
};
//! Multiplication operator
inline Quaternion operator*(const Quaternion &q1, const Quaternion &q2)
{
return Quaternion(q2.w * q1.x + q2.x * q1.w + q2.y * q1.z - q2.z * q1.y,
q2.w * q1.y + q2.y * q1.w + q2.z * q1.x - q2.x * q1.z,
q2.w * q1.z + q2.z * q1.w + q2.x * q1.y - q2.y * q1.x,
q2.w * q1.w - q2.x * q1.x - q2.y * q1.y - q2.z * q1.z);
}
//! Multiplication operator
inline Quaternion operator*(const Quaternion &q, const Real a)
{
return Quaternion(q.x * a, q.y * a, q.z * a, q.w * a);
}
} // namespace Manta
#endif
|