MathLib
Loading...
Searching...
No Matches
Public Member Functions | List of all members
BasicQuaternion< T > Class Template Reference

#include <math/Quaternion.hpp>

Public Types

Types
using value_type = T
 The underlying implementation type.
 

Public Member Functions

constexpr BasicQuaternion< T > conjugate () const
 
BasicQuaternion< T > pow (T exponent) const
 Computes this BasicQuaternion raised to a real power.
 
BasicQuaternion< T > exp () const
 
BasicQuaternion< T > log () const
 
T normSquared () const
 
T norm () const
 
T magnitudeSquared () const
 
T magnitude () const
 
constexpr BasicQuaternion< T > normalized () const
 
BasicQuaternion< T > inverse () const
 
BasicRadian< T > angle () const
 
constexpr BasicVector3D< T > axis () const
 
bool isUnit () const
 
bool isUnit (T tolerance) const
 
bool isZero () const
 
bool isZero (T tolerance) const
 
bool isPure () const
 
Constructors
constexpr BasicQuaternion ()=default
 
constexpr BasicQuaternion (T real_number)
 Constructs a BasicQuaternion equivalent to the given real number.
 
constexpr BasicQuaternion (T w, T i, T j, T k)
 
Element Access
constexpr const T & w () const
 
constexpr const T & real () const
 
constexpr const T & i () const
 
constexpr const T & j () const
 
constexpr const T & k () const
 
constexpr BasicVector3D< T > imaginary () const
 Extracts the imaginary part of a BasicQuaternion as a BasicVector3D.
 
Invalid Value Check
bool isNaN () const
 
bool isInf () const
 

Static Public Member Functions

Constants
static constexpr BasicQuaternion< T > identity ()
 BasicQuaternion representation of the real number 1.
 
static constexpr BasicQuaternion< T > zero ()
 BasicQuaternion representation of the real number 0.
 
static constexpr BasicQuaternion< T > unit_real ()
 
static constexpr BasicQuaternion< T > unit_i ()
 
static constexpr BasicQuaternion< T > unit_j ()
 
static constexpr BasicQuaternion< T > unit_k ()
 
Convenience Creation Functions
static constexpr BasicQuaternion< T > make_pure (T x, T y, T z)
 
static constexpr BasicQuaternion< T > make_pure (const BasicVector3D< T > &t)
 
static constexpr BasicQuaternion< T > encode_point (T x, T y, T z)
 
static constexpr BasicQuaternion< T > encode_point (const BasicVector3D< T > &point)
 
static constexpr BasicQuaternion< T > make_rotation (const BasicRadian< T > &radians, T axis_x, T axis_y, T axis_z)
 
static constexpr BasicQuaternion< T > make_rotation (const BasicRadian< T > &radians, const BasicVector3D< T > &axis)
 

Friends

Equality
constexpr bool operator== (const BasicQuaternion< T > &left, const BasicQuaternion< T > &right)
 
template<std::floating_point OT = T>
requires std::is_floating_point_v<T>
constexpr bool approximately_equal_to (const BasicQuaternion< T > &value_to_test, const BasicQuaternion< T > &value_it_should_be, OT tolerance=OT{0.0002})
 
Operators
constexpr BasicQuaternion< T > operator* (const BasicQuaternion< T > &left, const BasicQuaternion< T > &right)
 
template<std::floating_point OT>
constexpr BasicQuaternion< T > operator* (const BasicQuaternion< T > &quaternion, OT scalar)
 
constexpr BasicQuaternion< T > operator/ (const BasicQuaternion< T > &left, const BasicQuaternion< T > &right)
 
template<std::floating_point OT>
constexpr BasicQuaternion< T > operator/ (const BasicQuaternion< T > &quaternion, OT scalar)
 
constexpr BasicQuaternion< T > operator+ (const BasicQuaternion< T > &left, const BasicQuaternion< T > &right)
 
constexpr BasicQuaternion< T > operator- (const BasicQuaternion< T > &left, const BasicQuaternion< T > &right)
 
constexpr BasicQuaternion< T > operator- (const BasicQuaternion< T > &q)
 
Check
template<std::floating_point OT = T>
requires std::is_floating_point_v<T>
bool check_if_equal (const BasicQuaternion< T > &input, const BasicQuaternion< T > &near_to, OT tolerance=OT{0.0002})
 
template<std::floating_point OT = T>
requires std::is_floating_point_v<T>
bool check_if_not_equal (const BasicQuaternion< T > &input, const BasicQuaternion< T > &near_to, OT tolerance=OT{0.0002})
 
