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