NRE_Quaternion.hpp
Go to the documentation of this file.
1 
10  #pragma once
11 
12  #include <Utility/String/NRE_String.hpp>
13  #include <iostream>
14 
15  #include "../NRE_Math.hpp"
16  #include "../NRE_Unit.hpp"
17  #include <Utility/Interfaces/Stringable/NRE_Stringable.hpp>
18 
23  namespace NRE {
28  namespace Math {
29 
30  template<class> class Vector3D;
31  template<class> class Vector4D;
32 
37  template <class T>
38  class Quaternion : public Utility::Stringable<Quaternion<T>> {
39  private : //Fields
40  Vector4D<T> quat;
42  public : // Methods
43  //## Constructor ##//
47  constexpr Quaternion() = default;
55  template <class K, class L, class N, class M>
56  constexpr Quaternion(K x, L y, N z, M w);
64  template <class K, class L, class N>
65  Quaternion(K x, L y, N z, Angle w);
71  template <class K, class L>
72  constexpr Quaternion(Vector3D<K> const& ax, L an);
78  template <class K>
79  Quaternion(Vector3D<K> const& ax, Angle an);
80 
81  //## Copy-Constructor ##//
86  constexpr Quaternion(Quaternion const& q) = default;
87 
88  //## Move-Constructor ##//
93  constexpr Quaternion(Quaternion && q) = default;
94 
95  //## Convertor ##//
100  template <class K>
101  constexpr Quaternion(Quaternion<K> const& q);
102 
103  //## Deconstructor ##//
107  ~Quaternion() = default;
108 
109  //## Getter ##//
113  constexpr T getX() const;
117  constexpr T getY() const;
121  constexpr T getZ() const;
125  constexpr T getW() const;
129  constexpr Vector3D<T> getAxis() const;
133  constexpr Vector4D<T> const& getQuaternion() const;
134 
135  //## Setter ##//
140  template <class K>
141  constexpr void setX(K x);
146  template <class K>
147  constexpr void setY(K y);
152  template <class K>
153  constexpr void setZ(K z);
158  template <class K>
159  constexpr void setW(K w);
165  template <class K>
166  inline void setAngleAxis(Vector3D<K> const& axis, Angle w);
170  constexpr void setIdentity();
171 
172  //## Members ##//
176  long double norm() const;
180  constexpr T normSquared() const;
188  constexpr const T* value() const;
189 
190  //## Assignment Operator ##//
196  constexpr Quaternion& operator =(Quaternion const& q) = default;
202  constexpr Quaternion& operator =(Quaternion && q) = default;
208  template <class K>
209  constexpr Quaternion& operator =(Quaternion<K> const& q);
215  template <class K>
216  constexpr Quaternion& operator =(Quaternion<K> && q);
217 
218  //## Shortcut Operator ##//
224  template <class K>
225  constexpr Quaternion& operator*=(Quaternion<K> const& q);
226 
227  //## Arithmetic Operator ##//
233  template <class K>
234  constexpr Quaternion<std::common_type_t<T, K>> operator*(Quaternion<K> const& q) const;
235 
236  //## Stream Operator ##//
241  Utility::String toString() const;
242  };
243  }
244  }
245 
246  #include "NRE_Quaternion.tpp"
Quaternion normalize()
constexpr T normSquared() const
constexpr void setIdentity()
constexpr T getZ() const
constexpr Quaternion< std::common_type_t< T, K > > operator*(Quaternion< K > const &q) const
constexpr void setY(K y)
Math&#39;s API.
constexpr void setZ(K z)
Utility::String toString() const
constexpr Quaternion()=default
void setAngleAxis(Vector3D< K > const &axis, Angle w)
constexpr Quaternion & operator=(Quaternion const &q)=default
constexpr void setX(K x)
constexpr const T * value() const
The NearlyRealEngine&#39;s global namespace.
constexpr T getW() const
constexpr T getX() const
constexpr Vector4D< T > const & getQuaternion() const
constexpr Quaternion & operator*=(Quaternion< K > const &q)
constexpr Vector3D< T > getAxis() const
constexpr T getY() const
long double norm() const
constexpr void setW(K w)