Orange/include/Orange/Math/Angle.h

91 lines
2.5 KiB
C
Raw Normal View History

2022-08-12 21:18:11 +01:00
#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:
2022-08-13 12:07:07 +01:00
constexpr Degree() {}
2022-08-12 21:18:11 +01:00
2022-08-13 12:07:07 +01:00
constexpr explicit Degree(T value)
2022-08-12 21:18:11 +01:00
: Unit<orange::detail::Degree, T>(value)
{
}
2022-08-13 12:07:07 +01:00
constexpr Degree(Unit<orange::detail::Degree, T> value)
2022-08-12 21:18:11 +01:00
: Unit<orange::detail::Degree, T>(value)
{
}
2022-08-13 12:07:07 +01:00
template <typename U>
constexpr explicit Degree(Unit<orange::detail::Degree, U> value)
2022-08-12 21:18:11 +01:00
: Unit<orange::detail::Degree, T>(value)
{
}
2022-08-13 12:07:07 +01:00
constexpr Degree(Unit<Radian, T> value);
2022-08-12 21:18:11 +01:00
};
template <typename T>
class Radian : public Unit<Radian, T>
{
public:
Radian() {}
2022-08-13 12:07:07 +01:00
constexpr explicit Radian(T value)
2022-08-12 21:18:11 +01:00
: Unit<orange::detail::Radian, T>(value)
{
}
2022-08-13 12:07:07 +01:00
constexpr Radian(Unit<orange::detail::Radian, T> value)
2022-08-12 21:18:11 +01:00
: Unit<orange::detail::Radian, T>(value)
{
}
2022-08-13 12:07:07 +01:00
template <typename U>
constexpr explicit Radian(Unit<orange::detail::Radian, U> value)
2022-08-12 21:18:11 +01:00
: Unit<orange::detail::Radian, T>(value)
{
}
2022-08-13 12:07:07 +01:00
constexpr Radian(Unit<Degree, T> value);
2022-08-12 21:18:11 +01:00
};
template <typename T>
2022-08-13 12:07:07 +01:00
constexpr Degree<T>::Degree(Unit<Radian, T> value)
2022-08-12 21:18:11 +01:00
: Unit<orange::detail::Degree, T>(T(360) * T(value) / Math::Tau)
{
}
template <typename T>
2022-08-13 12:07:07 +01:00
constexpr Radian<T>::Radian(Unit<Degree, T> value)
2022-08-12 21:18:11 +01:00
: Unit<orange::detail::Radian, T>(T(value) * Math::Tau / T(360))
{
}
}
using Radian = detail::Radian<float>;
using Degree = detail::Degree<float>;
2022-08-13 12:07:07 +01:00
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)}; }
2022-08-13 12:33:38 +01:00
struct EulerAngles
{
Radian pitch;
Radian yaw;
Radian roll;
};
2022-08-12 21:18:11 +01:00
}