Assert
template<std::floating_point OT = T>
requires std::is_floating_point_v<T>
void CHECK_IF_EQUAL (const BasicQuaternion< T > &input, const BasicQuaternion< T > &near_to, OT tolerance=OT{0.0002})
 
template<std::floating_point OT = T>
requires std::is_floating_point_v<T>
void CHECK_IF_NOT_EQUAL (const BasicQuaternion< T > &input, const BasicQuaternion< T > &near_to, OT tolerance=OT{0.0002})
 
template<std::floating_point OT = T>
requires std::is_floating_point_v<T>
void CHECK_IF_ZERO (const BasicQuaternion< T > &input, OT tolerance=OT{0.0002})
 
Global Functions
constexpr T dot (const BasicQuaternion< T > &left, const BasicQuaternion< T > &right)
 
constexpr T dot_normalized (const BasicQuaternion< T > &left, const BasicQuaternion< T > &right)
 
constexpr BasicQuaternion< T > passively_rotate_encoded_point (const BasicQuaternion< T > &rotation, const BasicQuaternion< T > &encoded_point)
 
constexpr BasicQuaternion< T > locally_rotate_encoded_point (const BasicQuaternion< T > &rotation, const BasicQuaternion< T > &encoded_point)
 
constexpr BasicQuaternion< T > actively_rotate_encoded_point (const BasicQuaternion< T > &rotation, const BasicQuaternion< T > &encoded_point)
 
constexpr BasicQuaternion< T > globally_rotate_encoded_point (const BasicQuaternion< T > &rotation, const BasicQuaternion< T > &encoded_point)
 
constexpr BasicQuaternion< T > compose_rotations (const BasicQuaternion< T > &rotation_1, const BasicQuaternion< T > &rotation_2)
 
constexpr BasicQuaternion< T > normalized (const BasicQuaternion< T > &input)
 
constexpr T arg (const BasicQuaternion< T > &input)
 
constexpr BasicQuaternion< T > polar (const BasicVector3D< T > &axis, const BasicRadian< T > angle=BasicRadian< T >{})
 
constexpr T accumulate (const BasicQuaternion< T > &input)
 
constexpr BasicQuaternion< T > slerp (const BasicQuaternion< T > &begin, const BasicQuaternion< T > &end, T percent)
 
std::string format (const BasicQuaternion< T > &input)
 
constexpr BasicQuaternion< T > conjugate (const BasicQuaternion< T > &input)
 
constexpr BasicQuaternion< T > log (const BasicQuaternion< T > &input)
 
BasicQuaternion< T > exp (const BasicQuaternion< T > &input)
 

Related Symbols

(Note that these are not member symbols.)

Type Aliases
using Quaternionf = BasicQuaternion< float >
 
using Quaterniond = BasicQuaternion< double >
 
using Quaternion = BasicQuaternion< double >
 
using Quaternionl = BasicQuaternion< long double >
 

Detailed Description

template<class T>
class Math::BasicQuaternion< T >

A mathematical quaternion

Note
A quaternion is a 4-dimensional object that is an extension of the complex number system. Its main use is for encoding rotation in 3-dimensional space.

Definition at line 31 of file Quaternion.hpp.

Member Typedef Documentation

◆ value_type

template<class T >
using value_type = T

The underlying implementation type.

Definition at line 37 of file Quaternion.hpp.

Constructor & Destructor Documentation

◆ BasicQuaternion() [1/3]

template<class T >
constexpr BasicQuaternion ( )
constexprdefault

◆ BasicQuaternion() [2/3]

template<class T >
constexpr BasicQuaternion ( T  real_number)
inlineconstexpr

Constructs a BasicQuaternion equivalent to the given real number.

Definition at line 44 of file Quaternion.hpp.

◆ BasicQuaternion() [3/3]

template<class T >
constexpr BasicQuaternion ( T  w,
T  i,
T  j,
T  k 
)
inlineconstexpr

Definition at line 45 of file Quaternion.hpp.

Member Function Documentation

◆ angle()

template<class T >
BasicRadian< T > angle ( ) const
inline

Definition at line 153 of file Quaternion.hpp.

◆ axis()

template<class T >
constexpr BasicVector3D< T > axis ( ) const
inlineconstexpr

Definition at line 158 of file Quaternion.hpp.

◆ conjugate()

template<class T >
constexpr BasicQuaternion< T > conjugate ( ) const
inlineconstexpr

Definition at line 62 of file Quaternion.hpp.

◆ encode_point() [1/2]

template<class T >
static constexpr BasicQuaternion< T > encode_point ( const BasicVector3D< T > &  point)
inlinestaticconstexpr

Encode a 3D point as a pure BasicQuaternion

