This commit is contained in:
2025-07-09 18:47:13 +03:00
parent d663f6b54a
commit 6646ef6aca
7 changed files with 339 additions and 148 deletions

View File

@@ -80,7 +80,9 @@ public:
typedef MccAngle coord_t;
typedef MccAngle sideral_time_t;
// typedef juldate_t terr_time_t;
typedef MccAngle pa_t;
typedef MccAngle eo_t;
struct refract_result_t {
double refa, refb;
@@ -156,34 +158,67 @@ public:
}
engine_err_t apparentSiderTime(juldate_t juldate, sideral_time_t& gst, bool islocal = false)
engine_err_t terrestialTime(juldate_t juldate, juldate_t& tt)
{
std::lock_guard lock{_stateMutex};
using real_days_t = std::chrono::duration<double, std::ratio<86400>>;
double ut1 = juldate.mjd, tt = juldate.mjd;
auto dut1 = _currentState._bulletinA.DUT1(juldate.mjd);
if (dut1.has_value()) {
ut1 += std::chrono::duration_cast<real_days_t>(dut1.value()).count();
} else { // out of range
return ERROR_BULLETINA_OUT_OF_RANGE;
}
auto tai_utc = _currentState._leapSeconds[juldate.mjd];
if (tai_utc.has_value()) {
tt += std::chrono::duration_cast<real_days_t>(tai_utc.value()).count();
tt.mjd += std::chrono::duration_cast<real_days_t>(tai_utc.value()).count();
} else {
return ERROR_LEAPSECONDS_OUT_OF_RANGE;
}
auto tt_tai = _currentState._bulletinA.TT_TAI();
tt += std::chrono::duration_cast<real_days_t>(tt_tai).count();
tt.mjd = juldate.mjd + std::chrono::duration_cast<real_days_t>(tt_tai).count();
gst = eraGst06a(juldate.MJD0, ut1, juldate.MJD0, tt);
return ERROR_OK;
}
engine_err_t apparentSiderTime(juldate_t juldate, sideral_time_t& gst, bool islocal = false)
{
// std::lock_guard lock{_stateMutex};
using real_days_t = std::chrono::duration<double, std::ratio<86400>>;
double ut1 = juldate.mjd;
// double tt = juldate.mjd;
{
std::lock_guard lock{_stateMutex};
auto dut1 = _currentState._bulletinA.DUT1(juldate.mjd);
if (dut1.has_value()) {
ut1 += std::chrono::duration_cast<real_days_t>(dut1.value()).count();
} else { // out of range
return ERROR_BULLETINA_OUT_OF_RANGE;
}
}
// auto tai_utc = _currentState._leapSeconds[juldate.mjd];
// if (tai_utc.has_value()) {
// tt += std::chrono::duration_cast<real_days_t>(tai_utc.value()).count();
// } else {
// return ERROR_LEAPSECONDS_OUT_OF_RANGE;
// }
// auto tt_tai = _currentState._bulletinA.TT_TAI();
// tt += std::chrono::duration_cast<real_days_t>(tt_tai).count();
// gst = eraGst06a(juldate.MJD0, ut1, juldate.MJD0, tt);
juldate_t tt;
auto err = terrestialTime(juldate, tt);
if (err != ERROR_OK) {
return err;
}
gst = eraGst06a(juldate.MJD0, ut1, juldate.MJD0, tt.mjd);
if (islocal) {
gst += _currentState.lon;
}
@@ -192,6 +227,20 @@ public:
}
engine_err_t eqOrigins(juldate_t juldate, eo_t& eo)
{
juldate_t tt;
auto err = terrestialTime(juldate, tt);
if (err != ERROR_OK) {
return err;
}
eo = eraEo06a(tt.MJD0, tt.mjd);
return ERROR_OK;
}
/* atmospheric refraction-related methods */
engine_err_t refraction(refract_result_t& refr)
@@ -205,6 +254,18 @@ public:
}
engine_err_t refractCorrection(const coord_t& alt, const refract_result_t& ref_params, coord_t& corr)
{
if (alt <= 0.0) {
corr = 35.4 / 60.0 * std::numbers::pi / 180.0; // 35.4 arcminutes
} else {
auto tanALT = std::tan(alt);
corr = ref_params.refa / tanALT + ref_params.refb / tanALT / tanALT / tanALT;
}
return ERROR_OK;
}
/* coordinates conversional methods */
engine_err_t icrs2obs(coord_t ra,