Orange/include/Orange/Math/Angle.h

77 lines
1.8 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:
Degree() {}
explicit Degree(T value)
: Unit<orange::detail::Degree, T>(value)
{
}
Degree(Unit<orange::detail::Degree, T> value)
: Unit<orange::detail::Degree, T>(value)
{
}
template <class U>
explicit Degree(Unit<orange::detail::Degree, U> value)
: Unit<orange::detail::Degree, T>(value)
{
}
Degree(Unit<Radian, T> value);
};
template <typename T>
class Radian : public Unit<Radian, T>
{
public:
Radian() {}
explicit Radian(T value)
: Unit<orange::detail::Radian, T>(value)
{
}
Radian(Unit<orange::detail::Radian, T> value)
: Unit<orange::detail::Radian, T>(value)
{
}
template <class U>
explicit Radian(Unit<orange::detail::Radian, U> value)
: Unit<orange::detail::Radian, T>(value)
{
}
Radian(Unit<Degree, T> value);
};
template <typename T>
Degree<T>::Degree(Unit<Radian, T> value)
: Unit<orange::detail::Degree, T>(T(360) * T(value) / Math::Tau)
{
}
template <typename T>
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>;
}