Postcondition
output.w() == 0 output.real() == 0
Note
A pure BasicQuaternion is one in which the w, or real, component is 0.
See also
make_pure

Definition at line 250 of file Quaternion.hpp.

◆ encode_point() [2/2]

template<class T >
static constexpr BasicQuaternion< T > encode_point ( T  x,
T  y,
T  z 
)
inlinestaticconstexpr

Encode a 3D point as a pure BasicQuaternion

Postcondition
output.w() == 0 output.real() == 0
Note
A pure BasicQuaternion is one in which the w, or real, component is 0.
See also
make_pure

Definition at line 238 of file Quaternion.hpp.

◆ exp()

template<class T >
BasicQuaternion< T > exp ( ) const
inline

Computes the exponential form of this BasicQuaternion

Note
It is possible for this routine to output a non-unit BasicQuaternion when given a unit BasicQuaternion as input. It is for this reason that the implementation of log() has been adjusted to automatically handle non-unit Quaternions.

Definition at line 102 of file Quaternion.hpp.

◆ i()

template<class T >
constexpr const T & i ( ) const
inlineconstexpr

Definition at line 169 of file Quaternion.hpp.

◆ identity()

template<class T >
static constexpr BasicQuaternion< T > identity ( )
inlinestaticconstexpr

BasicQuaternion representation of the real number 1.

Definition at line 52 of file Quaternion.hpp.

◆ imaginary()

template<class T >
constexpr BasicVector3D< T > imaginary ( ) const
inlineconstexpr

Extracts the imaginary part of a BasicQuaternion as a BasicVector3D.

Definition at line 174 of file Quaternion.hpp.

◆ inverse()

template<class T >
BasicQuaternion< T > inverse ( ) const
inline

Definition at line 151 of file Quaternion.hpp.

◆ isInf()

template<class T >
bool isInf ( ) const
inline

Definition at line 196 of file Quaternion.hpp.

◆ isNaN()

template<class T >
bool isNaN ( ) const
inline

Definition at line 189 of file Quaternion.hpp.

◆ isPure()

template<class T >
bool isPure ( ) const
inline

Definition at line 184 of file Quaternion.hpp.

◆ isUnit() [1/2]

template<class T >
bool isUnit ( ) const
inline

Definition at line 177 of file Quaternion.hpp.

◆ isUnit() [2/2]

template<class T >
bool isUnit ( T  tolerance) const
inline

Definition at line 178 of file Quaternion.hpp.

◆ isZero() [1/2]

template<class T >
bool isZero ( ) const
inline

Definition at line 180 of file Quaternion.hpp.

◆ isZero() [2/2]

template<class T >
bool isZero ( T  tolerance) const
inline

Definition at line 181 of file Quaternion.hpp.

◆ j()

template<class T >
constexpr const T & j ( ) const
inlineconstexpr

Definition at line 170 of file Quaternion.hpp.

◆ k()

template<class T >
constexpr const T & k ( ) const
inlineconstexpr

Definition at line 171 of file Quaternion.hpp.

◆ log()

template<class T >
BasicQuaternion< T > log ( ) const
inline

Computes the log base e of this BasicQuaternion

Note
We handle non-unit Quaternions in this version so that we can satisfy the relationship: log( exp( x ) ) == x

Definition at line 120 of file Quaternion.hpp.

◆ magnitude()

template<class T >
T magnitude ( ) const
inline

Definition at line 142 of file Quaternion.hpp.

◆ magnitudeSquared()

template<class T >
T magnitudeSquared ( ) const
inline

Definition at line 141 of file Quaternion.hpp.

◆ make_pure() [1/2]

template<class T >
static constexpr BasicQuaternion< T > make_pure ( const BasicVector3D< T > &  t)
inlinestaticconstexpr

Construct a pure BasicQuaternion

Postcondition
output.w() == 0 output.real() == 0
Note
A pure BasicQuaternion is one in which the w, or real, component is 0.

Definition at line 226 of file Quaternion.hpp.

◆ make_pure() [2/2]

template<class T >
static constexpr BasicQuaternion< T > make_pure ( T  x,
T  y,
T  z 
)
inlinestaticconstexpr

Construct a pure BasicQuaternion

Postcondition
output.w() == 0 output.real() == 0
Note
A pure BasicQuaternion is one in which the w, or real, component is 0.

Definition at line 216 of file Quaternion.hpp.

◆ make_rotation() [1/2]

template<class T >
static constexpr BasicQuaternion< T > make_rotation ( const BasicRadian< T > &  radians,
const BasicVector3D< T > &  axis 
)
inlinestaticconstexpr

Enocde a rotation into a BasicQuaternion

