8namespace Stroika::Foundation::Math {
15 inline constexpr Angle::Angle ()
19 inline constexpr Angle::Angle (RepType angle, AngleFormat angleFormat)
20 : fAngleInRadians_{(angleFormat == AngleFormat::eRadians)
22 : ((angleFormat == AngleFormat::eDegrees) ? (angle * (2 * numbers::pi_v<RepType>) / 360.0)
23 : (angle * (2 * numbers::pi_v<RepType>) / 400.0))}
25 using namespace Common;
26 Require (ToInt (AngleFormat::eSTART) <= ToInt (angleFormat) and ToInt (angleFormat) < ToInt (AngleFormat::eEND));
28 inline constexpr Angle::RepType Angle::AsRadians ()
const
30 return fAngleInRadians_;
32 inline constexpr Angle::RepType Angle::AsDegrees ()
const
34 return fAngleInRadians_ * 360.0 / (2 * numbers::pi_v<RepType>);
36 inline constexpr Angle::RepType Angle::AsGradians ()
const
38 return fAngleInRadians_ * 400.0 / (2 * numbers::pi_v<RepType>);
40 inline const Angle& Angle::operator+= (
const Angle& rhs)
42 fAngleInRadians_ += rhs.AsRadians ();
45 inline const Angle& Angle::operator-= (
const Angle& rhs)
47 fAngleInRadians_ -= rhs.AsRadians ();
50 inline const Angle& Angle::operator*= (RepType rhs)
52 fAngleInRadians_ *= rhs;
55 inline const Angle& Angle::operator/= (RepType rhs)
57 fAngleInRadians_ /= rhs;
66 constexpr Angle operator+ (
const Angle& lhs,
const Angle& rhs)
68 return Angle{lhs.AsRadians () + rhs.AsRadians (), Angle::eRadians};
70 constexpr Angle operator- (
const Angle& lhs,
const Angle& rhs)
72 return Angle{lhs.AsRadians () - rhs.AsRadians (), Angle::eRadians};
74 constexpr Angle operator* (
const Angle& lhs, Angle::RepType rhs)
76 return Angle{lhs.AsRadians () * rhs, Angle::eRadians};
78 constexpr Angle operator/ (
const Angle& lhs, Angle::RepType rhs)
80 return Angle{lhs.AsRadians () / rhs, Angle::eRadians};
82 constexpr Angle operator* (
double lhs,
const Angle& rhs)
84 return Angle{lhs * rhs.AsRadians (), Angle::eRadians};
86 constexpr Angle operator* (
const Angle& lhs,
const Angle& rhs)
88 return Angle{lhs.AsRadians () * rhs.AsRadians (), Angle::eRadians};
96 inline namespace Literals {
97 constexpr Angle
operator""_deg (
long double n)
noexcept
99 return Angle{
static_cast<Angle::RepType
> (n), Angle::eDegrees};
101 constexpr Angle
operator""_deg (
unsigned long long int n)
noexcept
103 return Angle{
static_cast<Angle::RepType
> (n), Angle::eDegrees};
105 constexpr Angle
operator""_rad (
long double n)
noexcept
107 return Angle{
static_cast<Angle::RepType
> (n), Angle::eRadians};
109 constexpr Angle
operator""_rad (
unsigned long long int n)
noexcept
111 return Angle{
static_cast<Angle::RepType
> (n), Angle::eRadians};
120 constexpr Angle Min (
const Angle& a1,
const Angle& a2)
122 return (a1 < a2) ? a1 : a2;
130 constexpr Angle Max (
const Angle& a1,
const Angle& a2)
132 return (a1 > a2) ? a1 : a2;