Line data Source code
1 : /**
2 : * @file
3 : * @brief Conversions between radians and degrees.
4 : */
5 : #pragma once
6 :
7 : #include <AH/STL/type_traits>
8 : #include <AH/Settings/NamespaceSettings.hpp>
9 :
10 : BEGIN_AH_NAMESPACE
11 :
12 : namespace detail {
13 : constexpr long double pi_inv_l = 0.318309886183790671537767526745028724L;
14 : constexpr long double pi_l = 3.141592653589793238462643383279502884L;
15 : } // namespace detail
16 :
17 : /// @addtogroup AH_Math
18 : /// @{
19 :
20 : /// Convert radians to degrees.
21 : template <class T>
22 : constexpr inline
23 : typename std::enable_if<std::is_floating_point<T>::value, T>::type
24 4 : rad2deg(T r) {
25 4 : return r * static_cast<T>(detail::pi_inv_l) * 180;
26 : }
27 : /// Convert degrees to radians.
28 : template <class T>
29 : constexpr inline
30 : typename std::enable_if<std::is_floating_point<T>::value, T>::type
31 499718 : deg2rad(T d) {
32 499718 : return d * static_cast<T>(detail::pi_l) / 180;
33 : }
34 :
35 : /// Convert degrees to radians, e.g. 10_deg.
36 1 : constexpr long double operator"" _deg(long double deg) { return deg2rad(deg); }
37 : /// Convert degrees to radians, e.g. 10_deg.
38 499714 : constexpr long double operator"" _deg(unsigned long long deg) {
39 499714 : return deg2rad(static_cast<long double>(deg));
40 : }
41 :
42 : /// @}
43 :
44 : END_AH_NAMESPACE
|