From c5d100f698c738ef3a8b075f7916e62b1048d8b5 Mon Sep 17 00:00:00 2001 From: Andrew Tribick Date: Sun, 24 Oct 2021 00:31:22 +0200 Subject: [PATCH] [qt] Fix info panel for retrograde and subsynchronous rotators --- src/celestia/qt/qtinfopanel.cpp | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/celestia/qt/qtinfopanel.cpp b/src/celestia/qt/qtinfopanel.cpp index b96f042d2..b073809ac 100644 --- a/src/celestia/qt/qtinfopanel.cpp +++ b/src/celestia/qt/qtinfopanel.cpp @@ -140,22 +140,30 @@ void InfoPanel::buildSolarSystemBodyPage(const Body* body, #endif double orbitalPeriod = 0.0; - if (body->getOrbit(t)->isPeriodic()) - orbitalPeriod = body->getOrbit(t)->getPeriod(); + const Orbit* orbit = body->getOrbit(t); + if (orbit->isPeriodic()) + orbitalPeriod = orbit->getPeriod(); // Show rotation information for natural, periodic rotators if (body->getRotationModel(t)->isPeriodic() && !isArtificial) { - double rotPeriod = body->getRotationModel(t)->getPeriod(); + const RotationModel* rotationModel = body->getRotationModel(t); + double rotPeriod = rotationModel->getPeriod(); double dayLength = 0.0; - if (body->getOrbit(t)->isPeriodic()) + bool prograde = false; + if (orbitalPeriod > 0.0) { + Vector3d axis = AngleAxisd(rotationModel->equatorOrientationAtTime(t) + * body->getBodyFrame(t)->getOrientation(t)).axis(); + Vector3d orbitNormal = body->getOrbitFrame(t)->getOrientation(t) + * orbit->positionAtTime(t).cross(orbit->velocityAtTime(t)); + prograde = axis.dot(orbitNormal) >= 0; double siderealDaysPerYear = orbitalPeriod / rotPeriod; - double solarDaysPerYear = siderealDaysPerYear - 1.0; - if (solarDaysPerYear > 0.0001) + double solarDaysPerYear = prograde ? siderealDaysPerYear - 1.0 : siderealDaysPerYear + 1.0; + if (std::abs(solarDaysPerYear) > 0.0001) { - dayLength = orbitalPeriod / (siderealDaysPerYear - 1.0); + dayLength = std::abs(orbitalPeriod / solarDaysPerYear); } } @@ -171,6 +179,11 @@ void InfoPanel::buildSolarSystemBodyPage(const Body* body, } stream << QString(_("Sidereal rotation period: %L1 %2")).arg(rotPeriod).arg(units) << "
\n"; + if (orbitalPeriod > 0.0) + { + QString direction = prograde ? _("Prograde") : _("Retrograde"); + stream << QString(_("Rotation direction: %1")).arg(direction) << "
\n"; + } if (dayLength != 0.0) { stream << QString(_("Length of day: %L1 %2")).arg(dayLength).arg(units) << "
\n"; @@ -184,7 +197,7 @@ void InfoPanel::buildSolarSystemBodyPage(const Body* body, orbitalPeriod = 365.25; OrbitalElements elements; - CalculateOsculatingElements(*body->getOrbit(t), + CalculateOsculatingElements(*orbit, t, orbitalPeriod * 1.0e-6, &elements);