...
This commit is contained in:
132
mcc/mcc_pzone.h
132
mcc/mcc_pzone.h
@@ -114,6 +114,24 @@ public:
|
||||
return MccAltLimitPZErrorCode::ERROR_COORD_TRANSFROM;
|
||||
}
|
||||
};
|
||||
|
||||
_transformCoordinatesEqtHrzCoords = [ccte_engine](MccCelestialPoint from_pt,
|
||||
MccEqtHrzCoords* to_pt) -> error_t {
|
||||
if (to_pt == nullptr) {
|
||||
return MccAltLimitPZErrorCode::ERROR_NULLPTR;
|
||||
}
|
||||
|
||||
auto err = ccte_engine->transformCoordinates(from_pt, to_pt);
|
||||
if (!err) {
|
||||
return MccAltLimitPZErrorCode::ERROR_OK;
|
||||
}
|
||||
|
||||
if (std::same_as<decltype(err), error_t>) {
|
||||
return err;
|
||||
} else {
|
||||
return MccAltLimitPZErrorCode::ERROR_COORD_TRANSFROM;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -278,11 +296,79 @@ public:
|
||||
return ret;
|
||||
}
|
||||
|
||||
template <typename InputT>
|
||||
error_t intersectPZone(InputT coords, mcc_celestial_point_c auto* point)
|
||||
requires(mcc_eqt_hrz_coord_c<InputT> || mcc_celestial_point_c<InputT>)
|
||||
// template <typename InputT>
|
||||
// error_t intersectPZone(InputT coords, mcc_celestial_point_c auto* point)
|
||||
// requires(mcc_eqt_hrz_coord_c<InputT> || mcc_celestial_point_c<InputT>)
|
||||
// {
|
||||
// // double ha, dec, az;
|
||||
// double dec, az;
|
||||
|
||||
// if (point == nullptr) {
|
||||
// return MccAltLimitPZErrorCode::ERROR_NULLPTR;
|
||||
// }
|
||||
|
||||
// error_t ret = MccAltLimitPZErrorCode::ERROR_OK;
|
||||
|
||||
// if constexpr (mcc_eqt_hrz_coord_c<InputT>) {
|
||||
// // ha = coords.HA;
|
||||
// dec = coords.DEC_APP;
|
||||
// } else {
|
||||
// MccCelestialPoint to_pt{.pair_kind = MccCoordPairKind::COORDS_KIND_HADEC_APP};
|
||||
// mcc_tp2tp(coords.time_point, to_pt.time_point);
|
||||
|
||||
// ret = getCoord(coords, &to_pt);
|
||||
// if (ret) {
|
||||
// return ret;
|
||||
// }
|
||||
|
||||
// // ha = to_pt.X;
|
||||
// dec = to_pt.Y;
|
||||
// }
|
||||
|
||||
// double sinDec = sin(dec), cosDec = cos(dec);
|
||||
|
||||
// auto cos_ha = (_sinAlim - sinDec * _sinLat) / cosDec / _cosLat;
|
||||
|
||||
// if (cos_ha > 1.0) { // no intersection
|
||||
// // point->pair_kind = MccCoordPairKind::COORDS_KIND_GENERIC;
|
||||
// point->X = std::numeric_limits<double>::quiet_NaN();
|
||||
// point->Y = std::numeric_limits<double>::quiet_NaN();
|
||||
|
||||
// return ret;
|
||||
// }
|
||||
|
||||
// // WARNNIG: THE EXPRESSION ASSUMES THAT AZIMUTH IS COUNTED FROM THE SOUTH THROUGH THE WEST!!!
|
||||
// double cosA = (-sinDec * _cosLat + cosDec * _sinLat * cos_ha) / _cosALim;
|
||||
|
||||
// if constexpr (KIND ==
|
||||
// MccAltLimitKind::MIN_ALT_LIMIT) { // the closest time point is one after upper culmination
|
||||
// az = std::acos(cosA);
|
||||
// } else if constexpr (KIND == MccAltLimitKind::MAX_ALT_LIMIT) { // the closest time point is one before upper
|
||||
// // culmination
|
||||
// az = -std::acos(cosA);
|
||||
// }
|
||||
|
||||
// MccCelestialPoint pt{.pair_kind = MccCoordPairKind::COORDS_KIND_AZALT, .X = az, .Y = _altLimit};
|
||||
// mcc_tp2tp(coords.time_point, pt.time_point);
|
||||
|
||||
// MccCelestialPoint to_pt{.pair_kind = point->pair_kind};
|
||||
// mcc_tp2tp(point->time_point, to_pt.time_point);
|
||||
|
||||
// ret = _transformCoordinates(pt, &to_pt);
|
||||
// if (!ret) {
|
||||
// point->X = MccAngle(to_pt.X).normalize<MccAngle::NORM_KIND_0_360>();
|
||||
// point->Y = MccAngle(to_pt.Y).normalize<MccAngle::NORM_KIND_90_90>();
|
||||
// }
|
||||
|
||||
// return ret;
|
||||
// }
|
||||
|
||||
template <typename InputT, typename ResultT>
|
||||
error_t intersectPZone(InputT coords, ResultT* point)
|
||||
requires((mcc_eqt_hrz_coord_c<InputT> || mcc_celestial_point_c<InputT>) &&
|
||||
(mcc_eqt_hrz_coord_c<ResultT> || mcc_celestial_point_c<ResultT>))
|
||||
{
|
||||
double ha, dec, az;
|
||||
double dec, az;
|
||||
|
||||
if (point == nullptr) {
|
||||
return MccAltLimitPZErrorCode::ERROR_NULLPTR;
|
||||
@@ -291,7 +377,7 @@ public:
|
||||
error_t ret = MccAltLimitPZErrorCode::ERROR_OK;
|
||||
|
||||
if constexpr (mcc_eqt_hrz_coord_c<InputT>) {
|
||||
ha = coords.HA;
|
||||
// ha = coords.HA;
|
||||
dec = coords.DEC_APP;
|
||||
} else {
|
||||
MccCelestialPoint to_pt{.pair_kind = MccCoordPairKind::COORDS_KIND_HADEC_APP};
|
||||
@@ -302,7 +388,7 @@ public:
|
||||
return ret;
|
||||
}
|
||||
|
||||
ha = to_pt.X;
|
||||
// ha = to_pt.X;
|
||||
dec = to_pt.Y;
|
||||
}
|
||||
|
||||
@@ -310,11 +396,20 @@ public:
|
||||
|
||||
auto cos_ha = (_sinAlim - sinDec * _sinLat) / cosDec / _cosLat;
|
||||
|
||||
if (cos_ha > 1.0) { // no intersection
|
||||
if (cos_ha > 1.0) { // no intersection (outputs are all NaN)
|
||||
// point->pair_kind = MccCoordPairKind::COORDS_KIND_GENERIC;
|
||||
point->X = std::numeric_limits<double>::quiet_NaN();
|
||||
point->Y = std::numeric_limits<double>::quiet_NaN();
|
||||
|
||||
if constexpr (mcc_eqt_hrz_coord_c<ResultT>) {
|
||||
point->HA = std::numeric_limits<double>::quiet_NaN();
|
||||
point->RA_APP = std::numeric_limits<double>::quiet_NaN();
|
||||
point->DEC_APP = std::numeric_limits<double>::quiet_NaN();
|
||||
point->AZ = std::numeric_limits<double>::quiet_NaN();
|
||||
point->ZD = std::numeric_limits<double>::quiet_NaN();
|
||||
point->ALT = std::numeric_limits<double>::quiet_NaN();
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -332,13 +427,23 @@ public:
|
||||
MccCelestialPoint pt{.pair_kind = MccCoordPairKind::COORDS_KIND_AZALT, .X = az, .Y = _altLimit};
|
||||
mcc_tp2tp(coords.time_point, pt.time_point);
|
||||
|
||||
MccCelestialPoint to_pt{.pair_kind = point->pair_kind};
|
||||
mcc_tp2tp(point->time_point, to_pt.time_point);
|
||||
if constexpr (mcc_eqt_hrz_coord_c<ResultT>) {
|
||||
MccEqtHrzCoords to_pt;
|
||||
mcc_tp2tp(point->time_point, to_pt.time_point);
|
||||
ret = _transformCoordinates(pt, &to_pt);
|
||||
|
||||
ret = _transformCoordinates(pt, &to_pt);
|
||||
if (!ret) {
|
||||
point->X = MccAngle(to_pt.X).normalize<MccAngle::NORM_KIND_0_360>();
|
||||
point->Y = MccAngle(to_pt.Y).normalize<MccAngle::NORM_KIND_90_90>();
|
||||
if (!ret) {
|
||||
mcc_copy_eqt_hrz_coord(to_pt, point);
|
||||
}
|
||||
} else {
|
||||
MccCelestialPoint to_pt{.pair_kind = point->pair_kind};
|
||||
mcc_tp2tp(point->time_point, to_pt.time_point);
|
||||
|
||||
ret = _transformCoordinates(pt, &to_pt);
|
||||
if (!ret) {
|
||||
point->X = MccAngle(to_pt.X).normalize<MccAngle::NORM_KIND_0_360>();
|
||||
point->Y = MccAngle(to_pt.Y).normalize<MccAngle::NORM_KIND_90_90>();
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
@@ -349,6 +454,7 @@ protected:
|
||||
double _cosLat, _sinLat, _absLat, _latLim;
|
||||
|
||||
std::function<error_t(MccCelestialPoint, MccCelestialPoint*)> _transformCoordinates{};
|
||||
std::function<error_t(MccCelestialPoint, MccEqtHrzCoords*)> _transformCoordinatesEqtHrzCoords{};
|
||||
|
||||
error_t getCoord(mcc_celestial_point_c auto const& from_pt, MccCelestialPoint* to_pt)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user