Warning, /education/kstars/README.planetmath is written in an unsupported language. File is not indexed.
0001 README.planetmath: Understanding Planetary Positions in KStars.
0002 copyright 2002 by Jason Harris and the KStars team.
0003 This document is licensed under the terms of the GNU Free Documentation License
0004 -------------------------------------------------------------------------------
0005
0006
0007 0. Introduction: Why are the calculations so complicated?
0008
0009 We all learned in school that planets orbit the Sun on simple, beautiful
0010 elliptical orbits. It turns out this is only true to first order. It
0011 would be precisely true only if there was only one planet in the Solar System,
0012 and if both the Planet and the Sun were perfect point masses. In reality,
0013 each planet's orbit is constantly perturbed by the gravity of the other planets
0014 and moons. Since the distances to these other bodies change in a complex way,
0015 the orbital perturbations are also complex. In fact, any time you have more
0016 than two masses interacting through mutual gravitational attraction, it is
0017 *not possible* to find a general analytic solution to their orbital motion.
0018 The best you can do is come up with a numerical model that predicts the orbits
0019 pretty well, but imperfectly.
0020
0021
0022 1. The Theory, Briefly
0023
0024 We use the VSOP ("Variations Seculaires des Orbites Planetaires") theory of
0025 planet positions, as outlined in "Astronomical Algorithms", by Jean Meeus.
0026 The theory is essentially a Fourier-like expansion of the coordinates for
0027 a planet as a function of time. That is, for each planet, the Ecliptic
0028 Longitude, Ecliptic Latitude, and Distance can each be approximated as a sum:
0029
0030 Long/Lat/Dist = s(0) + s(1)*T + s(2)*T^2 + s(3)*T^3 + s(4)*T^4 + s(5)*T^5
0031
0032 where T is the number of Julian Centuries since J2000. The s(N) parameters
0033 are each themselves a sum:
0034
0035 s(N) = SUM_i[ A(N)_i * Cos( B(N)_i + C(N)_i*T ) ]
0036
0037 Again, T is the Julian Centuries since J2000. The A(N)_i, B(N)_i and C(N)_i
0038 values are constants, and are unique for each planet. An s(N) sum can
0039 have hundreds of terms, but typically, higher N sums have fewer terms.
0040 The A/B/C values are stored for each planet in the files
0041 <planetname>.<L/B/R><N>.vsop. For example, the terms for the s(3) sum
0042 that describes the T^3 term for the Longitude of Mars are stored in
0043 "mars.L3.vsop".
0044
0045 Pluto is a bit different. In this case, the positional sums describe the
0046 Cartesian X, Y, Z coordinates of Pluto (where the Sun is at X,Y,Z=0,0,0).
0047 The structure of the sums is a bit different as well. See KSPluto.cpp
0048 (or Astronomical Algorithms) for details.
0049
0050 The Moon is also unique, but the general structure, where the coordinates
0051 are described by a sum of several sinusoidal series expansions, remains
0052 the same.
0053
0054
0055 2. The Implementation.
0056
0057 The KSplanet class contains a static OrbitDataManager member. The
0058 OrbitDataManager provides for loading and storing the A/B/C constants
0059 for each planet. In KstarsData::slotInitialize(), we simply call
0060 loadData() for each planet. KSPlanet::loadData() calls
0061 OrbitDataManager::loadData(QString n), where n is the name of the planet.
0062
0063 The A/B/C constants are stored hierarchically:
0064 + The A,B,C values for a single term in an s(N) sum are stored in an
0065 OrbitData object.
0066 + The list of OrbitData objects that compose a single s(N) sum is
0067 stored in a QVector (recall, this can have up to hundreds of elements).
0068 + The six s(N) sums (s(0) through s(5)) are collected as an array of
0069 these QVectors ( typedef QVector<OrbitData> OBArray[6] ).
0070 + The OBArrays for the Longitude, Latitude, and Distance are collected
0071 in a class called OrbitDataColl. Thus, OrbitDataColl stores all the
0072 numbers needed to describe the position of any planet, given the
0073 Julian Day.
0074 + The OrbitDataColl objects for each planet are stored in a QDict object
0075 called OrbitDataManager. Since OrbitDataManager is static, each planet can
0076 access this single storage location for their positional information.
0077 (A QDict is basically a QArray indexed by a string instead of an integer.
0078 In this case, the OrbitDataColl elements are indexed by the name of the
0079 planets.)
0080
0081 Tree view of this hierarchy:
0082
0083 OrbitDataManager[QDict]: Stores 9 OrbitDataColl objects, one per planet.
0084 |
0085 +--OrbitDataColl: Contains all three OBArrays (for
0086 Longitude/Latitude/Distance) for a single planet.
0087 |
0088 +--OBArray[array of 6 QVectors]: the collection of s(N) sums for
0089 the Latitude, Longitude, or Distance.
0090 |
0091 +--QVector: Each s(N) sum is a QVector of OrbitData objects
0092 |
0093 +--OrbitData: a single triplet of the constants A/B/C for
0094 one term in an s(N) sum.
0095
0096 To determine the instantaneous position of a planet, the planet calls its
0097 findPosition() function. This first calls calcEcliptic(double T), which
0098 does the calculation outlined above: it computes the s(N) sums to determine
0099 the Heliocentric Ecliptic Longitude, Ecliptic Latitude, and Distance to the
0100 planet. findPosition() then transforms from heliocentric to geocentric
0101 coordinates, using a KSPlanet object passed as an argument representing the
0102 Earth. Then the ecliptic coordinates are transformed to equatorial
0103 coordinates (RA,Dec). Finally, the coordinates are corrected for the
0104 effects of nutation, aberration, and figure-of-the-Earth. Figure-of-the-Earth
0105 just means correcting for the fact that the observer is not at the center of
0106 the Earth, rather they are on some point on the Earth's surface, some 6000 km
0107 from the center. This results in a small parallactic displacement of the
0108 planet's coordinates compared to its geocentric position. In most cases,
0109 the planets are far enough away that this correction is negligible; however,
0110 it is particularly important for the Moon, which is only 385 Mm (i.e.,
0111 385,000 km) away.
0112