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