77 lines
1.8 KiB
C++
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>;
|
|
} |