...
This commit is contained in:
131
cxx/utils.h
131
cxx/utils.h
@@ -1,6 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
#include <charconv>
|
||||
#include <cmath>
|
||||
#include <numbers>
|
||||
#include <ranges>
|
||||
#include <regex>
|
||||
|
||||
@@ -140,4 +142,133 @@ static std::optional<double> parsAngleString(R&& r, bool hms = false)
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
|
||||
static constexpr auto deg2radCoeff = std::numbers::pi / 180.0;
|
||||
|
||||
// radians to degrees
|
||||
template <bool NORM = false>
|
||||
static double rad2deg(double ang)
|
||||
{
|
||||
auto r = ang / deg2radCoeff;
|
||||
|
||||
if constexpr (NORM) {
|
||||
return std::fmod(r, 360.0);
|
||||
} else {
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
template <std::ranges::output_range<char> R, bool NORM = false>
|
||||
static R rad2deg_str(double ang, int prec = 2)
|
||||
{
|
||||
R res;
|
||||
|
||||
std::string fmt = "{:0." + std::to_string(prec) + "f}";
|
||||
|
||||
auto degs = rad2deg<NORM>(ang);
|
||||
|
||||
std::vformat_to(std::back_inserter(res), {fmt.begin(), fmt.end()}, degs);
|
||||
}
|
||||
|
||||
template <bool NORM = false>
|
||||
static std::string rad2deg_str(double ang, int prec = 2)
|
||||
{
|
||||
return rad2deg_str<std::string, NORM>(ang, prec);
|
||||
}
|
||||
|
||||
|
||||
template <std::ranges::output_range<char> R, bool NORM = false>
|
||||
static R rad2deg_str(double ang1, double ang2, std::string_view delim = ",", int prec1 = 2, int prec2 = 2)
|
||||
{
|
||||
R res = rad2deg_str<R, NORM>(ang1, prec1);
|
||||
|
||||
R r = rad2deg_str<R, NORM>(ang2, prec2);
|
||||
|
||||
std::ranges::copy(std::back_inserter(res), delim);
|
||||
std::ranges::copy(std::back_inserter(res), r);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
template <bool NORM = false>
|
||||
static std::string rad2deg_str(double ang1, double ang2, std::string_view delim = ",", int prec1 = 2, int prec2 = 2)
|
||||
{
|
||||
return rad2deg_str<std::string, NORM>(ang1, ang2, delim, prec1, prec2);
|
||||
}
|
||||
|
||||
// radians to sexagesimal
|
||||
template <std::ranges::output_range<char> R, bool NORM = false>
|
||||
static R rad2sxg(double ang, bool hms = false, int prec = 2)
|
||||
{
|
||||
R res;
|
||||
|
||||
std::string fmt = "{:02d}:{:02d}:{:0" + std::to_string(prec + 3) + "." + std::to_string(prec) + "f}";
|
||||
|
||||
auto degs = rad2deg<NORM>(std::abs(ang));
|
||||
if (hms) {
|
||||
degs /= 15.0;
|
||||
}
|
||||
|
||||
auto d = std::trunc(degs);
|
||||
auto s = (degs - d) * 60.0;
|
||||
auto m = std::trunc(s);
|
||||
s = (s - m) * 60.0;
|
||||
|
||||
if (ang < 0) {
|
||||
std::ranges::copy(std::string_view("-"), std::back_inserter(res));
|
||||
}
|
||||
|
||||
std::vformat_to(std::back_inserter(res), {fmt.begin(), fmt.end()}, d, m, s);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
template <bool NORM = false>
|
||||
static std::string rad2sxg(double ang, bool hms = false, int prec = 2)
|
||||
{
|
||||
return rad2sxg<std::string, NORM>(ang, hms, prec);
|
||||
}
|
||||
|
||||
|
||||
template <std::ranges::output_range<char> R, bool NORM = false>
|
||||
static R RADEC_rad2sxg(double ra, double dec, std::string_view delim = ",", int ra_prec = 2, int dec_prec = 1)
|
||||
{
|
||||
R res = rad2sxg<R, NORM>(ra, true, ra_prec);
|
||||
|
||||
R r = rad2sxg(dec, false, dec_prec);
|
||||
|
||||
std::ranges::copy(std::back_inserter(res), delim);
|
||||
std::ranges::copy(std::back_inserter(res), r);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
template <bool NORM = false>
|
||||
static std::string RADEC_rad2sxg(double ra, double dec, std::string_view delim = ",", int ra_prec = 2, int dec_prec = 1)
|
||||
{
|
||||
return RADEC_rad2sxg<std::string, NORM>(ra, dec, delim, ra_prec, dec_prec);
|
||||
}
|
||||
|
||||
|
||||
template <std::ranges::output_range<char> R, bool NORM = false>
|
||||
static R AZZD_rad2sxg(double az, double zd, std::string_view delim = ",", int az_prec = 2, int zd_prec = 1)
|
||||
{
|
||||
R res = rad2sxg<R, NORM>(az, false, az_prec);
|
||||
|
||||
R r = rad2sxg(zd, false, zd_prec);
|
||||
|
||||
std::ranges::copy(std::back_inserter(res), delim);
|
||||
std::ranges::copy(std::back_inserter(res), r);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
template <bool NORM = false>
|
||||
static std::string AZZD_rad2sxg(double az, double zd, std::string_view delim = ",", int az_prec = 2, int zd_prec = 1)
|
||||
{
|
||||
return AZZD_rad2sxg<std::string, NORM>(az, zd, delim, az_prec, zd_prec);
|
||||
}
|
||||
|
||||
|
||||
} // namespace mcc::utils
|
||||
|
||||
Reference in New Issue
Block a user