This commit is contained in:
2025-06-15 13:15:32 +03:00
parent a43b6587b6
commit 98d5fa007f
4 changed files with 132 additions and 44 deletions

View File

@@ -70,15 +70,34 @@ public:
MccAngle() = default;
// by default angle is in radians
MccAngle(std::convertible_to<double> auto const& val, const MccRadianTag = MccRadianTag{}) : _angleInRads(val) {}
// MccAngle(std::convertible_to<double> auto const& val, const MccRadianTag = MccRadianTag{}) : _angleInRads(val) {}
// construct angle in degrees, e.g.:
// auto ang = MccAngle{180.0, mcc_degrees};
MccAngle(std::convertible_to<double> auto const& val, const MccDegreeTag)
// MccAngle(std::convertible_to<double> auto const& val, const MccDegreeTag)
// {
// _angleInRads = val * utils::deg2radCoeff;
// }
// by default angle is in radians
template <typename T>
MccAngle(const T& val, const MccRadianTag = MccRadianTag{})
requires std::is_arithmetic_v<T>
: _angleInRads(val)
{
_angleInRads = val * utils::deg2radCoeff;
}
// construct angle in degrees, e.g.:
// auto ang = MccAngle{180.0, mcc_degrees};
template <typename T>
MccAngle(const T& val, const MccDegreeTag)
requires std::is_arithmetic_v<T>
: _angleInRads(val * utils::deg2radCoeff)
{
}
// constuct angle from sexagesimal representation or floating-point number of degrees, e.g.:
// auto ang = MccAngle{"-12:34:56.789"}; // from degrees:minutes:seconds
// auto ang = MccAngle{"123.574698"}; // from degrees
@@ -144,23 +163,17 @@ public:
return *this;
}
MccAngle& normalize()
{
return normalize<NORM_KIND_0_360>();
}
MccAngle& normalize() { return normalize<NORM_KIND_0_360>(); }
template <typename T>
operator T() const
requires std::is_arithmetic_v<T>
{
return _angleInRads;
}
// template <typename T>
// operator T() const
// requires std::is_arithmetic_v<T>
// {
// return _angleInRads;
// }
operator double() const
{
return _angleInRads;
}
operator double() const { return _angleInRads; }
template <typename T>
@@ -169,21 +182,15 @@ public:
return _angleInRads * 180.0 / std::numbers::pi;
}
double degrees() const
{
return degrees<double>();
}
double degrees() const { return degrees<double>(); }
template <traits::mcc_output_char_range T>
T sexagesimal(bool hms, int prec = 2) const
T sexagesimal(bool hms = false, int prec = 2) const
{
return utils::rad2sxg(_angleInRads, hms, prec >= 0 ? prec : _precision);
}
std::string sexagesimal(bool hms, int prec = 2) const
{
return sexagesimal<std::string>(hms, prec);
}
std::string sexagesimal(bool hms = false, int prec = 2) const { return sexagesimal<std::string>(hms, prec); }
// arithmetics
@@ -256,7 +263,7 @@ auto operator+(const T1& v1, const T2& v2)
{
static_assert(std::convertible_to<T1, T2> || std::convertible_to<T2, T1>, "INCOMPATIBLE TYPES!");
using res_t = std::conditional_t<std::convertible_to<T1, T2>, T1, T2>;
using res_t = std::conditional_t<std::convertible_to<T1, T2> && std::derived_from<T1, MccAngle>, T1, T2>;
return res_t{(double)v1 + (double)v2};
}
@@ -266,7 +273,7 @@ auto operator-(const T1& v1, const T2& v2)
{
static_assert(std::convertible_to<T1, T2> || std::convertible_to<T2, T1>, "INCOMPATIBLE TYPES!");
using res_t = std::conditional_t<std::convertible_to<T1, T2>, T1, T2>;
using res_t = std::conditional_t<std::convertible_to<T1, T2> && std::derived_from<T1, MccAngle>, T1, T2>;
return res_t{(double)v1 - (double)v2};
}
@@ -324,23 +331,18 @@ class MccAngleAZ : public MccAngle
using MccAngle::MccAngle;
};
class MccAngleALT;
struct MccAngleALT; // just forward declaration
class MccAngleZD : public MccAngle
{
struct MccAngleZD : public MccAngle {
using MccAngle::MccAngle;
MccAngleZD(const MccAngleALT&);
};
class MccAngleALT : public MccAngle
{
struct MccAngleALT : public MccAngle {
using MccAngle::MccAngle;
MccAngleALT(const MccAngleZD& zd)
{
_angleInRads = std::numbers::pi / 2.0 - (double)zd;
}
MccAngleALT(const MccAngleZD& zd) { _angleInRads = std::numbers::pi / 2.0 - (double)zd; }
};