quaternion: expand elementwise and scalar operators

This commit is contained in:
Danny Robson 2019-02-07 15:44:15 +11:00
parent 040db9118c
commit cbf4a716ac
2 changed files with 67 additions and 0 deletions

View File

@ -95,6 +95,15 @@ quaternion<T>::from_to (const vector<3,T> u, const vector<3,T> v)
}
///////////////////////////////////////////////////////////////////////////////
template <typename T>
quaternion<T>
quaternion<T>::operator- () const noexcept
{
return { .w = -w, .x = -x, .y = -y, .z = -z };
}
///////////////////////////////////////////////////////////////////////////////
template <typename T>
quaternion<T>
@ -104,6 +113,45 @@ cruft::conjugate (quaternion<T> q)
}
///////////////////////////////////////////////////////////////////////////////
template <typename T>
T
cruft::dot (quaternion<T> a, quaternion<T> b)
{
return a.w * b.w +
a.x * b.x +
a.y * b.y +
a.z * b.z;
}
///////////////////////////////////////////////////////////////////////////////
template <typename T>
quaternion<T> cruft::operator* (quaternion<T> a, T b)
{
return {
.w = a.w * b,
.x = a.x * b,
.y = a.y * b,
.z = a.z * b
};
}
///////////////////////////////////////////////////////////////////////////////
template <typename T>
quaternion<T> cruft::operator+ (quaternion<T> a, quaternion<T> b)
{
return {
.w = a.w + b.w,
.x = a.x + b.x,
.y = a.y + b.y,
.z = a.z + b.z
};
}
///////////////////////////////////////////////////////////////////////////////
template <typename T>
quaternion<T>

View File

@ -56,6 +56,9 @@ namespace cruft {
/// Converts a rotation quaternion into an equivalent matrix form.
matrix4<T> as_matrix (void) const;
/// Negate all components
quaternion operator- () const noexcept;
/// Constructs a identity rotation quaternion.
static constexpr
quaternion<T>
@ -146,6 +149,22 @@ namespace cruft {
///////////////////////////////////////////////////////////////////////////
template <typename T>
T dot (quaternion<T>, quaternion<T>);
///////////////////////////////////////////////////////////////////////////
template <typename T> quaternion<T> operator* (quaternion<T>, T);
template <typename T> quaternion<T> operator* (T, quaternion<T>);
///////////////////////////////////////////////////////////////////////////
template <typename T>
quaternion<T>
operator+ (quaternion<T>, quaternion<T>);
//-------------------------------------------------------------------------
template <typename T>
quaternion<T>
operator* (quaternion<T>, quaternion<T>);