OPALX (Object Oriented Parallel Accelerator Library for Exascal) MINIorX
OPALX
Quaternion.hpp
Go to the documentation of this file.
1#ifndef OPAL_QUATERNION_H
2#define OPAL_QUATERNION_H
4#include "Ippl.h"
5
6class Quaternion : public ippl::Vector<double, 4> {
7public:
10 Quaternion(const double&, const double&, const double&, const double&);
11 Quaternion(const ippl::Vector<double, 3>&);
12 Quaternion(const double&, const ippl::Vector<double, 3>&);
13 Quaternion(const matrix_t&);
14
15 Quaternion operator*(const double&) const;
16 Quaternion operator*(const Quaternion&) const;
17 Quaternion& operator=(const Quaternion&) = default;
19 Quaternion operator/(const double&) const;
20
21 double Norm() const;
22 double length() const;
24
25 bool isUnit() const;
26 bool isPure() const;
27 bool isPureUnit() const;
28
29 Quaternion inverse() const;
30 Quaternion conjugate() const;
31
32 double real() const;
33 ippl::Vector<double, 3> imag() const;
34
35 ippl::Vector<double, 3> rotate(const ippl::Vector<double, 3>&) const;
36
38};
39
41
42Quaternion getQuaternion(ippl::Vector<double, 3> vec, ippl::Vector<double, 3> reference);
43
44inline Quaternion::Quaternion() : Vector<double, 4>(1.0, 0.0, 0.0, 0.0) {
45 srand(time(0));
46}
47
48inline Quaternion::Quaternion(const Quaternion& quat) : Vector<double, 4>(quat) {
49 srand(time(0));
50}
51
53 const double& x0, const double& x1, const double& x2, const double& x3)
54 : Vector<double, 4>(x0, x1, x2, x3) {
55 srand(time(0));
56}
57
58inline Quaternion::Quaternion(const ippl::Vector<double, 3>& vec)
59 : Quaternion(0.0, vec(0), vec(1), vec(2)) {
60 srand(time(0));
61}
62
63inline Quaternion::Quaternion(const double& realPart, const ippl::Vector<double, 3>& vec)
64 : Quaternion(realPart, vec(0), vec(1), vec(2)) {
65 srand(time(0));
66}
67
68inline double Quaternion::Norm() const {
69 return dot(*this);
70}
71
72inline double Quaternion::length() const {
73 return std::sqrt(this->Norm());
74}
75
76inline bool Quaternion::isUnit() const {
77 return (std::abs(this->Norm() - 1.0) < 1e-12);
78}
79
80inline bool Quaternion::isPure() const {
81 return (std::abs((*this)(0)) < 1e-12);
82}
83
84inline bool Quaternion::isPureUnit() const {
85 return (this->isPure() && this->isUnit());
86}
87
89 Quaternion quat(this->real(), -this->imag());
90
91 return quat;
92}
93
94inline double Quaternion::real() const {
95 return (*this)(0);
96}
97
98inline ippl::Vector<double, 3> Quaternion::imag() const {
99 ippl::Vector<double, 3> vec((*this)(1), (*this)(2), (*this)(3));
100
101 return vec;
102}
103
104#endif
double dot(const Vector3D &lhs, const Vector3D &rhs)
Vector dot product.
Definition Vector3D.cpp:118
Quaternion Quaternion_t
Quaternion getQuaternion(ippl::Vector< double, 3 > vec, ippl::Vector< double, 3 > reference)
boost::numeric::ublas::matrix< double > matrix_t
Definition BoostMatrix.h:23
bool isPure() const
Quaternion & normalize()
double real() const
Quaternion conjugate() const
Quaternion inverse() const
ippl::Vector< double, 3 > rotate(const ippl::Vector< double, 3 > &) const
Quaternion & operator*=(const Quaternion &)
Quaternion operator/(const double &) const
bool isUnit() const
Quaternion & operator=(const Quaternion &)=default
Quaternion operator*(const double &) const
bool isPureUnit() const
matrix_t getRotationMatrix() const
double length() const
ippl::Vector< double, 3 > imag() const
double Norm() const