OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
Quaternion.hpp
Go to the documentation of this file.
1#ifndef OPAL_QUATERNION_H
2#define OPAL_QUATERNION_H
3
4#include "Algorithms/Matrix.h"
5#include "Ippl.h"
6
29class Quaternion : public ippl::Vector<double, 4> {
30public:
31 /* ======== Constructors ======== */
33 Quaternion();
34 Quaternion(const Quaternion&);
36 Quaternion(const double&, const double&, const double&, const double&);
38 Quaternion(const ippl::Vector<double, 3>&);
40 Quaternion(const double&, const ippl::Vector<double, 3>&);
42 Quaternion(const matrix3x3_t&);
43
52 Quaternion inverse() const;
53
55 Quaternion conjugate() const;
56
57 /* ======== Operators ======== */
58 Quaternion operator*(const double&) const;
59
71 Quaternion operator*(const Quaternion&) const;
72 Quaternion& operator=(const Quaternion&) = default;
74 Quaternion operator/(const double&) const;
75
77 double Norm() const;
78
80 double length() const;
81
91
93 bool isUnit() const;
94
96 bool isPure() const;
97
99 bool isPureUnit() const;
100
102 double real() const;
103
105 ippl::Vector<double, 3> imag() const;
106
115 ippl::Vector<double, 3> rotate(const ippl::Vector<double, 3>&) const;
116
124};
125
127
138Quaternion getQuaternion(ippl::Vector<double, 3> vec, ippl::Vector<double, 3> reference);
139
140inline Quaternion::Quaternion() : Vector<double, 4>(1.0, 0.0, 0.0, 0.0) { srand(time(0)); }
141
142inline Quaternion::Quaternion(const Quaternion& quat) : Vector<double, 4>(quat) { srand(time(0)); }
143
145 const double& x0, const double& x1, const double& x2, const double& x3)
146 : Vector<double, 4>(x0, x1, x2, x3) {
147 srand(time(0));
148}
149
150inline Quaternion::Quaternion(const ippl::Vector<double, 3>& vec)
151 : Quaternion(0.0, vec(0), vec(1), vec(2)) {
152 srand(time(0));
153}
154
155inline Quaternion::Quaternion(const double& realPart, const ippl::Vector<double, 3>& vec)
156 : Quaternion(realPart, vec(0), vec(1), vec(2)) {
157 srand(time(0));
158}
159
160inline double Quaternion::Norm() const { return dot(*this); }
161
162inline double Quaternion::length() const { return std::sqrt(this->Norm()); }
163
164inline bool Quaternion::isUnit() const { return (std::abs(this->Norm() - 1.0) < 1e-12); }
165
166inline bool Quaternion::isPure() const { return (std::abs((*this)(0)) < 1e-12); }
167
168inline bool Quaternion::isPureUnit() const { return (this->isPure() && this->isUnit()); }
169
171 Quaternion quat(this->real(), -this->imag());
172
173 return quat;
174}
175
176inline double Quaternion::real() const { return (*this)(0); }
177
178inline ippl::Vector<double, 3> Quaternion::imag() const {
179 ippl::Vector<double, 3> vec((*this)(1), (*this)(2), (*this)(3));
180
181 return vec;
182}
183
184#endif
Quaternion Quaternion_t
Quaternion getQuaternion(ippl::Vector< double, 3 > vec, ippl::Vector< double, 3 > reference)
Return a unit quaternion that rotates vec onto reference.
ippl::Vector< T, Dim > Vector
double dot(const Vector3D &lhs, const Vector3D &rhs)
Vector dot product.
Definition Vector3D.cpp:95
Quaternion storage and rotation algebra used by OPALX geometry code.
bool isPure() const
Return true if the scalar part is approximately zero.
Quaternion & normalize()
Normalize the quaternion in place.
double real() const
Return the scalar part .
Quaternion conjugate() const
Return the quaternion conjugate .
matrix3x3_t getRotationMatrix() const
Convert the quaternion to a 3x3 rotation matrix.
Quaternion inverse() const
Return the multiplicative inverse.
ippl::Vector< double, 3 > rotate(const ippl::Vector< double, 3 > &) const
Rotate a spatial vector by a unit quaternion.
Quaternion & operator*=(const Quaternion &)
Quaternion operator/(const double &) const
bool isUnit() const
Return true if within a fixed tolerance.
Quaternion & operator=(const Quaternion &)=default
Quaternion operator*(const double &) const
Quaternion()
Construct the identity rotation quaternion .
bool isPureUnit() const
Return true if the quaternion is both pure and unit length.
double length() const
Return the Euclidean norm .
ippl::Vector< double, 3 > imag() const
Return the vector part .
double Norm() const
Return .