Parameters
radiansThe amount of rotation to apply (in radians)
axisThe axis to rotate around
Postcondition
output.isUnit() == true

Definition at line 273 of file Quaternion.hpp.

◆ make_rotation() [2/2]

template<class T >
static constexpr BasicQuaternion< T > make_rotation ( const BasicRadian< T > &  radians,
T  axis_x,
T  axis_y,
T  axis_z 
)
inlinestaticconstexpr

Enocde a rotation into a BasicQuaternion

Parameters
radiansThe amount of rotation to apply (in radians)
axis_xThe X component of the vector to rotate around
axis_yThe Y component of the vector to rotate around
axis_zThe Z component of the vector to rotate around
Postcondition
output.isUnit() == true

Definition at line 261 of file Quaternion.hpp.

◆ norm()

template<class T >
T norm ( ) const
inline

Definition at line 139 of file Quaternion.hpp.

◆ normalized()

template<class T >
constexpr BasicQuaternion< T > normalized ( ) const
inlineconstexpr

Definition at line 144 of file Quaternion.hpp.

◆ normSquared()

template<class T >
T normSquared ( ) const
inline

Definition at line 138 of file Quaternion.hpp.

◆ pow()

template<class T >
BasicQuaternion< T > pow ( T  exponent) const
inline

Computes this BasicQuaternion raised to a real power.

Definition at line 71 of file Quaternion.hpp.

◆ real()

template<class T >
constexpr const T & real ( ) const
inlineconstexpr

Definition at line 167 of file Quaternion.hpp.

◆ unit_i()

template<class T >
static constexpr BasicQuaternion< T > unit_i ( )
inlinestaticconstexpr

Definition at line 57 of file Quaternion.hpp.

◆ unit_j()

template<class T >
static constexpr BasicQuaternion< T > unit_j ( )
inlinestaticconstexpr

Definition at line 58 of file Quaternion.hpp.

◆ unit_k()

template<class T >
static constexpr BasicQuaternion< T > unit_k ( )
inlinestaticconstexpr

Definition at line 59 of file Quaternion.hpp.

◆ unit_real()

template<class T >
static constexpr BasicQuaternion< T > unit_real ( )
inlinestaticconstexpr

Definition at line 56 of file Quaternion.hpp.

◆ w()

template<class T >
constexpr const T & w ( ) const
inlineconstexpr

Definition at line 166 of file Quaternion.hpp.

◆ zero()

template<class T >
static constexpr BasicQuaternion< T > zero ( )
inlinestaticconstexpr

BasicQuaternion representation of the real number 0.

Definition at line 55 of file Quaternion.hpp.

Friends And Related Symbol Documentation

◆ accumulate

template<class T >
constexpr T accumulate ( const BasicQuaternion< T > &  input)
friend

Sums up the components of input

Parameters
inputThe BasicQuaternion to operate on
Returns
The sum of all the components

Definition at line 687 of file Quaternion.hpp.

◆ actively_rotate_encoded_point

template<class T >
constexpr BasicQuaternion< T > actively_rotate_encoded_point ( const BasicQuaternion< T > &  rotation,
const BasicQuaternion< T > &  encoded_point 
)
friend

Rotates the encoded_point using the given rotation

Parameters
rotationThe input rotation
encoded_pointThe input point to be rotated
Returns
The actively rotated encoded point
Precondition
rotation is a unit BasicQuaternion. encoded_point is a pure BasicQuaternion.
Postcondition
The output is a pure BasicQuaternion
Note
This is an active rotation, meaning that the point is rotated with respect to the coordinate system. This is also known as a global rotation.

Definition at line 619 of file Quaternion.hpp.

◆ approximately_equal_to

template<class T >
template<std::floating_point OT = T>
requires std::is_floating_point_v<T>
constexpr bool approximately_equal_to ( const BasicQuaternion< T > &  value_to_test,
const BasicQuaternion< T > &  value_it_should_be,
OT  tolerance = OT{0.0002} 
)
friend

Compares two BasicQuaternion inputs equal, component-wise, to within a tolerance

Parameters
value_to_test
value_it_should_be
toleranceHow close they should be to be considered equal
Returns
true if they are equal
See also
Equality

Definition at line 324 of file Quaternion.hpp.

◆ arg

template<class T >
constexpr T arg ( const BasicQuaternion< T > &  input)
friend

Computes the phase-angle (in radians of a Quaternion)

Note
This is meant to mirror the behavior of std::arg( std::complex )

Definition at line 664 of file Quaternion.hpp.

◆ compose_rotations

