mountcontrol/mcc/tests/ccte_test.cpp
2025-11-18 18:51:01 +03:00

206 lines
7.2 KiB
C++

#include <iostream>
#include <list>
#include "../mcc_ccte_erfa.h"
#include "../mcc_pzone.h"
#include "../mcc_pzone_container.h"
using namespace mcc::ccte::erfa;
int main()
{
MccCCTE_ERFA::engine_state_t state{.lat = 43.646711_degs, .lon = 41.440732_degs, .elev = 2100.0};
state.meteo = {10.0, 0.5, 1010.0};
MccCCTE_ERFA erfa(state);
std::cout << "LAT = " << mcc::MccAngle(state.lat).sexagesimal() << "\n";
std::cout << "LON = " << mcc::MccAngle(state.lon).sexagesimal() << "\n";
auto now = std::chrono::system_clock::now();
mcc::MccCelestialPoint cp{
.pair_kind = mcc::MccCoordPairKind::COORDS_KIND_RADEC_ICRS, .X = "17:20:30.44"_hms, .Y = "20:30:40.55"_dms};
mcc::MccEqtHrzCoords eqhrz;
eqhrz.time_point = now;
auto ret = erfa.transformCoordinates(cp, &eqhrz);
std::cout << "ret = " << ret.message() << "\n";
std::cout << "RA_ICRS = " << mcc::MccAngle(cp.X).sexagesimal(true) << "\n";
std::cout << "DEC_ICRS = " << mcc::MccAngle(cp.Y).sexagesimal() << "\n\n";
std::cout << "time point = " << eqhrz.time_point << "\n";
std::cout << "RA_APP = " << mcc::MccAngle(eqhrz.RA_APP).sexagesimal(true) << "\n";
std::cout << "DEC_APP = " << mcc::MccAngle(eqhrz.DEC_APP).sexagesimal() << "\n";
std::cout << "HA = " << mcc::MccAngle(eqhrz.HA).sexagesimal(true) << "\n";
std::cout << "AZ = " << mcc::MccAngle(eqhrz.AZ).sexagesimal() << "\n";
std::cout << "ZD = " << mcc::MccAngle(eqhrz.ZD).sexagesimal() << "\n";
std::cout << "ALT = " << mcc::MccAngle(eqhrz.ALT).sexagesimal() << "\n";
std::cout << "\n\n";
mcc::MccJulianDay jd;
ret = erfa.timepointToJulday(now, &jd);
std::cout << "ret = " << ret.message() << "\n";
std::cout << "JD = " << std::setprecision(12) << (double)jd << "\n";
mcc::MccAngle lst, eo;
ret = erfa.timepointToAppSideral(now, &lst, true);
std::cout << "LST = " << lst.sexagesimal(true) << "\n";
ret = erfa.equationOrigins(now, &eo);
std::cout << "EO = " << eo.sexagesimal(true) << "\n";
std::cout << "\n\n";
mcc::MccAltLimitPZ<mcc::MccAltLimitKind::MIN_ALT_LIMIT> altmin(10.0_degs, state.lat, &erfa);
bool inzone;
std::cout << "time point = " << eqhrz.time_point << "\n";
ret = altmin.inPZone(eqhrz, &inzone);
std::cout << "ret = " << ret.message() << "\n";
std::cout << "ALTMIN: inZone = " << std::boolalpha << inzone << "\n";
std::chrono::duration<double> dsec;
ret = altmin.timeToPZone(eqhrz, &dsec);
std::cout << "ret = " << ret.message() << "\n";
std::cout << "TIME TO ZONE: " << dsec << " ("
<< now + std::chrono::duration_cast<std::chrono::system_clock::duration>(dsec) << ")\n";
mcc::MccCelestialPoint icp{.pair_kind = mcc::MccCoordPairKind::COORDS_KIND_AZALT, .time_point = now};
ret = altmin.intersectPZone(eqhrz, &icp);
std::cout << "ret = " << ret.message() << "\n";
std::cout << "INTERSEC AZ = " << mcc::MccAngle(icp.X).sexagesimal() << "\n";
std::cout << "INTERSEC ALT = " << mcc::MccAngle(icp.Y).sexagesimal() << "\n";
mcc::MccAltLimitPZ<mcc::MccAltLimitKind::MAX_ALT_LIMIT> altmax(80.0_degs, state.lat, &erfa);
mcc::MccPZoneContainer<std::chrono::duration<double>> pzcont;
pzcont.addPZone(altmin);
pzcont.addPZone(altmax);
// std::vector<std::chrono::duration<double, std::ratio<60>>> vm;
std::vector<std::chrono::minutes> vm;
std::list<bool> lb;
bool cf;
ret = pzcont.inPZone(eqhrz, &cf, &lb);
std::cout << "ret = " << ret.message() << "\n";
std::cout << std::boolalpha;
std::cout << "IN ZONE 1: " << lb.front() << "\n";
std::cout << "IN ZONE 2: " << lb.back() << "\n";
std::cout << "COMMON IN ZONE 1,2: " << cf << "\n";
ret = pzcont.timeToPZone(eqhrz, &vm);
std::cout << "ret = " << ret.message() << "\n";
std::cout << "TIME TO ZONE 1: " << vm[0] << "\n";
std::cout << "TIME TO ZONE 2: " << vm[1] << "\n";
std::vector<mcc::MccCelestialPoint> vpt(
2, {.pair_kind = mcc::MccCoordPairKind::COORDS_KIND_AZZD, .time_point = eqhrz.time_point});
ret = pzcont.intersectPZone(eqhrz, &vpt);
std::cout << "ret = " << ret.message() << "\n";
if (!ret) {
std::cout << "INTERSC POINT 1: AZ = " << mcc::MccAngle(vpt[0].X).sexagesimal()
<< ", ZD = " << mcc::MccAngle(vpt[0].Y).sexagesimal() << "\n";
std::cout << "INTERSC POINT 2: AZ = " << mcc::MccAngle(vpt[1].X).sexagesimal()
<< ", ZD = " << mcc::MccAngle(vpt[1].Y).sexagesimal() << "\n";
}
std::cout << "\n\n";
MccCCTE_ERFA::meteo_t meteo{.temperature = 10.0, .humidity = 0.7, .pressure = 1010.0};
erfa.updateMeteoERFA(meteo);
MccCCTE_ERFA::refract_model_t rm;
erfa.refractionModel(&rm);
std::cout << "REFMODEL: A = " << rm.refa << ", B = " << rm.refb << "\n";
cp.pair_kind = mcc::MccCoordPairKind::COORDS_KIND_AZZD;
cp.X = 100.0_degs;
cp.Y = 45.0_degs;
double dZ;
erfa.refractionCorrection(cp, &dZ);
std::cout << "dZ(" << mcc::MccAngle(cp.Y).degrees() << ") = " << mcc::MccAngle(dZ).arcsecs() << "\n";
cp.Y = 50.0_degs;
erfa.refractionCorrection(cp, &dZ);
std::cout << "dZ(" << mcc::MccAngle(cp.Y).degrees() << ") = " << mcc::MccAngle(dZ).arcsecs() << "\n";
std::cout << "\n\n";
// std::string sc2{" 11:34:21.21 , 104.4567892"};
std::string sc2{" 11:34:21.21 , 1.044567892E02"};
auto p2 = mcc::utils::parseAnglePair(sc2);
std::cout << "ORIG STR: '" << sc2 << "'\n";
std::cout << p2.first << "; " << p2.second << "\n";
mcc::MccAngle a1{p2.first, mcc::MccDegreeTag{}};
mcc::MccAngle a2{p2.second, mcc::MccDegreeTag{}};
std::cout << a1.sexagesimal() << "\n" << a2.sexagesimal() << "\n";
std::cout << "\n\n";
std::memset(&eqhrz, 0, sizeof(eqhrz));
eqhrz.X = "12:13:10.08"_hms;
eqhrz.Y = "0:07:39.5"_dms;
eqhrz.X = "00:00:0.0"_hms;
eqhrz.Y = "00:00:00.0"_dms;
// eqhrz.pair_kind = mcc::MccCoordPairKind::COORDS_KIND_RADEC_APP;
// eqhrz.pair_kind = mcc::MccCoordPairKind::COORDS_KIND_RADEC_ICRS;
eqhrz.pair_kind = mcc::MccCoordPairKind::COORDS_KIND_AZZD;
eqhrz.time_point = std::chrono::system_clock::now();
erfa.transformCoordinates(eqhrz, &eqhrz);
// std::cout << "RA_ICRS = " << mcc::MccAngle(cp.X).sexagesimal(true) << "\n";
// std::cout << "DEC_ICRS = " << mcc::MccAngle(cp.Y).sexagesimal() << "\n\n";
std::cout << "time point = " << eqhrz.time_point << "\n";
std::cout << "RA_APP = " << mcc::MccAngle(eqhrz.RA_APP).sexagesimal(true) << "\n";
std::cout << "DEC_APP = " << mcc::MccAngle(eqhrz.DEC_APP).sexagesimal() << "\n";
std::cout << "HA = " << mcc::MccAngle(eqhrz.HA).sexagesimal(true) << "\n";
std::cout << "AZ = " << mcc::MccAngle(eqhrz.AZ).sexagesimal() << "\n";
std::cout << "ZD = " << mcc::MccAngle(eqhrz.ZD).sexagesimal() << "\n";
std::cout << "ALT = " << mcc::MccAngle(eqhrz.ALT).sexagesimal() << "\n";
// std::cout << "\n";
// std::cout << "\n";
// state.meteo = {10.0, 0.5, 0.0}; // refraction must be 0!!!
// erfa.setStateERFA(state);
// eqhrz.X = "00:00:0.0"_hms;
// eqhrz.Y = "60:00:00.0"_dms;
// // restore useful quantities
// state.meteo = {10.0, 0.5, 1010.0};
// erfa.setStateERFA(state);
return 0;
}