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> rotation(T angle, geom::vector<T, 3> const & axis);
template <typename ... Args>
quaternion(Args && ... args)
: coords{ static_cast<T>(std::forward<Args>(args))... }
{
static_assert(sizeof...(Args) == 4);
}
quaternion(geom::vector<T, 4> const & v)
: coords{v}
{}
T & operator[] (std::size_t i) { return coords[i]; }
T const & operator[] (std::size_t i) const { return coords[i]; }
@ -35,25 +32,25 @@ namespace psemek::geom
template <typename T>
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>
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>
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>
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>
@ -62,7 +59,7 @@ namespace psemek::geom
auto const c = std::cos(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>