Make quaternion constructor accept a vector instead of coordinates

This commit is contained in:
Nikita Lisitsa 2021-01-25 22:12:00 +03:00
parent e871517909
commit df85b5eac5

View file

@ -18,12 +18,9 @@ namespace psemek::geom
static quaternion<T> vector(geom::vector<T, 3> const & v); static quaternion<T> vector(geom::vector<T, 3> const & v);
static quaternion<T> rotation(T angle, geom::vector<T, 3> const & axis); static quaternion<T> rotation(T angle, geom::vector<T, 3> const & axis);
template <typename ... Args> quaternion(geom::vector<T, 4> const & v)
quaternion(Args && ... args) : coords{v}
: coords{ static_cast<T>(std::forward<Args>(args))... } {}
{
static_assert(sizeof...(Args) == 4);
}
T & operator[] (std::size_t i) { return coords[i]; } T & operator[] (std::size_t i) { return coords[i]; }
T const & operator[] (std::size_t i) const { return coords[i]; } T const & operator[] (std::size_t i) const { return coords[i]; }
@ -35,25 +32,25 @@ namespace psemek::geom
template <typename T> template <typename T>
quaternion<T> quaternion<T>::zero() quaternion<T> quaternion<T>::zero()
{ {
return quaternion<T>{T(0), T(0), T(0), T(0)}; return quaternion<T>{geom::vector<T, 4>::zero()};
} }
template <typename T> template <typename T>
quaternion<T> quaternion<T>::identity() quaternion<T> quaternion<T>::identity()
{ {
return quaternion<T>{T(1), T(0), T(0), T(0)}; return quaternion<T>{{T(1), T(0), T(0), T(0)}};
} }
template <typename T> template <typename T>
quaternion<T> quaternion<T>::scalar(T value) quaternion<T> quaternion<T>::scalar(T value)
{ {
return {value, T(0), T(0), T(0)}; return {{value, T(0), T(0), T(0)}};
} }
template <typename T> template <typename T>
quaternion<T> quaternion<T>::vector(geom::vector<T, 3> const & v) quaternion<T> quaternion<T>::vector(geom::vector<T, 3> const & v)
{ {
return {T(0), v[0], v[1], v[2]}; return {{T(0), v[0], v[1], v[2]}};
} }
template <typename T> template <typename T>
@ -62,7 +59,7 @@ namespace psemek::geom
auto const c = std::cos(angle / 2); auto const c = std::cos(angle / 2);
auto const s = std::sin(angle / 2); auto const s = std::sin(angle / 2);
return quaternion<T>{c, s * axis[0], s * axis[1], s * axis[2]}; return quaternion<T>{{c, s * axis[0], s * axis[1], s * axis[2]}};
} }
template <typename T> template <typename T>