This commit is contained in:
Timur A. Fatkhullin
2025-09-02 00:45:23 +03:00
parent 3d3b57a311
commit de80acf315
7 changed files with 390 additions and 80 deletions

View File

@@ -9,6 +9,7 @@
#include <chrono>
#include "mcc_angle.h"
#include "mcc_generics.h"
namespace mcc
{
@@ -60,4 +61,80 @@ struct MccSimpleMovingModelParams {
bool dualAxisGuiding{true}; // mount must be of an equatorial type: false means guiding along only HA-axis
};
template <mcc_pzone_container_c PZoneContT>
bool mcc_is_near_pzones(PZoneContT* pz_cont,
mcc_telemetry_c auto const& tdata,
traits::mcc_time_duration_c auto const& min_timeto,
typename PZoneContT::error_t& err)
{
using res_t = std::decay_t<decltype(min_timeto)>;
std::vector<res_t> pz_timeto; // in seconds
err = pz_cont->timeToPZone(tdata, &pz_timeto);
if (err) {
return false;
}
for (auto const& t : pz_timeto) {
if (t <= min_timeto) {
return true;
}
}
return false;
}
template <mcc_pzone_container_c PZoneContT>
typename PZoneContT::error_t mcc_find_closest_pzone(PZoneContT* pz_cont,
mcc_telemetry_c auto const& tdata,
mcc_eqt_hrz_coord_c auto* closest_coords)
{
using res_t = std::decay_t<decltype(*closest_coords)>;
if (closest_coords == nullptr) {
return {};
}
res_t c;
mcc_tp2tp(tdata.time_point, c.time_point);
mcc_tp2tp(tdata.time_point, closest_coords->time_point);
closest_coords->X = std::numeric_limits<double>::quiet_NaN();
closest_coords->Y = std::numeric_limits<double>::quiet_NaN();
closest_coords->RA_APP = std::numeric_limits<double>::quiet_NaN();
closest_coords->DEC_APP = std::numeric_limits<double>::quiet_NaN();
closest_coords->HA = std::numeric_limits<double>::quiet_NaN();
closest_coords->AZ = std::numeric_limits<double>::quiet_NaN();
closest_coords->ZD = std::numeric_limits<double>::quiet_NaN();
closest_coords->ALT = std::numeric_limits<double>::quiet_NaN();
std::vector<res_t> pz_coords(c, pz_cont->sizePZones());
double dha, dha_min = std::numeric_limits<double>::max();
auto err = pz_cont->intersectPZone(tdata, &pz_coords);
if (!err) {
for (auto const& rpt : pz_coords) {
if (std::isfinite(rpt.X) && std::isfinite(rpt.Y)) {
dha = rpt.HA - tdata.HA;
if (dha < 0.0) {
dha += std::numbers::pi * 2.0;
}
if (dha < dha_min) {
dha_min = dha;
mcc_copy_eqt_hrz_coord(rpt, closest_coords);
}
}
}
}
return err;
}
} // namespace mcc