This commit is contained in:
Timur A. Fatkhullin 2025-04-17 11:58:54 +03:00
parent ea99bc721b
commit 78e1a7d71d

View File

@ -132,6 +132,29 @@ struct MccMountConfig {
};
/* PROHIBITED ZONE CONTEXT BASE CLASS */
struct MccProhibitedZoneContext {
// type of prohibited zone
enum pzgeometry_t {
PZ_MINALT, // trivial minimal altitude
PZ_MAXALT, // trivial maximal altitude (e.g. near-zenith zone for alt-azimuthal types)
PZ_ELLIPSE, // simple circular/elliptical zone
PZ_PIER_MERIDIAN, // pier-side or cross-meridian
PZ_CONVEXHULL // general convex hull polygonal zone
};
// type of input cordinates
enum pzcoords_t {
PZCOORD_RADEC, // catalog (FK5, IRCS, etc...)
PZCOORD_RADEC_APP, // apparent RA and DEC
PZCOORD_HADEC_APP, // apparent HA and DEC
PZCOORD_AZZD, // apparent azimuth and zenithal distance
};
pzgeometry_t geometryType;
pzcoords_t coordType;
};
/* MOUNT BASE TEMPLATED CLASS WITH BASIC FUNCTIONALITY */
// implements a Finite State Machine Pattern
@ -146,6 +169,12 @@ public:
enum IersDatabaseType { IERS_DB_LEAPSECS, IERS_DB_EARTH_ORIENT };
template <traits::mcc_time_duration_c DT = std::chrono::system_clock::duration>
struct pzcheck_result_t {
bool inzone{false};
DT time_to{DT::max()};
DT time_from{DT::min()};
};
/* Constructors and destructor */
@ -301,20 +330,51 @@ public:
return d_t{0};
}
// above two methods in one call
// returns a std::tuple with elements
// 0 - boolean: true - coordinates in zone, false - otherwise
// 1 - time duration to reach the zone (0 - if already in the zone, chrono::duration<>::max() if never reach the
// zone)
// 2 - time duration to exit the zone (0 - if already out of the zone, chrono::duration<>::max() if never
// exit the zone)
// returns a pzcheck_result_t with:
// .inzone = true - coordinates in zone, false - otherwise
// .time_to = time duration to reach the zone (0 - if already in the zone, chrono::duration<>::max() if never
// reach the zone)
// .time_from = time duration to exit the zone (0 - if already out of the zone, chrono::duration<>::max() if
// never exit the zone)
auto pzCheck(const MccCoordinate& xcoord,
const MccCoordinate& ycoord,
std::derived_from<MccProhibitedZoneContext> auto const& context,
traits::mcc_systime_c auto const& utc = std::chrono::system_clock::now())
{
using d_t = std::remove_cvref_t<decltype(utc)>::duration;
return std::make_tuple(false, d_t::max(), d_t{0});
return pzcheck_result_t<d_t>{.inzone = false, .time_to = d_t::max(), .time_from = d_t{0}};
}
// template <std::ranges::output_range<pzcheck_result_t> OR, std::ranges::input_range R1, std::ranges::input_range
// R2>
template <std::ranges::range OR, std::ranges::input_range R1, std::ranges::input_range R2>
auto pzCheckRange(const R1& xcoord,
const R2& ycoord,
std::derived_from<MccProhibitedZoneContext> auto const& context)
requires(std::ranges::output_range<OR, pzcheck_result_t<>> &&
std::derived_from<std::ranges::range_value_t<R1>, MccCoordinate> &&
std::derived_from<std::ranges::range_value_t<R2>, MccCoordinate>)
{
OR res;
for (auto const& [c1, c2] : std::views::zip(xcoord, ycoord)) {
auto r = pzCheck(c1, c2, context);
std::back_inserter(res) = r;
}
return res;
}
template <std::ranges::input_range R1, std::ranges::input_range R2>
auto pzCheckRange(const R1& xcoord,
const R2& ycoord,
std::derived_from<MccProhibitedZoneContext> auto const& context)
requires(std::derived_from<std::ranges::range_value_t<R1>, MccCoordinate> &&
std::derived_from<std::ranges::range_value_t<R2>, MccCoordinate>)
{
return pzCheckRange<std::vector<pzcheck_result_t<>>>(xcoord, ycoord, context);
}
// IERS databases updater