OPAL (Object Oriented Parallel Accelerator Library)  2024.1
OPAL
Quaternion.h
Go to the documentation of this file.
1 #ifndef OPAL_QUATERNION_H
2 #define OPAL_QUATERNION_H
3 
4 #include "AppTypes/Vektor.h"
6 #include "Algorithms/Vektor.h"
7 
8 class Quaternion: public Vektor<double, 4> {
9 public:
10  Quaternion();
11  Quaternion(const Quaternion &);
12  Quaternion(const double &, const double &, const double &, const double &);
13  Quaternion(const Vector_t &);
14  Quaternion(const double &, const Vector_t &);
15  Quaternion(const matrix_t &);
16 
17  Quaternion operator*(const double &) const;
18  Quaternion operator*(const Quaternion &) const;
19  Quaternion& operator=(const Quaternion &) = default;
21  Quaternion operator/(const double &) const;
22 
23  double Norm() const;
24  double length() const;
26 
27  bool isUnit() const;
28  bool isPure() const;
29  bool isPureUnit() const;
30 
31  Quaternion inverse() const;
32  Quaternion conjugate() const;
33 
34  double real() const;
35  Vector_t imag() const;
36 
37  Vector_t rotate(const Vector_t &) const;
38 
40 };
41 
43 
45 
46 
47 inline
49  Vektor<double, 4>(1.0, 0.0, 0.0, 0.0)
50 {}
51 
52 inline
54  Vektor<double, 4>(quat)
55 {}
56 
57 inline
58 Quaternion::Quaternion(const double & x0, const double & x1, const double & x2, const double & x3):
59  Vektor<double, 4>(x0, x1, x2, x3)
60 {}
61 
62 inline
64  Quaternion(0.0, vec(0), vec(1), vec(2))
65 {}
66 
67 inline
68 Quaternion::Quaternion(const double & realPart, const Vector_t & vec):
69  Quaternion(realPart, vec(0), vec(1), vec(2))
70 {}
71 
72 inline
73 double Quaternion::Norm() const
74 {
75  return dot(*this, *this);
76 }
77 
78 inline
79 double Quaternion::length() const
80 {
81  return std::sqrt(this->Norm());
82 }
83 
84 inline
85 bool Quaternion::isUnit() const
86 {
87  return (std::abs(this->Norm() - 1.0) < 1e-12);
88 }
89 
90 inline
91 bool Quaternion::isPure() const
92 {
93  return (std::abs((*this)(0)) < 1e-12);
94 }
95 
96 inline
98 {
99  return (this->isPure() && this->isUnit());
100 }
101 
102 inline
104 {
105  Quaternion quat(this->real(), -this->imag());
106 
107  return quat;
108 }
109 
110 inline
111 double Quaternion::real() const
112 {
113  return (*this)(0);
114 }
115 
116 inline
118 {
119  Vector_t vec((*this)(1), (*this)(2), (*this)(3));
120 
121  return vec;
122 }
123 
124 
125 #endif
matrix_t getRotationMatrix() const
Definition: Quaternion.cpp:135
boost::numeric::ublas::matrix< double > matrix_t
Definition: BoostMatrix.h:23
Tps< T > sqrt(const Tps< T > &x)
Square root.
Definition: TpsMath.h:91
double length() const
Definition: Quaternion.h:79
Quaternion conjugate() const
Definition: Quaternion.h:103
Vector_t rotate(const Vector_t &) const
Definition: Quaternion.cpp:122
Quaternion operator/(const double &) const
Definition: Quaternion.cpp:95
double Norm() const
Definition: Quaternion.h:73
bool isPureUnit() const
Definition: Quaternion.h:97
bool isPure() const
Definition: Quaternion.h:91
PETE_TUTree< FnAbs, typename T::PETE_Expr_t > abs(const PETE_Expr< T > &l)
Quaternion Quaternion_t
Definition: Quaternion.h:42
Vector_t imag() const
Definition: Quaternion.h:117
Definition: TSVMeta.h:24
bool isUnit() const
Definition: Quaternion.h:85
Quaternion inverse() const
Definition: Quaternion.cpp:115
double real() const
Definition: Quaternion.h:111
Definition: Vec.h:21
Quaternion operator*(const double &) const
Definition: Quaternion.cpp:71
Quaternion getQuaternion(Vector_t u, Vector_t ref)
Definition: Quaternion.cpp:34
Quaternion & operator*=(const Quaternion &)
Definition: Quaternion.cpp:84
constexpr double e
The value of .
Definition: Physics.h:39
Quaternion & operator=(const Quaternion &)=default
double dot(const Vector3D &lhs, const Vector3D &rhs)
Vector dot product.
Definition: Vector3D.cpp:118
Quaternion & normalize()
Definition: Quaternion.cpp:102