...
This commit is contained in:
@@ -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; }
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user