template<class T >
constexpr BasicQuaternion< T > compose_rotations ( const BasicQuaternion< T > &  rotation_1,
const BasicQuaternion< T > &  rotation_2 
)
friend

Performs a concatenation of two rotations

Parameters
rotation_1The first rotation to perform
rotation_2The second rotation to perform

Definition at line 643 of file Quaternion.hpp.

◆ conjugate

template<class T >
constexpr BasicQuaternion< T > conjugate ( const BasicQuaternion< T > &  input)
friend

Computes the conjugate of the input

Note
This will just call input.conjugate()

Definition at line 716 of file Quaternion.hpp.

◆ dot

template<class T >
constexpr T dot ( const BasicQuaternion< T > &  left,
const BasicQuaternion< T > &  right 
)
friend

Calculates the dot product of two Quaternions

Note
In this case, the Quaternions are just treated as separate 4-tuples and the dot product of those are calculated.

Definition at line 553 of file Quaternion.hpp.

◆ dot_normalized

template<class T >
constexpr T dot_normalized ( const BasicQuaternion< T > &  left,
const BasicQuaternion< T > &  right 
)
friend

Definition at line 561 of file Quaternion.hpp.

◆ exp

template<class T >
BasicQuaternion< T > exp ( const BasicQuaternion< T > &  input)
friend

Computes the exponential of the input

Note
This will just call input.exp()

Definition at line 734 of file Quaternion.hpp.

◆ format

template<class T >
std::string format ( const BasicQuaternion< T > &  input)
friend

Definition at line 707 of file Quaternion.hpp.

◆ globally_rotate_encoded_point

template<class T >
constexpr BasicQuaternion< T > globally_rotate_encoded_point ( const BasicQuaternion< T > &  rotation,
const BasicQuaternion< T > &  encoded_point 
)
friend
See also
actively_rotate_encoded_point

Definition at line 632 of file Quaternion.hpp.

◆ locally_rotate_encoded_point

template<class T >
constexpr BasicQuaternion< T > locally_rotate_encoded_point ( const BasicQuaternion< T > &  rotation,
const BasicQuaternion< T > &  encoded_point 
)
friend
See also
passively_rotate_encoded_point

Definition at line 598 of file Quaternion.hpp.

◆ log

template<class T >
constexpr BasicQuaternion< T > log ( const BasicQuaternion< T > &  input)
friend

Computes the log of the input

Note
This will just call input.log()

Definition at line 725 of file Quaternion.hpp.

◆ normalized

template<class T >
constexpr BasicQuaternion< T > normalized ( const BasicQuaternion< T > &  input)
friend

Creates the normalized form of a Quaternion

Parameters
inputThe Quaternion to normalize
Returns
The normalized version of input

Definition at line 655 of file Quaternion.hpp.

◆ operator==

template<class T >
constexpr bool operator== ( const BasicQuaternion< T > &  left,
const BasicQuaternion< T > &  right 
)
friend

Defines equality of two Quaternions

Note
Uses approximately_equal_to under-the-hood
Use C++20's ability to generate the operator !=() from operator ==()
See also
Equality

Definition at line 307 of file Quaternion.hpp.

◆ passively_rotate_encoded_point

template<class T >
constexpr BasicQuaternion< T > passively_rotate_encoded_point ( const BasicQuaternion< T > &  rotation,
const BasicQuaternion< T > &  encoded_point 
)
friend

Rotates the encoded point using the given rotation

Parameters
rotationThe input rotation
encoded_pointThe input point to be rotated
Returns
The passively rotated encoded point
Precondition
rotation is a unit BasicQuaternion. encoded_point is a pure Auaternion.
Postcondition
The output is a pure BasicQuaternion
Note
This is a passive rotation, meaning that the coordinate system is rotated with respect to the point. This is also known as a local rotation.

Definition at line 585 of file Quaternion.hpp.

◆ polar

template<class T >
constexpr BasicQuaternion< T > polar ( const BasicVector3D< T > &  axis,
const BasicRadian< T >  angle = BasicRadian<T>{} 
)
friend

Constructs a unit Quaternion from the given axis and angle

Note
This is meant to mirror the behavior of the std::complex version of std::polar()

Definition at line 673 of file Quaternion.hpp.

◆ slerp

template<class T >
constexpr BasicQuaternion< T > slerp ( const BasicQuaternion< T > &  begin,
const BasicQuaternion< T > &  end,
T  percent 
)
friend

Calculates the Spherical Linear Interpolation betwee two Quaternions

Parameters
beginOrigin value
endDestination value
percent[0..1] Represents the percentage to interpolate

Definition at line 698 of file Quaternion.hpp.


The documentation for this class was generated from the following file: