diff options
Diffstat (limited to 'extern/mantaflow/helper/util/quaternion.h')
-rw-r--r-- | extern/mantaflow/helper/util/quaternion.h | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/extern/mantaflow/helper/util/quaternion.h b/extern/mantaflow/helper/util/quaternion.h new file mode 100644 index 00000000000..c4e161baee2 --- /dev/null +++ b/extern/mantaflow/helper/util/quaternion.h @@ -0,0 +1,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 |