/***************************************************************************\
* Pluto
* this source seems to provide wrong results! (Dr. W. Strickling, 2011-07-09)
* use Class Pluto2 for correct calculations
*
\***************************************************************************/
package com.mhuss.AstroLib;
class PlutoCoeffs {
PlutoCoeffs( int j_, int s_, int p_, int loa, int lob, int laa, int lab, int ra, int rb ) {
j=j_; s=s_; p=p_; lon_a=loa; lon_b=lob; lat_a=laa; lat_b=lab; rad_a=ra; rad_b=rb;
}
int j, s, p, lon_a, lon_b, lat_a, lat_b, rad_a, rad_b;
};
class PlutoTerms {
static final long plutoLongCoeff[][] = {
{ 68955876, 66867334, -14974876, -5453098, 19848454, -19798886 },
{ -333765, -11826086, 1672673, 3527363, -4955707, 897499 },
{ -1439953, 1593657, 327763, -1050939, 1210521, 610820 },
{ 482443, -18948, -291925, 178691, -189719, -341639 },
{ -85576, -66634, 100448, 18763, -34863, 129027 },
{ -5765, 30841, -25838, -30594, 31061, -38215 },
{ 45637, 105, 201, 157, 747, 7049 }
};
// pluto coefficients
static final int N_COEFFS = 36;
static final PlutoCoeffs plutoCoeff[] = {
new PlutoCoeffs( 0, 1, -1, 20349, -9886, 4965, 11263, -6140, 22254 ),
new PlutoCoeffs( 0, 1, 0, -4045, -4904, 310, -132, 4434, 4443 ),
new PlutoCoeffs( 0, 1, 1, -5885, -3238, 2036, -947, -1518, 641 ),
new PlutoCoeffs( 0, 1, 2, -3812, 3011, -2, -674, -5, 792 ),
new PlutoCoeffs( 0, 1, 3, -601, 3468, -329, -563, 518, 518 ),
new PlutoCoeffs( 0, 2, -2, 1237, 463, -64, 39, -13, -221 ),
new PlutoCoeffs( 0, 2, -1, 1086, -911, -94, 210, 837, -494 ),
new PlutoCoeffs( 0, 2, 0, 595, -1229, -8, -160, -281, 616 ),
new PlutoCoeffs( 1, -1, 0, 2484, -485, -177, 259, 260, -395 ),
new PlutoCoeffs( 1, -1, 1, 839, -1414, 17, 234, -191, -396 ),
new PlutoCoeffs( 1, 0, -3, -964, 1059, 582, -285, -3218, 370 ),
new PlutoCoeffs( 1, 0, -2, -2303, -1038, -298, 692, 8019, -7869 ),
new PlutoCoeffs( 1, 0, 0, 1179, -358, 304, 825, 8623, 8444 ),
new PlutoCoeffs( 1, 0, 1, 393, -63, -124, -29, -896, -801 ),
new PlutoCoeffs( 1, 0, 2, 111, -268, 15, 8, 208, -122 ),
new PlutoCoeffs( 1, 0, 3, -52, -154, 7, 15, -133, 65 ),
new PlutoCoeffs( 1, 0, 4, -78, -30, 2, 2, -16, 1 ),
new PlutoCoeffs( 1, 1, -3, -34, -26, 4, 2, -22, 7 ),
new PlutoCoeffs( 1, 1, -2, -43, 1, 3, 0, -8, 16 ),
new PlutoCoeffs( 1, 1, -1, -15, 21, 1, -1, 2, 9 ),
new PlutoCoeffs( 1, 1, 0, -1, 15, 0, -2, 12, 5 ),
new PlutoCoeffs( 1, 1, 1, 4, 7, 1, 0, 1, -3 ),
new PlutoCoeffs( 1, 1, 3, 1, 5, 1, -1, 1, 0 ),
new PlutoCoeffs( 2, 0, -6, 8, 3, -2, -3, 9, 5 ),
new PlutoCoeffs( 2, 0, -5, -3, 6, 1, 2, 2, -1 ),
new PlutoCoeffs( 2, 0, -4, 6, -13, -8, 2, 14, 10 ),
new PlutoCoeffs( 2, 0, -3, 10, 22, 10, -7, -65, 12 ),
new PlutoCoeffs( 2, 0, -2, -57, -32, 0, 21, 126, -233 ),
new PlutoCoeffs( 2, 0, -1, 157, -46, 8, 5, 270, 1068 ),
new PlutoCoeffs( 2, 0, 0, 12, -18, 13, 16, 254, 155 ),
new PlutoCoeffs( 2, 0, 1, -4, 8, -2, -3, -26, -2 ),
new PlutoCoeffs( 2, 0, 2, -5, 0, 0, 0, 7, 0 ),
new PlutoCoeffs( 2, 0, 3, 3, 4, 0, 1, -11, 4 ),
new PlutoCoeffs( 3, 0, -2, -1, -1, 0, 1, 4, -14 ),
new PlutoCoeffs( 3, 0, -1, 6, -3, 0, 0, 18, 35 ),
new PlutoCoeffs( 3, 0, 0, -1, -2, 0, 1, 13, 3 )
};
};
/**
* A class that can calculate the orbit of Pluto.
*
* Based on C code by Bill Gray (www.projectpluto.com)
*/
public class Pluto {
/**
* Calculate all locations elements for a given time.
*
* @param loc The LocationElements class to populate
* @param t time in Julian centuries
*/
public static void calcAllLEs( LocationElements loc, double t ) {
// jupiter's mean longitude
double mlJup = Math.toRadians(34.35 + 3034.9057 * t);
// saturn's mean longitude
double mlSat = Math.toRadians(50.08 + 1222.1138 * t);
// pluto's mean longitude
double mlPl = Math.toRadians(238.96 + 144.9600 * t);
// use local vars for retvals, hoping to encourage FP reg optimizations
double lon_ = 238.956785 + 144.96 * t;
double lat_ = -3.908202;
double rad_ = 407.247248; // temporarily in tenths of AUs; fixed at the end
double arg;
for( int i=0; i<7; i++ ) {
if( i == 6)
arg = mlJup - mlPl;
else
arg = (double)(i + 1) * mlPl;
double cosArg = Math.cos(arg) * 1.e-6;
double sinArg = Math.sin(arg) * 1.e-6;
long plc[] = PlutoTerms.plutoLongCoeff[i];
lon_ += (double)(plc[0]) * sinArg + (double)(plc[1]) * cosArg;
lat_ += (double)(plc[2]) * sinArg + (double)(plc[3]) * cosArg;
rad_ += (double)(plc[4]) * sinArg + (double)(plc[5]) * cosArg;
}
PlutoCoeffs pc[] = PlutoTerms.plutoCoeff;
for( int i=0; i 0 )
arg += (1 == pc[i].s) ? mlSat : mlSat + mlSat;
if( 0 != pc[i].p )
arg += mlPl * (double)pc[i].p;
double cosArg = Math.cos(arg) * 1.e-6;
double sinArg = Math.sin(arg) * 1.e-6;
lon_ += sinArg * (double)(pc[i].lon_a) + cosArg * (double)(pc[i].lon_b);
lat_ += sinArg * (double)(pc[i].lat_a) + cosArg * (double)(pc[i].lat_b);
rad_ += sinArg * (double)(pc[i].rad_a) + cosArg * (double)(pc[i].rad_b);
}
}
rad_ = rad_ / 10.0; // convert back to AUs
loc.set( Math.toRadians(lat_), Math.toRadians(lon_), rad_ );
}
};
Ads help maintain this website.