64 if constexpr (std::is_floating_point_v<T>)
83 T new_theta{ exponent * theta };
84 T coefficient{ std::sin(new_theta) /
magnitude };
92 coefficient *
k() } * std::pow(temp, exponent);
104 T e_to_the_w{ std::exp(
w() ) };
105 T vector_part_magnitude{
imaginary().magnitude() };
106 T cos_v{ std::cos(vector_part_magnitude) };
107 T sin_v{ (vector_part_magnitude > T{0.0}) ? std::sin(vector_part_magnitude) / vector_part_magnitude : T{0.0} };
112 sin_v *
k() } * e_to_the_w;
122 T magnitude_of_imaginary_part{
imaginary().magnitude() };
128 T this_norm{
norm() };
129 T theta{ std::acos(
w() / this_norm ) };
130 T coefficient{ theta / magnitude_of_imaginary_part };
166 constexpr const T &
w()
const {
return _w; }
167 constexpr const T &
real()
const {
return _w; }
169 constexpr const T &
i()
const {
return _i; }
170 constexpr const T &
j()
const {
return _j; }
171 constexpr const T &
k()
const {
return _k; }
191 if constexpr ( std::is_floating_point_v<T> )
192 return std::isnan(_w) || std::isnan(_i) || std::isnan(_j) || std::isnan(_k);
194 return _w.isNaN() || _i.isNaN() || _j.isNaN() || _k.isNaN();
198 if constexpr ( std::is_floating_point_v<T> )
199 return std::isinf(_w) || std::isinf(_i) || std::isinf(_j) || std::isinf(_k);
201 return _w.isInf() || _i.isInf() || _j.isInf() || _k.isInf();
275 T half_angle = radians.
value() * T{0.5};
276 T cos_theta = cos( half_angle );
277 T sin_theta = sin( half_angle );
322 template <std::
floating_po
int OT = T>
323 requires std::is_floating_point_v<T>
326 OT tolerance = OT{0.0002})
347 return { left.
w() * right.
w() - (left.
i() * right.
i() +
348 left.
j() * right.
j() +
349 left.
k() * right.
k()),
350 left.
w() * right.
i() +
351 left.
i() * right.
w() +
352 left.
j() * right.
k() -
353 left.
k() * right.
j(),
355 left.
w() * right.
j() -
356 left.
i() * right.
k() +
357 left.
j() * right.
w() +
358 left.
k() * right.
i(),
360 left.
w() * right.
k() +
361 left.
i() * right.
j() -
362 left.
j() * right.
i() +
367 template <std::
floating_po
int OT>
370 return { quaternion.
w() * scalar,
371 quaternion.
i() * scalar,
372 quaternion.
j() * scalar,
373 quaternion.
k() * scalar };
381 template <std::
floating_po
int OT>
384 return { quaternion.
w() / T(scalar),
385 quaternion.
i() / T(scalar),
386 quaternion.
j() / T(scalar),
387 quaternion.
k() / T(scalar) };
392 return { left.
w() + right.
w(),
393 left.
i() + right.
i(),
394 left.
j() + right.
j(),
395 left.
k() + right.
k() };
400 return { left.
w() - right.
w(),
401 left.
i() - right.
i(),
402 left.
j() - right.
j(),
403 left.
k() - right.
k() };
408 return { -q.
w(), -q.
i(), -q.
j(), -q.
k() };
430 template <std::
floating_po
int OT = T>
431 requires std::is_floating_point_v<T>
434 OT tolerance = OT{0.0002})
438 auto diff{ near_to - input };
440 std::cout << std::format(
"input: {} is not equal to near_to: {} within tolerance: {}. Difference is {} .",
459 template <std::
floating_po
int OT = T>
460 requires std::is_floating_point_v<T>
463 OT tolerance = OT{0.0002})
467 auto diff{ near_to - input };
469 std::cout << std::format(
"input: {} is equal to near_to: {} within tolerance: {}. Difference is {} .",
499 template <std::
floating_po
int OT = T>
500 requires std::is_floating_point_v<T>
503 OT tolerance = OT{0.0002})
516 template <std::
floating_po
int OT = T>
517 requires std::is_floating_point_v<T>
520 OT tolerance = OT{0.0002})
532 template <std::
floating_po
int OT = T>
533 requires std::is_floating_point_v<T>
555 return left.
w() * right.
w() +
556 left.
i() * right.
i() +
557 left.
j() * right.
j() +
558 left.
k() * right.
k();
563 return ( left.
w() * right.
w() +
564 left.
i() * right.
i() +
565 left.
j() * right.
j() +
588 assert( rotation.
isUnit() );
589 assert( encoded_point.
isPure() );
591 return rotation * encoded_point * rotation.
conjugate();
622 assert( rotation.
isUnit() );
623 assert( encoded_point.
isPure() );
625 return rotation.
conjugate() * encoded_point * rotation;
646 return rotation_2 * rotation_1;
666 return input.
angle().value();
676 assert(
axis.magnitude() == T{1} );
689 return T{input.
real() + input.
i() + input.
j() + input.
k()};
704 return begin * combined.
pow(percent);
709 return std::format(
"[w: {}, i: {}, j: {}, k: {}]", input.
w(), input.
i(), input.
j(), input.
k());
friend BasicQuaternion< T > exp(const BasicQuaternion< T > &input)
constexpr BasicQuaternion()=default
T magnitudeSquared() const
constexpr const T & i() const
friend constexpr BasicQuaternion< T > locally_rotate_encoded_point(const BasicQuaternion< T > &rotation, const BasicQuaternion< T > &encoded_point)
static constexpr BasicQuaternion< T > encode_point(T x, T y, T z)
BasicRadian< T > angle() const
BasicQuaternion< T > exp() const
friend constexpr BasicQuaternion< T > conjugate(const BasicQuaternion< T > &input)
friend constexpr bool operator==(const BasicQuaternion< T > &left, const BasicQuaternion< T > &right)
bool isZero(T tolerance) const
constexpr const T & j() const
constexpr BasicVector3D< T > axis() const
constexpr BasicVector3D< T > imaginary() const
Extracts the imaginary part of a BasicQuaternion as a BasicVector3D.
constexpr BasicQuaternion(T real_number)
Constructs a BasicQuaternion equivalent to the given real number.
friend constexpr T dot(const BasicQuaternion< T > &left, const BasicQuaternion< T > &right)
friend constexpr BasicQuaternion< T > log(const BasicQuaternion< T > &input)
static constexpr BasicQuaternion< T > unit_j()
friend constexpr BasicQuaternion< T > actively_rotate_encoded_point(const BasicQuaternion< T > &rotation, const BasicQuaternion< T > &encoded_point)
static constexpr BasicQuaternion< T > make_rotation(const BasicRadian< T > &radians, const BasicVector3D< T > &axis)
static constexpr BasicQuaternion< T > unit_i()
static constexpr BasicQuaternion< T > unit_k()
friend constexpr BasicQuaternion< T > globally_rotate_encoded_point(const BasicQuaternion< T > &rotation, const BasicQuaternion< T > &encoded_point)
constexpr const T & k() const
static constexpr BasicQuaternion< T > unit_real()
constexpr BasicQuaternion< T > conjugate() const
static constexpr BasicQuaternion< T > identity()
BasicQuaternion representation of the real number 1.
constexpr BasicQuaternion< T > normalized() const
friend constexpr T dot_normalized(const BasicQuaternion< T > &left, const BasicQuaternion< T > &right)
friend constexpr BasicQuaternion< T > passively_rotate_encoded_point(const BasicQuaternion< T > &rotation, const BasicQuaternion< T > &encoded_point)
friend constexpr BasicQuaternion< T > normalized(const BasicQuaternion< T > &input)
BasicQuaternion< T > pow(T exponent) const
Computes this BasicQuaternion raised to a real power.
constexpr const T & w() const
static constexpr BasicQuaternion< T > make_pure(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)
constexpr const T & real() const
friend constexpr bool approximately_equal_to(const BasicQuaternion< T > &value_to_test, const BasicQuaternion< T > &value_it_should_be, OT tolerance=OT{0.0002})
static constexpr BasicQuaternion< T > zero()
BasicQuaternion representation of the real number 0.
friend constexpr BasicQuaternion< T > slerp(const BasicQuaternion< T > &begin, const BasicQuaternion< T > &end, T percent)
friend constexpr BasicQuaternion< T > compose_rotations(const BasicQuaternion< T > &rotation_1, const BasicQuaternion< T > &rotation_2)
BasicQuaternion< T > inverse() const
friend std::string format(const BasicQuaternion< T > &input)
BasicQuaternion< T > log() const
bool isUnit(T tolerance) const
friend constexpr BasicQuaternion< T > polar(const BasicVector3D< T > &axis, const BasicRadian< T > angle=BasicRadian< T >{})
static constexpr BasicQuaternion< T > make_pure(const BasicVector3D< T > &t)
constexpr BasicQuaternion(T w, T i, T j, T k)
friend constexpr T arg(const BasicQuaternion< T > &input)
friend constexpr T accumulate(const BasicQuaternion< T > &input)
T value_type
The underlying implementation type.
friend void CHECK_IF_NOT_EQUAL(const BasicQuaternion< T > &input, const BasicQuaternion< T > &near_to, OT tolerance=OT{0.0002})
friend void CHECK_IF_ZERO(const BasicQuaternion< T > &input, OT tolerance=OT{0.0002})
friend void CHECK_IF_EQUAL(const BasicQuaternion< T > &input, const BasicQuaternion< T > &near_to, OT tolerance=OT{0.0002})
constexpr BasicVector3D< Type > normalized() const
friend bool check_if_equal(const BasicQuaternion< T > &input, const BasicQuaternion< T > &near_to, OT tolerance=OT{0.0002})
friend bool check_if_not_equal(const BasicQuaternion< T > &input, const BasicQuaternion< T > &near_to, OT tolerance=OT{0.0002})
friend constexpr BasicQuaternion< T > operator*(const BasicQuaternion< T > &left, const BasicQuaternion< T > &right)
friend constexpr BasicQuaternion< T > operator/(const BasicQuaternion< T > &left, const BasicQuaternion< T > &right)
friend constexpr BasicQuaternion< T > operator+(const BasicQuaternion< T > &left, const BasicQuaternion< T > &right)
friend constexpr BasicQuaternion< T > operator-(const BasicQuaternion< T > &left, const BasicQuaternion< T > &right)