#pragma once #include #include "Trig.hpp" #include "Vector.hpp" struct Rotation { Rotation() = default; Rotation(Vector<3> vector) : vector{ wrap(vector) } {} explicit Rotation(Real angles[3]) : Rotation(angles[0], angles[1], angles[2]) {} Rotation(Real pitch, Real yaw, Real roll) { vector = wrap({pitch, yaw, roll }); } Vector<3> radians() const { return vector.map([](auto a) { return Math::radians(a); }); } Rotation operator+(Rotation other) const { return wrap(vector + other.vector); } Rotation& operator+=(const Rotation& other) { *this = *this + other; return *this; } std::string string() const { return vector.string(); } static Vector<3> wrap(Vector<3> v) { return v.map([](auto a) { return fmod(a, 360.0f); }); } Real& pitch() { return vector.x(); } const Real& pitch() const { return vector.x(); } Real& yaw() { return vector.y(); } const Real& yaw() const { return vector.y(); } Real& roll() { return vector.z(); } const Real& roll() const { return vector.z(); } Vector<3> vector; };