Orange/include/Orange/Math/Angle.h

91 lines
2.5 KiB
C++

#pragma once
#include <Orange/Math/Unit.h>
#include <Orange/Math/Constants.h>
namespace orange
{
namespace detail
{
template <typename T>
class Radian;
template <typename T>
class Degree : public Unit<Degree, T>
{
public:
constexpr Degree() {}
constexpr explicit Degree(T value)
: Unit<orange::detail::Degree, T>(value)
{
}
constexpr Degree(Unit<orange::detail::Degree, T> value)
: Unit<orange::detail::Degree, T>(value)
{
}
template <typename U>
constexpr explicit Degree(Unit<orange::detail::Degree, U> value)
: Unit<orange::detail::Degree, T>(value)
{
}
constexpr Degree(Unit<Radian, T> value);
};
template <typename T>
class Radian : public Unit<Radian, T>
{
public:
Radian() {}
constexpr explicit Radian(T value)
: Unit<orange::detail::Radian, T>(value)
{
}
constexpr Radian(Unit<orange::detail::Radian, T> value)
: Unit<orange::detail::Radian, T>(value)
{
}
template <typename U>
constexpr explicit Radian(Unit<orange::detail::Radian, U> value)
: Unit<orange::detail::Radian, T>(value)
{
}
constexpr Radian(Unit<Degree, T> value);
};
template <typename T>
constexpr Degree<T>::Degree(Unit<Radian, T> value)
: Unit<orange::detail::Degree, T>(T(360) * T(value) / Math::Tau)
{
}
template <typename T>
constexpr Radian<T>::Radian(Unit<Degree, T> value)
: Unit<orange::detail::Radian, T>(T(value) * Math::Tau / T(360))
{
}
}
using Radian = detail::Radian<float>;
using Degree = detail::Degree<float>;
constexpr Radian operator"" _rad(long double value) { return Radian{static_cast<float>(value)}; }
constexpr Radian operator"" _rad(unsigned long long value) { return Radian{static_cast<float>(value)}; }
constexpr Degree operator"" _deg(long double value) { return Degree{static_cast<float>(value)}; }
constexpr Degree operator"" _deg(unsigned long long value) { return Degree{static_cast<float>(value)}; }
struct EulerAngles
{
Radian pitch;
Radian yaw;
Radian roll;
};
}