Files
lazarus-ccr/components/systools/source/general/run/stjupsat.pas

1110 lines
37 KiB
ObjectPascal
Raw Normal View History

// Upgraded to Delphi 2009: Sebastian Zierer
(* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is TurboPower SysTools
*
* The Initial Developer of the Original Code is
* TurboPower Software
*
* Portions created by the Initial Developer are Copyright (C) 1996-2002
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* ***** END LICENSE BLOCK ***** *)
{*********************************************************}
{* SysTools: StJupsat.pas 4.04 *}
{*********************************************************}
{* SysTools: Astronomical Routines *}
{* (for the four "Gallilean" moons of Jupiter *}
{* Callisto, Europa, Ganymede, and Io) *}
{*********************************************************}
{$IFDEF FPC}
{$mode DELPHI}
{$ENDIF}
//{$I StDefine.inc}
{ ************************************************************** }
{ Sources: }
{ 1. Astronomical Algorithms, Jean Meeus, Willmann-Bell, 1991. }
{ }
{ 2. Planetary and Lunar Coordinates (1984-2000), U.S. Govt, }
{ 1983. }
{ }
{ 3. Supplement to the American Ephemeris and Nautical Almanac,}
{ U.S. Govt, 1964. }
{ }
{ 4. MPO96-98 source files, Brian D. Warner, 1995-98. }
{ }
{ ************************************************************** }
(* **************************************************************
The formulae in this unit are based on DYNAMICAL time, which is based
on the actual rotation of the Earth and is gradually slowing. Universal
Time is based on a fixed rotation rate. To directly compare results in
the astronomical literature (and Meeus' examples), you must use a Universal
Time that is adjusted by the value Delta T. This value is approximately 1 min
in the latter part of the 20th century and will be about 80 seconds in the
year 2020. As an example, to compare the High Precision positions for
1992 December 16 (Meeus' example), you must use a Universal Time of
1992 December 16 at 00:00:59 which equals 00:00:00 Dynamical Time
The Shadows parameter is used for high precision calculations only. If True,
the positions are calculated as seen from the SUN, not the Earth. For eclipses
of the satellites by Jupiter, in effect, the position is in reference to the
SHADOW of Jupiter in space, not the planet itself. For shadow transits, where
the shadow of the satellite is projected onto the surface of the planet, the
position is that of the satellite's shadow in reference to Jupiter and not
the satellite itself.
The purpose of the Shadows parameter is to complete the prediction for
satellite phenomenon. For example, using Shadow := False, the result may
indicate that a satellite goes behind Jupiter at a given instant but not
if the satellite is visible because it is in Jupiter's shadow. Setting
Shadow := True for the same time will indicate if the planet is in or out
of Jupiter's shadow.
(Shadow := FALSE) and (abs(satellite X-coordinate) = 1)
-------------------------------------------------------
If the X-value is negative and heading towards 0, the satellite is entering
the front of the planet.
If the X-value is negative and increasing, the satellite is coming from
behind the planet.
If the X-value is positive and heading towards 0, the satellite is going
behind the planet.
If the X-value is positive and increasing, the satellite is leaving
the front of the planet.
(Shadow := TRUE) and (abs(satellite X-coordinate) = 1)
-------------------------------------------------------
If the X-value is negative and heading towards 0, the satellite's shadow is
entering the planet's disc.
If the X-value is negative and increasing, the satellite is leaving the
planet's shadow.
If the X-value is positive and heading towards 0, the satellite entering
the planet's shadow.
If the X-value is positive and increasing, the satellite's shadow is
leaving the planet.
The X and Y coordinates are based on the equatorial radius of Jupiter. Because
the planet is considerably flattened by its rapid rotation, the polar diameter
is less than 1. To avoid dealing with an elliptical disc for Jupiter, multiply
the Y values only by 1.071374. This creates a "circular Jupiter" and so makes
determining if the satellite is above or below Jupiter easier
(abs(Y-coordinate) > 1).
****************************************************************** *)
unit StJupsat;
interface
type
TStJupSatPos = packed record
X : Double;
Y : Double;
end;
TStJupSats = packed record
Io : TStJupSatPos;
Europa : TStJupSatPos;
Ganymede : TStJupSatPos;
Callisto : TStJupSatPos;
end;
function GetJupSats(JD : TDateTime; HighPrecision, Shadows : Boolean) : TStJupSats;
implementation
uses
StDate, StAstro, StAstroP, StJup, StMath;
type
SunCoordsRec = packed record
X, Y, Z : Double;
L, B, R : Double;
end;
TranformRec = packed record
A, B, C : array[1..6] of Double;
end;
function SunCoords(JD : Double) : SunCoordsRec;
var
L, B, R,
T0, TM,
RS,
OB, A : Double;
begin
T0 := (JD - StdDate) / 365250;
TM := T0/100;
RS := radcor * 3600;
OB := 0.4090928042223
- 4680.93/RS * TM
- 1.55/RS * sqr(TM)
+ 1999.25/RS * sqr(TM) * TM
- 51.38/RS * sqr(sqr(TM))
- 249.67/RS * sqr(sqr(TM)) * TM
- 39.05/RS * sqr(sqr(TM)) * sqr(TM)
+ 7.12/RS * sqr(sqr(TM)) * sqr(TM) * TM
+ 27.87/RS * sqr(sqr(sqr(TM)));
L := 175347046
+ 3341656 * cos(4.6692568 + 6283.07585*T0)
+ 34894 * cos(4.6261000 + 12566.1517*T0)
+ 3497 * cos(2.7441000 + 5753.3849*T0)
+ 3418 * cos(2.8289000 + 3.5231*T0)
+ 3136 * cos(3.6277000 + 77713.7715*T0)
+ 2676 * cos(4.4181000 + 7860.4194*T0)
+ 2343 * cos(6.1352000 + 3930.2097*T0)
+ 1324 * cos(0.7425000 + 11506.7698*T0)
+ 1273 * cos(2.0371000 + 529.6910*T0)
+ 1199 * cos(1.1096000 + 1577.3435*T0)
+ 990 * cos(5.2330000 + 5884.9270*T0)
+ 902 * cos(2.0450000 + 26.1490*T0)
+ 857 * cos(3.5080000 + 398.149*T0)
+ 780 * cos(1.1790000 + 5223.694*T0)
+ 753 * cos(2.5330000 + 5507.553*T0)
+ 505 * cos(4.5830000 + 18849.228*T0)
+ 492 * cos(4.2050000 + 775.523*T0)
+ 357 * cos(2.9200000 + 0.067*T0)
+ 317 * cos(5.8490000 + 11790.626*T0)
+ 284 * cos(1.8990000 + 796.298*T0)
+ 271 * cos(0.3150000 + 10977.079*T0)
+ 243 * cos(0.3450000 + 5486.778*T0)
+ 206 * cos(4.8060000 + 2544.314*T0)
+ 205 * cos(1.8690000 + 5573.143*T0)
+ 202 * cos(2.4580000 + 6069.777*T0)
+ 156 * cos(0.8330000 + 213.299*T0)
+ 132 * cos(3.4110000 + 2942.463*T0)
+ 126 * cos(1.0830000 + 20.775*T0)
+ 115 * cos(0.6450000 + 0.980*T0)
+ 103 * cos(0.6360000 + 4694.003*T0)
+ 102 * cos(0.9760000 + 15720.839*T0)
+ 102 * cos(4.2670000 + 7.114*T0)
+ 99 * cos(6.2100000 + 2146.170*T0)
+ 98 * cos(0.6800000 + 155.420*T0)
+ 86 * cos(5.9800000 +161000.690*T0)
+ 85 * cos(1.3000000 + 6275.960*T0)
+ 85 * cos(3.6700000 + 71430.700*T0)
+ 80 * cos(1.8100000 + 17260.150*T0);
A := 628331966747.0
+ 206059 * cos(2.678235 + 6283.07585*T0)
+ 4303 * cos(2.635100 + 12566.1517*T0)
+ 425 * cos(1.590000 + 3.523*T0)
+ 119 * cos(5.796000 + 26.298*T0)
+ 109 * cos(2.966000 + 1577.344*T0)
+ 93 * cos(2.590000 + 18849.23*T0)
+ 72 * cos(1.140000 + 529.69*T0)
+ 68 * cos(1.870000 + 398.15*T0)
+ 67 * cos(4.410000 + 5507.55*T0)
+ 59 * cos(2.890000 + 5223.69*T0)
+ 56 * cos(2.170000 + 155.42*T0)
+ 45 * cos(0.400000 + 796.30*T0)
+ 36 * cos(0.470000 + 775.52*T0)
+ 29 * cos(2.650000 + 7.11*T0)
+ 21 * cos(5.340000 + 0.98*T0)
+ 19 * cos(1.850000 + 5486.78*T0)
+ 19 * cos(4.970000 + 213.30*T0)
+ 17 * cos(2.990000 + 6275.96*T0)
+ 16 * cos(0.030000 + 2544.31*T0);
L := L + (A * T0);
A := 52919
+ 8720 * cos(1.0721 + 6283.0758*T0)
+ 309 * cos(0.867 + 12566.152*T0)
+ 27 * cos(0.050 + 3.52*T0)
+ 16 * cos(5.190 + 26.30*T0)
+ 16 * cos(3.68 + 155.42*T0)
+ 10 * cos(0.76 + 18849.23*T0)
+ 9 * cos(2.06 + 77713.77*T0)
+ 7 * cos(0.83 + 775.52*T0)
+ 5 * cos(4.66 + 1577.34*T0);
L := L + (A * sqr(T0));
A := 289 * cos(5.844 + 6283.076*T0)
+ 35
+ 17 * cos(5.49 + 12566.15*T0)
+ 3 * cos(5.20 + 155.42*T0)
+ 1 * cos(4.72 + 3.52*T0);
L := L + (A * sqr(T0) * T0);
A := 114 * cos(3.142);
L := L + (A * sqr(sqr(T0)));
L := L / 1.0E+8;
{solar latitude}
B := 280 * cos(3.199 + 84334.662*T0)
+ 102 * cos(5.422 + 5507.553*T0)
+ 80 * cos(3.88 + 5223.69*T0)
+ 44 * cos(3.70 + 2352.87*T0)
+ 32 * cos(4.00 + 1577.34*T0);
A := 9 * cos(3.90 + 5507.550*T0)
+ 6 * cos(1.73 + 5223.690*T0);
B := B + (A * T0);
B := B / 1.0E+8;
{solar radius vector (astronomical units)}
R := 100013989
+ 1670700 * cos(3.0984635 + 6283.07585*T0)
+ 13956 * cos(3.05525 + 12566.15170*T0)
+ 3084 * cos(5.1985 + 77713.7715*T0)
+ 1628 * cos(1.1739 + 5753.3849*T0)
+ 1576 * cos(2.8649 + 7860.4194*T0)
+ 925 * cos(5.453 + 11506.770*T0)
+ 542 * cos(4.564 + 3930.210*T0)
+ 472 * cos(3.661 + 5884.927*T0)
+ 346 * cos(0.964 + 5507.553*T0)
+ 329 * cos(5.900 + 5223.694*T0)
+ 307 * cos(0.299 + 5573.143*T0)
+ 243 * cos(4.273 + 11790.629*T0)
+ 212 * cos(5.847 + 1577.344*T0)
+ 186 * cos(5.022 + 10977.079*T0)
+ 175 * cos(3.012 + 18849.228*T0)
+ 110 * cos(5.055 + 5486.778*T0)
+ 98 * cos(0.89 + 6069.78*T0)
+ 86 * cos(5.69 + 15720.84*T0)
+ 86 * cos(1.27 +161000.69*T0)
+ 65 * cos(0.27 + 17260.15*T0)
+ 63 * cos(0.92 + 529.69*T0)
+ 57 * cos(2.01 + 83996.85*T0)
+ 56 * cos(5.24 + 71430.70*T0)
+ 49 * cos(3.25 + 2544.31*T0)
+ 47 * cos(2.58 + 775.52*T0)
+ 45 * cos(5.54 + 9437.76*T0)
+ 43 * cos(6.01 + 6275.96*T0)
+ 39 * cos(5.36 + 4694.00*T0)
+ 38 * cos(2.39 + 8827.39*T0)
+ 37 * cos(0.83 + 19651.05*T0)
+ 37 * cos(4.90 + 12139.55*T0)
+ 36 * cos(1.67 + 12036.46*T0)
+ 35 * cos(1.84 + 2942.46*T0)
+ 33 * cos(0.24 + 7084.90*T0)
+ 32 * cos(0.18 + 5088.63*T0)
+ 32 * cos(1.78 + 398.15*T0)
+ 28 * cos(1.21 + 6286.60*T0)
+ 28 * cos(1.90 + 6279.55*T0)
+ 26 * cos(4.59 + 10447.39*T0);
R := R / 1.0E+8;
A := 103019 * cos(1.107490 + 6283.075850*T0)
+ 1721 * cos(1.0644 + 12566.1517*T0)
+ 702 * cos(3.142)
+ 32 * cos(1.02 + 18849.23*T0)
+ 31 * cos(2.84 + 5507.55*T0)
+ 25 * cos(1.32 + 5223.69*T0)
+ 18 * cos(1.42 + 1577.34*T0)
+ 10 * cos(5.91 + 10977.08*T0)
+ 9 * cos(1.42 + 6275.96*T0)
+ 9 * cos(0.27 + 5486.78*T0);
R := R + (A * T0 / 1.0E+8);
A := 4359 * cos(5.7846 + 6283.0758*T0)
+ 124 * cos(5.579 + 12566.152*T0)
+ 12 * cos(3.14)
+ 9 * cos(3.63 + 77713.77*T0)
+ 6 * cos(1.87 + 5573.14*T0)
+ 3 * cos(5.47 + 18849.23*T0);
R := R + (A * sqr(T0) / 1.0E+8);
L := (L + PI);
L := Frac(L / 2.0 / PI) * 2.0 * Pi;
if L < 0 then
L := L + (2.0*PI);
B := -B;
Result.L := L;
Result.B := B;
Result.R := R;
Result.X := R * cos(B) * cos(L);
Result.Y := R * (cos(B) * sin(L) * cos(OB) - sin(B) * sin(OB));
Result.Z := R * (cos(B) * sin(L) * sin(OB) + sin(B) * cos(OB));
end;
{-------------------------------------------------------------------------}
function JupSatsLo(AJD : Double) : TStJupSats;
var
DateDif, {d}
ArgJup, {V}
AnomE, {M}
AnomJ, {N}
DeltaLong, {J}
ECenterE, {A}
ECenterJ, {B}
K,
RVE, {R}
RVJ, {r}
EJDist, {Delta}
Phase, {Psi}
Lambda, {Lambda}
DS, DE, {DS, DE}
Mu1, Mu2,
Mu3, Mu4, {Mu1 - Mu4}
G, H, {G, H}
TmpDbl1,
TmpDbl2,
R1, R2,
R3, R4 {R1 - R4}
: Double;
begin
AJD := DateTimeToAJD(AJD);
DateDif := AJD - 2451545.0;
ArgJup := 172.74 + (0.00111588 * DateDif);
ArgJup := Frac(ArgJup/360.0) * 360.0;
if (ArgJup < 0) then
ArgJup := 360.0 + ArgJup;
ArgJup := ArgJup / radcor;
AnomE := 357.529 + (0.9856003 * DateDif);
AnomE := Frac(AnomE/360.0) * 360.0;
if (AnomE < 0) then
AnomE := 360.0 + AnomE;
AnomE := AnomE / radcor;
AnomJ := 20.020 + (0.0830853 * DateDif + (0.329 * sin(ArgJup)));
AnomJ := Frac(AnomJ/360.0) * 360.0;
if (AnomJ < 0) then
AnomJ := 360.0 + AnomJ;
AnomJ := AnomJ / radcor;
DeltaLong := 66.115 + (0.9025179 * DateDif - (0.329 * sin(ArgJup)));
DeltaLong := Frac(DeltaLong/360.0) * 360.0;
if (DeltaLong < 0) then
DeltaLong := 360.0 + DeltaLong;
DeltaLong := DeltaLong / radcor;
ECenterE := 1.915 * sin(AnomE) + 0.020 * sin(2*AnomE);
ECenterE := ECenterE / radcor;
ECenterJ := 5.555 * sin(AnomJ) + 0.168 * sin(2*AnomJ);
ECenterJ := ECenterJ / radcor;
K := (DeltaLong + ECenterE - ECenterJ);
RVE := 1.00014 - (0.01671 * cos(AnomE)) - (0.00014 * cos(2*AnomE));
RVJ := 5.20872 - (0.25208 * cos(AnomJ)) - (0.00611 * cos(2*AnomJ));
EJDist := sqrt(sqr(RVJ) + sqr(RVE) - (2 * RVJ * RVE * cos(K)));
Phase := RVE/EJDist * sin(K);
Phase := StInvSin(Phase);
if ((sin(K) < 0) and (Phase > 0)) or
((sin(K) > 0) and (Phase < 0)) then
Phase := -Phase;
Lambda := 34.35 + (0.083091 * DateDif) + (0.329 * sin(ArgJup));
Lambda := Lambda / radcor + ECenterJ;
DS := 3.12 * sin(Lambda + 42.8 / radcor);
DE := DS - 2.22 * sin(Phase) * cos(Lambda + 22/radcor)
- 1.30 * ((RVJ - EJDist) / EJDist) * sin(Lambda - 100.5/radcor);
DE := DE / radcor;
Mu1 := 163.8067 + 203.4058643 * (DateDif - (EJDist / 173));
Mu1 := Frac(Mu1/360.0) * 360.0;
if (Mu1 < 0) then
Mu1 := 360.0 + Mu1;
Mu1 := Mu1 / radcor + Phase - ECenterJ;
Mu2 := 358.4108 + 101.2916334 * (DateDif - (EJDist / 173));
Mu2 := Frac(Mu2/360.0) * 360.0;
if (Mu2 < 0) then
Mu2 := 360.0 + Mu2;
Mu2 := Mu2 / radcor + Phase - ECenterJ;
Mu3 := 5.7129 + 50.2345179 * (DateDif - (EJDist / 173));
Mu3 := Frac(Mu3/360.0) * 360.0;
if (Mu3 < 0) then
Mu3 := 360.0 + Mu3;
Mu3 := Mu3 / radcor + Phase - ECenterJ;
Mu4 := 224.8151 + 21.4879801 * (DateDif - (EJDist / 173));
Mu4 := Frac(Mu4/360.0) * 360.0;
if (Mu4 < 0) then
Mu4 := 360.0 + Mu4;
Mu4 := Mu4 / radcor + Phase - ECenterJ;
G := 331.18 + 50.310482 * (DateDif - (EJDist / 173));
G := Frac(G/360.0) * 360.0;
if (G < 0) then
G := 360.0 + G;
G := G / radcor;
H := 87.40 + 21.569231 * (DateDif - (EJDist / 173));
H := Frac(H/360.0) * 360.0;
if (H < 0) then
H := 360.0 + H;
H := H / radcor;
TmpDbl1 := 0.473 * sin(2 * (Mu1 - Mu2)) / radcor;
TmpDbl2 := 1.065 * sin(2 * (Mu2 - Mu3)) / radcor;
R1 := 5.9073 - 0.0244 * cos(2 * (Mu1 - Mu2));
R2 := 9.3991 - 0.0882 * cos(2 * (Mu2 - Mu3));
R3 := 14.9924 - 0.0216 * cos(G);
R4 := 26.3699 - 0.1935 * cos(H);
Mu1 := Mu1 + TmpDbl1;
Mu2 := Mu2 + TmpDbl2;
Mu3 := Mu3 + (0.165 * sin(G)) / radcor;
Mu4 := Mu4 + (0.841 * sin(H)) / radcor;
Result.Io.X := R1 * sin(Mu1);
Result.Io.Y := -R1 * cos(Mu1) * sin(DE);
Result.Europa.X := R2 * sin(Mu2);
Result.Europa.Y := -R2 * cos(Mu2) * sin(DE);
Result.Ganymede.X := R3 * sin(Mu3);
Result.Ganymede.Y := -R3 * cos(Mu3) * sin(DE);
Result.Callisto.X := R4 * sin(Mu4);
Result.Callisto.Y := -R4 * cos(Mu4) * sin(DE);
end;
{-------------------------------------------------------------------------}
function JupSatsHi(AJD : Double; Shadows : Boolean) : TStJupSats;
var
I : longint;
SunPos : SunCoordsRec;
STUT : TStDateTimeRec;
JupPos : TStEclipticalCord;
SatX : array[1..5] of Double;
SatY : array[1..5] of Double;
SatZ : array[1..5] of Double;
TD1,
TD2,
Angle, {Temporary Double values}
LTime, {Tau}
AJDT, {AJD adjusted for light time (Tau)}
JupX,
JupY,
JupZ, {Jupiter's geocentric rectangular coordinates}
EJDist, {Delta}
Jup1,
Jup2, {/\, Alpha}
DateDif, {t}
L1, L2,
L3, L4, {script L1-4}
Pi1, Pi2,
Pi3, Pi4, {Pi1-4}
W1, W2,
W3, W4, {Omega1-4}
Inequality, {upside down L}
PhiLambda,
NodeJup, {Psi}
AnomJup, {G}
AnomSat, {G'}
LongPerJ,
S1, S2,
S3, S4, {Sum1-4}
TL1, TL2,
TL3, TL4, {Capital L1-4}
B1, B2,
B3, B4, {tangent of latitude}
R1, R2,
R3, R4, {radius vector}
T0, {Julian Centuries}
Precession, {P}
Inclination {I}
: Double;
Transforms : array[1..5] of TranformRec;
begin
FillChar(Result, SizeOf(TStJupSats), #0);
AJD := DateTimeToAJD(AJD);
SunPos := SunCoords(AJD);
if not Shadows then begin
TD1 := 5;
AJDT := AJD - 0.0057755183 * TD1; {first guess}
repeat
JupPos := ComputeJupiter(AJDT);
JupX := JupPos.R0 * cos(JupPos.B0) * cos(JupPos.L0)
+ SunPos.R * cos(SunPos.L);
JupY := JupPos.R0 * cos(JupPos.B0) * sin(JupPos.L0)
+ SunPos.R * sin(SunPos.L);
JupZ := JupPos.R0 * sin(JupPos.B0);
EJDist := sqrt(sqr(JupX) + sqr(JupY) + sqr(JupZ));
TD2 := abs(EJDist - TD1);
if abs(TD2) > 0.0005 then begin
AJDT := AJD - 0.0057755183 * ((EJDist + TD1) / 2);
TD1 := EJDist;
end;
until (TD2 <= 0.0005);
end else begin
JupPos := ComputeJupiter(AJD);
JupX := JupPos.R0 * cos(JupPos.B0) * cos(JupPos.L0);
JupY := JupPos.R0 * cos(JupPos.B0) * sin(JupPos.L0);
JupZ := JupPos.R0 * sin(JupPos.B0);
EJDist := sqrt(sqr(JupX+SunPos.X) +
sqr(JupY+SunPos.Y) + sqr(JupZ+SunPos.Z));
end;
Jup1 := StInvTan2(JupX, JupY);
Jup2 := ArcTan(JupZ / sqrt(sqr(JupX) + sqr(JupY)));
DateDif := AJD - 2443000.5 - (0.0057755183 * EJDist);
L1 := 106.07947 + 203.488955432 * DateDif;
L1 := Frac(L1/360.0) * 360.0;
if (L1 < 0) then
L1 := 360.0 + L1;
L1 := L1 / radcor;
L2 := 175.72938 + 101.374724550 * DateDif;
L2 := Frac(L2/360.0) * 360.0;
if (L2 < 0) then
L2 := 360.0 + L2;
L2 := L2 / radcor;
L3 := 120.55434 + 50.317609110 * DateDif;
L3 := Frac(L3/360.0) * 360.0;
if (L3 < 0) then
L3 := 360.0 + L3;
L3 := L3 / radcor;
L4 := 84.44868 + 21.571071314 * DateDif;
L4 := Frac(L4/360.0) * 360.0;
if (L4 < 0) then
L4 := 360.0 + L4;
L4 := L4 / radcor;
Pi1 := 58.3329 + 0.16103936 * DateDif;
Pi1 := Frac(Pi1/360.0) * 360.0;
if (Pi1 < 0) then
Pi1 := 360.0 + Pi1;
Pi1 := Pi1 / radcor;
Pi2 := 132.8959 + 0.04647985 * DateDif;
Pi2 := Frac(Pi2/360.0) * 360.0;
if (Pi2 < 0) then
Pi2 := 360.0 + Pi2;
Pi2 := Pi2 / radcor;
Pi3 := 187.2887 + 0.00712740 * DateDif;
Pi3 := Frac(Pi3/360.0) * 360.0;
if (Pi3 < 0) then
Pi3 := 360.0 + Pi3;
Pi3 := Pi3 / radcor;
Pi4 := 335.3418 + 0.00183998 * DateDif;
Pi4 := Frac(Pi4/360.0) * 360.0;
if (Pi4 < 0) then
Pi4 := 360.0 + Pi4;
Pi4 := Pi4 / radcor;
W1 := 311.0793 - 0.13279430 * DateDif;
W1 := Frac(W1/360.0) * 360.0;
if (W1 < 0) then
W1 := 360.0 + W1;
W1 := W1 / radcor;
W2 := 100.5099 - 0.03263047 * DateDif;
W2 := Frac(W2/360.0) * 360.0;
if (W2 < 0) then
W2 := 360.0 + W2;
W2 := W2 / radcor;
W3 := 119.1688 - 0.00717704 * DateDif;
W3 := Frac(W3/360.0) * 360.0;
if (W3 < 0) then
W3 := 360.0 + W3;
W3 := W3 / radcor;
W4 := 322.5729 - 0.00175934 * DateDif;
W4 := Frac(W4/360.0) * 360.0;
if (W4 < 0) then
W4 := 360.0 + W4;
W4 := W4 / radcor;
Inequality := 0.33033 * sin((163.679 + 0.0010512*DateDif) / radcor)
+ 0.03439 * sin((34.486 - 0.0161731*DateDif) / radcor);
Inequality := Inequality / radcor;
PhiLambda := 191.8132 + 0.17390023 * DateDif;
PhiLambda := Frac(PhiLambda / 360.0) * 360.0;
if (PhiLambda < 0) then
PhiLambda := 360.0 + PhiLambda;
PhiLambda := PhiLambda / radcor;
NodeJup := 316.5182 - 0.00000208 * DateDif;
NodeJup := Frac(NodeJup / 360.0) * 360.0;
if (NodeJup < 0) then
NodeJup := 360.0 + NodeJup;
NodeJup := NodeJup / radcor;
AnomJup := 30.23756 + 0.0830925701 * DateDif;
AnomJup := Frac(AnomJup / 360.0) * 360.0;
if (AnomJup < 0) then
AnomJup := 360.0 + AnomJup;
AnomJup := AnomJup / radcor + Inequality;
AnomSat := 31.97853 + 0.0334597339 * DateDif;
AnomSat := Frac(AnomSat / 360.0) * 360.0;
if (AnomSat < 0) then
AnomSat := 360.0 + AnomSat;
AnomSat := AnomSat / radcor;
LongPerJ := 13.469942 / radcor;
S1 := 0.47259 * sin(2*(L1-L2))
- 0.03480 * sin(Pi3-Pi4)
- 0.01756 * sin(Pi1 + Pi3 - 2*LongPerJ - 2*AnomJup)
+ 0.01080 * sin(L2 - 2*L3 + Pi3)
+ 0.00757 * sin(PhiLambda)
+ 0.00663 * sin(L2 - 2*L3 + Pi4)
+ 0.00453 * sin(L1 - Pi3)
+ 0.00453 * sin(L2 - 2*L3 + Pi2)
- 0.00354 * sin(L1-L2)
- 0.00317 * sin(2*NodeJup - 2*LongPerJ)
- 0.00269 * sin(L2 - 2*L3 + Pi1)
+ 0.00263 * sin(L1 - Pi4)
+ 0.00186 * sin(L1 - Pi1)
- 0.00186 * sin(AnomJup)
+ 0.00167 * sin(Pi2 - Pi3)
+ 0.00158 * sin(4*(L1-L2))
- 0.00155 * sin(L1 - L3)
- 0.00142 * sin(NodeJup + W3 - 2*LongPerJ - 2*AnomJup)
- 0.00115 * sin(2*(L1 - 2*L2 + W2))
+ 0.00089 * sin(Pi2 - Pi4)
+ 0.00084 * sin(W2 - W3)
+ 0.00084 * sin(L1 + Pi3 - 2*LongPerJ - 2*AnomJup)
+ 0.00053 * sin(NodeJup - W2);
S2 := 1.06476 * sin(2*(L2-L3))
+ 0.04253 * sin(L1 - 2*L2 + Pi3)
+ 0.03579 * sin(L2 - Pi3)
+ 0.02383 * sin(L1 - 2*L2 + Pi4)
+ 0.01977 * sin(L2 - Pi4)
- 0.01843 * sin(PhiLambda)
+ 0.01299 * sin(Pi3 - Pi4)
- 0.01142 * sin(L2 - L3)
+ 0.01078 * sin(L2 - Pi2)
- 0.01058 * sin(AnomJup)
+ 0.00870 * sin(L2 - 2*L3 + Pi2)
- 0.00775 * sin(2*(NodeJup - LongPerJ))
+ 0.00524 * sin(2*(L1-L2))
- 0.00460 * sin(L1-L3)
+ 0.00450 * sin(L2 - 2*L3 + Pi1)
+ 0.00327 * sin(NodeJup - 2*AnomJup + W3 - 2*LongPerJ)
- 0.00296 * sin(Pi1 + Pi3 - 2*LongPerJ - 2*AnomJup)
- 0.00151 * sin(2*AnomJup)
+ 0.00146 * sin(NodeJup - W3)
+ 0.00125 * sin(NodeJup - W4)
- 0.00117 * sin(L1 -2*L3 + Pi3)
- 0.00095 * sin(2*(L2-W2))
+ 0.00086 * sin(2*(L1-2*L2 +W2))
- 0.00086 * sin(5*AnomSat - 2*AnomJup + 52.225/radcor)
- 0.00078 * sin(L2-L4)
- 0.00064 * sin(L1 - 2*L3 + Pi4)
- 0.00063 * sin(3*L3 - 7*L4 + 4*Pi4)
+ 0.00061 * sin(Pi1 - Pi4)
+ 0.00058 * sin(2*(NodeJup - LongPerJ - AnomJup))
+ 0.00058 * sin(W3 - W4)
+ 0.00056 * sin(2*(L2-L4))
+ 0.00055 * sin(2*(L1-L3))
+ 0.00052 * sin(3*L3 - 7*L4 + Pi3 + 3*Pi4)
- 0.00043 * sin(L1 - Pi3)
+ 0.00042 * sin(Pi3 - Pi2)
+ 0.00041 * sin(5*(L2-L3))
+ 0.00041 * sin(Pi4 - LongPerJ)
+ 0.00038 * sin(L2 - Pi1)
+ 0.00032 * sin(W2 - W3)
+ 0.00032 * sin(2*(L3 - AnomJup - LongPerJ))
+ 0.00029 * sin(Pi1 - Pi3);
S3 := 0.16477 * sin(L3 - Pi3)
+ 0.09062 * sin(L3 - Pi4)
- 0.06907 * sin(L2 - L3)
+ 0.03786 * sin(Pi3 - Pi4)
+ 0.01844 * sin(2*(L3-L4))
- 0.01340 * sin(AnomJup)
+ 0.00703 * sin(L2 - 2*L3 + Pi3)
- 0.00670 * sin(2*(NodeJup - LongPerJ))
- 0.00540 * sin(L3-L4)
+ 0.00481 * sin(Pi1 + Pi3 -2*LongPerJ - 2*AnomJup)
- 0.00409 * sin(L2 - 2*L3 + Pi2)
+ 0.00379 * sin(L2 - 2*L3 + Pi4)
+ 0.00235 * sin(NodeJup - W3)
+ 0.00198 * sin(NodeJup - W4)
+ 0.00180 * sin(PhiLambda)
+ 0.00129 * sin(3*(L3-L4))
+ 0.00124 * sin(L1-L3)
- 0.00119 * sin(5*AnomSat - 2*AnomJup + 52.225/radcor)
+ 0.00109 * sin(L1-L2)
- 0.00099 * sin(3*L3 - 7*L4 + 4*Pi4)
+ 0.00091 * sin(W3 - W4)
+ 0.00081 * sin(3*L3 - 7*L4 + Pi3 + 3*Pi4)
- 0.00076 * sin(2*L2 - 3*L3 + Pi3)
+ 0.00069 * sin(Pi4 - LongPerJ)
- 0.00058 * sin(2*L3 - 3*L4 + Pi4)
+ 0.00057 * sin(L3 + Pi3 - 2*LongPerJ - 2*AnomJup)
- 0.00057 * sin(L3 - 2*L4 + Pi4)
- 0.00052 * sin(Pi2 - Pi3)
- 0.00052 * sin(L2 - 2*L3 + Pi1)
+ 0.00048 * sin(L3 - 2*L4 + Pi3)
- 0.00045 * sin(2*L2 - 3*L3 + Pi4)
- 0.00041 * sin(Pi2 - Pi4)
- 0.00038 * sin(2*AnomJup)
- 0.00033 * sin(Pi3 - Pi4 + W3 - W4)
- 0.00032 * sin(3*L3 - 7*L4 + 2*Pi3 + 2*Pi4)
+ 0.00030 * sin(4*(L3-L4))
- 0.00029 * sin(W3 + NodeJup - 2*LongPerJ - 2*AnomJup)
+ 0.00029 * sin(L3 + Pi4 - 2*LongPerJ - 2*AnomJup)
+ 0.00026 * sin(L3 - LongPerJ - AnomJup)
+ 0.00024 * sin(L2 - 3*L3 + 2*L4)
+ 0.00021 * sin(2*(L3 - LongPerJ - AnomJup))
- 0.00021 * sin(L3 - Pi2)
+ 0.00017 * sin(2*(L3 - Pi3));
S4 := 0.84109 * sin(L4 - Pi4)
+ 0.03429 * sin(Pi4 - Pi3)
- 0.03305 * sin(2*(NodeJup - LongPerJ))
- 0.03211 * sin(AnomJup)
- 0.01860 * sin(L4 - Pi3)
+ 0.01182 * sin(NodeJup - W4)
+ 0.00622 * sin(L4 + Pi4 - 2*AnomJup - 2*LongPerJ)
+ 0.00385 * sin(2*(L4 - Pi4))
- 0.00284 * sin(5*AnomSat - 2*AnomJup + 52.225/radcor)
- 0.00233 * sin(2*(NodeJup - Pi4))
- 0.00223 * sin(L3 - L4)
- 0.00208 * sin(L4 - LongPerJ)
+ 0.00177 * sin(NodeJup + W4 - 2*Pi4)
+ 0.00134 * sin(Pi4 - LongPerJ)
+ 0.00125 * sin(2*(L4 - AnomJup - LongPerJ))
- 0.00117 * sin(2*AnomJup)
- 0.00112 * sin(2*(L3 - L4))
+ 0.00106 * sin(3*L3 - 7*L4 + 4*Pi4)
+ 0.00102 * sin(L4 - AnomJup - LongPerJ)
+ 0.00096 * sin(2*L4 - NodeJup - W4)
+ 0.00087 * sin(2*(NodeJup - W4))
- 0.00087 * sin(3*L3 - 7*L4 + Pi3 + 3*Pi4)
+ 0.00085 * sin(L3 - 2*L4 + Pi4)
- 0.00081 * sin(2*(L4 - NodeJup))
+ 0.00071 * sin(L4 + Pi4 -2*LongPerJ - 3*AnomJup)
+ 0.00060 * sin(L1 - L4)
- 0.00056 * sin(NodeJup - W3)
- 0.00055 * sin(L3 - 2*L4 + Pi3)
+ 0.00051 * sin(L2 - L4)
+ 0.00042 * sin(2*(NodeJup - AnomJup - LongPerJ))
+ 0.00039 * sin(2*(Pi4 - W4))
+ 0.00036 * sin(NodeJup + LongPerJ - Pi4 - W4)
+ 0.00035 * sin(2*AnomSat - AnomJup + 188.37/radcor)
- 0.00035 * sin(L4 - Pi4 + 2*LongPerJ - 2*NodeJup)
- 0.00032 * sin(L4 + Pi4 - 2*LongPerJ - AnomJup)
+ 0.00030 * sin(3*L3 - 7*L4 + 2*Pi3 + 2*Pi4)
+ 0.00030 * sin(2*AnomSat - 2*AnomJup + 149.15/radcor)
+ 0.00028 * sin(L4 - Pi4 + 2*NodeJup - 2*LongPerJ)
- 0.00028 * sin(2*(L4 - W4))
- 0.00027 * sin(Pi3 - Pi4 + W3 - W4)
- 0.00026 * sin(5*AnomSat - 3*AnomJup + 188.37/radcor)
+ 0.00025 * sin(W4 - W3)
- 0.00025 * sin(L2 - 3*L3 + 2*L4)
- 0.00023 * sin(3*(L3 - L4))
+ 0.00021 * sin(2*L4 - 2*LongPerJ - 3*AnomJup)
- 0.00021 * sin(2*L3 - 3*L4 + Pi4)
+ 0.00019 * sin(L4 - Pi4 - AnomJup)
- 0.00019 * sin(2*L4 - Pi3 - Pi4)
- 0.00018 * sin(L4 - Pi4 + AnomJup)
- 0.00016 * sin(L4 + Pi3 -2*LongPerJ - 2*AnomJup);
S1 := S1/radcor;
S2 := S2/radcor;
S3 := S3/radcor;
S4 := S4/radcor;
TL1 := L1 + S1;
TL2 := L2 + S2;
TL3 := L3 + S3;
TL4 := L4 + S4;
B1 := 0.0006502 * sin(TL1 - W1)
+ 0.0001835 * sin(TL1 - W2)
+ 0.0000329 * sin(TL1 - W3)
- 0.0000311 * sin(TL1 - NodeJup)
+ 0.0000093 * sin(TL1 - W4)
+ 0.0000075 * sin(3*TL1 - 4*L2 - 1.9927/radcor * S1 + W2)
+ 0.0000046 * sin(TL1 + NodeJup - 2*LongPerJ - 2*AnomJup);
B1 := ArcTan(B1);
B2 := 0.0081275 * sin(TL2 - W2)
+ 0.0004512 * sin(TL2 - W3)
- 0.0003286 * sin(TL2 - NodeJup)
+ 0.0001164 * sin(TL2 - W4)
+ 0.0000273 * sin(L1 - 2*L3 + 1.0146/radcor * S2 + W2)
+ 0.0000143 * sin(TL2 + NodeJup - 2*LongPerJ - 2*AnomJup)
- 0.0000143 * sin(TL2 - W1)
+ 0.0000035 * sin(TL2 - NodeJup + AnomJup)
- 0.0000028 * sin(L1 - 2*L3 + 1.0146/radcor * S2 + W3);
B2 := ArcTan(B2);
B3 := 0.0032364 * sin(TL3 - W3)
- 0.0016911 * sin(TL3 - NodeJup)
+ 0.0006849 * sin(TL3 - W4)
- 0.0002806 * sin(TL3 - W2)
+ 0.0000321 * sin(TL3 + NodeJup - 2*LongPerJ - 2*AnomJup)
+ 0.0000051 * sin(TL3 - NodeJup + AnomJup)
- 0.0000045 * sin(TL3 - NodeJup - AnomJup)
- 0.0000045 * sin(TL3 + NodeJup - 2*LongPerJ)
+ 0.0000037 * sin(TL3 + NodeJup - 2*LongPerJ - 3*AnomJup)
+ 0.0000030 * sin(2*L2 - 3*TL3 + 4.03/radcor * S3 + W2)
- 0.0000021 * sin(2*L2 - 3*TL3 + 4.03/radcor * S3 + W3);
B3 := ArcTan(B3);
B4 := -0.0076579 * sin(TL4 - NodeJup)
+ 0.0044148 * sin(TL4 - W4)
- 0.0005106 * sin(TL4 - W3)
+ 0.0000773 * sin(TL4 + NodeJup - 2*LongPerJ - 2*AnomJup)
+ 0.0000104 * sin(TL4 - NodeJup + AnomJup)
- 0.0000102 * sin(TL4 - NodeJup - AnomJup)
+ 0.0000088 * sin(TL4 + NodeJup - 2*LongPerJ - 3*AnomJup)
- 0.0000038 * sin(TL4 + NodeJup - 2*LongPerJ - AnomJup);
B4 := ArcTan(B4);
R1 := -0.0041339 * cos(2*(L1-L2))
- 0.0000395 * cos(L1 - Pi3)
- 0.0000214 * cos(L1 - Pi4)
+ 0.0000170 * cos(L1 - L2)
- 0.0000162 * cos(L1 - Pi1)
- 0.0000130 * cos(4*(L1-L2))
+ 0.0000106 * cos(L1 - L3)
- 0.0000063 * cos(L1 + Pi3 - 2*LongPerJ - 2*AnomJup);
R2 := 0.0093847 * cos(L1-L2)
- 0.0003114 * cos(L2 - Pi3)
- 0.0001738 * cos(L2 - Pi4)
- 0.0000941 * cos(L2 - Pi2)
+ 0.0000553 * cos(L2 - L3)
+ 0.0000523 * cos(L1 - L3)
- 0.0000290 * cos(2*(L1-L2))
+ 0.0000166 * cos(2*(L2-W2))
+ 0.0000107 * cos(L1 - 2*L3 + Pi3)
- 0.0000102 * cos(L2 - Pi1)
- 0.0000091 * cos(2*(L1-L3));
R3 := -0.0014377 * cos(L3 - Pi3)
- 0.0007904 * cos(L3 - Pi4)
+ 0.0006342 * cos(L2 - L3)
- 0.0001758 * cos(2*(L3-L4))
+ 0.0000294 * cos(L3 - L4)
- 0.0000156 * cos(3*(L3-L4))
+ 0.0000155 * cos(L1 - L3)
- 0.0000153 * cos(L1 - L2)
+ 0.0000070 * cos(2*L2 - 3*L3 + Pi3)
- 0.0000051 * cos(L3 + Pi3 - 2*LongPerJ - 2*AnomJup);
R4 := -0.0073391 * cos(L4 - Pi4)
+ 0.0001620 * cos(L4 - Pi3)
+ 0.0000974 * cos(L3 - L4)
- 0.0000541 * cos(L4 + Pi4 - 2*LongPerJ - 2*AnomJup)
- 0.0000269 * cos(2*(L4-Pi4))
+ 0.0000182 * cos(L4- LongPerJ)
+ 0.0000177 * cos(2*(L3-L4))
- 0.0000167 * cos(2*L4 - NodeJup - W4)
+ 0.0000167 * cos(NodeJup - W4)
- 0.0000155 * cos(2*(L4-LongPerj-AnomJup))
+ 0.0000142 * cos(2*(L4-NodeJup))
+ 0.0000104 * cos(L1 - L4)
+ 0.0000092 * cos(L2 - L4)
- 0.0000089 * cos(L4 - LongPerJ - AnomJup)
- 0.0000062 * cos(L4 + Pi4 - 2*LongPerJ - 3*AnomJup)
+ 0.0000048 * cos(2*(L4-W4));
R1 := 5.90730 * (1 + R1);
R2 := 9.39912 * (1 + R2);
R3 := 14.99240 * (1 + R3);
R4 := 26.36990 * (1 + R4);
T0 := (AJD - 2433282.423) / 36525;
Precession := (1.3966626*T0 + 0.0003088*sqr(T0)) / radcor;
TL1 := TL1 + Precession;
TL2 := TL2 + Precession;
TL3 := TL3 + Precession;
TL4 := TL4 + Precession;
NodeJup := NodeJup + Precession;
T0 := (AJD - AstJulianDatePrim(1900, 1, 1, 0)) / 36525;
Inclination := (3.120262 + 0.0006*T0) / radcor;
SatX[1] := R1 * cos(TL1 - NodeJup) * cos(B1);
SatY[1] := R1 * sin(TL1 - NodeJup) * cos(B1);
SatZ[1] := R1 * sin(B1);
SatX[2] := R2 * cos(TL2 - NodeJup) * cos(B2);
SatY[2] := R2 * sin(TL2 - NodeJup) * cos(B2);
SatZ[2] := R2 * sin(B2);
SatX[3] := R3 * cos(TL3 - NodeJup) * cos(B3);
SatY[3] := R3 * sin(TL3 - NodeJup) * cos(B3);
SatZ[3] := R3 * sin(B3);
SatX[4] := R4 * cos(TL4 - NodeJup) * cos(B4);
SatY[4] := R4 * sin(TL4 - NodeJup) * cos(B4);
SatZ[4] := R4 * sin(B4);
SatX[5] := 0;
SatY[5] := 0;
SatZ[5] := 1;
T0 := (AJD - 2451545.0) / 36525.0;
TD1 := 100.464441
+ 1.0209550 * T0
+ 0.00040117 * sqr(T0)
+ 0.000000569 * sqr(T0) * T0;
TD1 := TD1 / radcor;
TD2 := 1.303270
- 0.0054966 * T0
+ 0.00000465 * sqr(T0)
- 0.000000004 * sqr(T0) * T0;
TD2 := TD2 / radcor;
for I := 1 to 5 do begin
Transforms[I].A[1] := SatX[I];
Transforms[I].B[1] := SatY[I] * cos(Inclination)
- SatZ[I] * sin(Inclination);
Transforms[I].C[1] := SatY[I] * sin(Inclination)
+ SatZ[I] * cos(Inclination);
Transforms[I].A[2] := Transforms[I].A[1] * cos(NodeJup - TD1)
- Transforms[I].B[1] * sin(NodeJup - TD1);
Transforms[I].B[2] := Transforms[I].A[1] * sin(NodeJup - TD1)
+ Transforms[I].B[1] * cos(NodeJup - TD1);
Transforms[I].C[2] := Transforms[I].C[1];
Transforms[I].A[3] := Transforms[I].A[2];
Transforms[I].B[3] := Transforms[I].B[2] * cos(TD2)
- Transforms[I].C[2] * sin(TD2);
Transforms[I].C[3] := Transforms[I].B[2] * sin(TD2)
+ Transforms[I].C[2] * cos(TD2);
Transforms[I].A[4] := Transforms[I].A[3] * cos(TD1)
- Transforms[I].B[3] * sin(TD1);
Transforms[I].B[4] := Transforms[I].A[3] * sin(TD1)
+ Transforms[I].B[3] * cos(TD1);
Transforms[I].C[4] := Transforms[I].C[3];
Transforms[I].A[5] := Transforms[I].A[4] * sin(Jup1)
- Transforms[I].B[4] * cos(Jup1);
Transforms[I].B[5] := Transforms[I].A[4] * cos(Jup1)
+ Transforms[I].B[4] * sin(Jup1);
Transforms[I].C[5] := Transforms[I].C[4];
Transforms[I].A[6] := Transforms[I].A[5];
Transforms[I].B[6] := Transforms[I].C[5] * sin(Jup2)
+ Transforms[I].B[5] * cos(Jup2);
Transforms[I].C[6] := Transforms[I].C[5] * cos(Jup2)
- Transforms[I].B[5] * sin(Jup2);
end;
Angle := StInvTan2(Transforms[5].C[6], Transforms[5].A[6]);
{Io calculations}
Result.Io.X := Transforms[1].A[6] * cos(Angle)
- Transforms[1].C[6] * sin(Angle);
Result.Io.Y := Transforms[1].A[6] * sin(Angle)
+ Transforms[1].C[6] * cos(Angle);
TD1 := Transforms[1].B[6];
{correct for light time}
TD2 := abs(TD1) / 17295 * sqrt(1 - sqr(Result.Io.X/R1));
Result.Io.X := Result.Io.X + TD2;
{correct for perspective}
TD2 := EJDist / (EJDist + TD1/2095);
Result.Io.X := Result.Io.X * TD2;
Result.Io.Y := Result.Io.Y * TD2;
{Europa calculations}
Result.Europa.X := Transforms[2].A[6] * cos(Angle)
- Transforms[2].C[6] * sin(Angle);
Result.Europa.Y := Transforms[2].A[6] * sin(Angle)
+ Transforms[2].C[6] * cos(Angle);
TD1 := Transforms[2].B[6];
{correct for light time}
TD2 := abs(TD1) / 21819 * sqrt(1 - sqr(Result.Europa.X/R2));
Result.Europa.X := Result.Europa.X + TD2;
{correct for perspective}
TD2 := EJDist / (EJDist + TD1/2095);
Result.Europa.X := Result.Europa.X * TD2;
Result.Europa.Y := Result.Europa.Y * TD2;
{Ganymede calculations}
Result.Ganymede.X := Transforms[3].A[6] * cos(Angle)
- Transforms[3].C[6] * sin(Angle);
Result.Ganymede.Y := Transforms[3].A[6] * sin(Angle)
+ Transforms[3].C[6] * cos(Angle);
TD1 := Transforms[3].B[6];
{correct for light time}
TD2 := abs(TD1) / 27558 * sqrt(1 - sqr(Result.Ganymede.X/R3));
Result.Ganymede.X := Result.Ganymede.X + TD2;
{correct for perspective}
TD2 := EJDist / (EJDist + TD1/2095);
Result.Ganymede.X := Result.Ganymede.X * TD2;
Result.Ganymede.Y := Result.Ganymede.Y * TD2;
{Callisto calculations}
Result.Callisto.X := Transforms[4].A[6] * cos(Angle)
- Transforms[4].C[6] * sin(Angle);
Result.Callisto.Y := Transforms[4].A[6] * sin(Angle)
+ Transforms[4].C[6] * cos(Angle);
TD1 := Transforms[4].B[6];
{correct for light time}
TD2 := abs(TD1) / 36548 * sqrt(1 - sqr(Result.Callisto.X/R4));
Result.Callisto.X := Result.Callisto.X + TD2;
{correct for perspective}
TD2 := EJDist / (EJDist + TD1/2095);
Result.Callisto.X := Result.Callisto.X * TD2;
Result.Callisto.Y := Result.Callisto.Y * TD2;
end;
{-------------------------------------------------------------------------}
function GetJupSats(JD : TDateTime; HighPrecision, Shadows : Boolean) : TStJupSats;
begin
if not HighPrecision then
Result := JupSatsLo(JD)
else
Result := JupSatsHi(JD, Shadows);
end;
end.