Standard center shifts, identity shifts, and bodycentric conversions.
#include <iomanip>
#include <iostream>
using namespace qtty::literals;
using U = qtty::AstronomicalUnit;
template <typename C1, typename C2>
auto out = src.template to_center<C2>(jd);
auto back = out.template to_center<C1>(jd);
auto err = (src - back).magnitude();
<< std::setprecision(9) << out << std::noshowpos << ") roundtrip=" << std::scientific
<< std::setprecision(3) << err << std::fixed << std::endl;
}
template <typename C>
void show_bodycentric_conversion(
const char *label,
const Time<TT, JD> &jd,
auto bary = to_bodycentric(src, params, jd);
auto recovered_geo = bary.to_geocentric(jd);
auto recovered = recovered_geo.template to_center<C>(jd);
auto err = (src - recovered).magnitude();
std::cout << std::left << std::setw(12) << label << " -> " << std::setw(12) << "Bodycentric";
std::cout << " dist=" << std::fixed << std::setprecision(6) << bary.distance();
std::cout << " roundtrip=" << std::scientific << std::setprecision(3) << err << std::fixed
<< std::endl;
}
int main() {
std::cout << "Center conversion demo at JD(TT) = " << std::fixed << std::setprecision(1) << jd
<< "\n"
<< std::endl;
std::cout << "── Standard center shifts "
"─────────────────────────────────────────────\n";
show_center_conversion<Barycentric, Barycentric>(jd, p_bary);
show_center_conversion<Barycentric, Heliocentric>(jd, p_bary);
show_center_conversion<Barycentric, Geocentric>(jd, p_bary);
show_center_conversion<Heliocentric, Heliocentric>(jd, p_helio);
show_center_conversion<Heliocentric, Barycentric>(jd, p_helio);
show_center_conversion<Heliocentric, Geocentric>(jd, p_helio);
show_center_conversion<Geocentric, Geocentric>(jd, p_geo);
show_center_conversion<Geocentric, Barycentric>(jd, p_geo);
show_center_conversion<Geocentric, Heliocentric>(jd, p_geo);
std::cout << "\n── Bodycentric – Mars-like orbit (heliocentric ref) "
"───────────────────\n";
1.85_deg,
49.56_deg,
286.5_deg,
19.41_deg,
jd};
auto mars_params = BodycentricParams::heliocentric(mars_orbit);
show_bodycentric_conversion("Heliocentric", jd, p_helio, mars_params);
show_bodycentric_conversion("Barycentric", jd, p_bary, mars_params);
show_bodycentric_conversion("Geocentric", jd, p_geo, mars_params);
std::cout << "\n── Bodycentric – ISS-like orbit (geocentric ref) "
"──────────────────────\n";
51.6_deg,
0.0_deg,
0.0_deg,
0.0_deg,
jd};
auto iss_params = BodycentricParams::geocentric(iss_orbit);
show_bodycentric_conversion("Heliocentric", jd, p_helio, iss_params);
show_bodycentric_conversion("Barycentric", jd, p_bary, iss_params);
show_bodycentric_conversion("Geocentric", jd, p_geo, iss_params);
return 0;
}
tempoch::EncodedTime< Scale, Format > Time
Umbrella header for the siderust C++ wrapper library.
Parameters for a body-centric coordinate system.
A 3D Cartesian position, compile-time tagged by center, frame, unit.
Geocenter (zero-cost, Params = void).
Heliocenter (zero-cost, Params = void).
Mean ecliptic & equinox of J2000.0.