/*****************************************************************************\
* Vsop
\*****************************************************************************/
package com.mhuss.AstroLib;
/**
* This class wraps the VSOP87 data and provides VSOP planetary
* position calculation functions for Mercury through Neptune
* (VSOP doesn't handle the moon or Pluto).
*
* Based on C code by Bill Gray (www.projectpluto.com)
*/
public class Vsop {
// All "magic numbers" are from Meeus, Astronomical Algorithms, 2ed
/**
* Calculate a single location element (latitude, longitude, or radius).
*
* This function, using the simplified VSOP87 data in Meeus, can
* compute planetary positions in heliocentric ecliptic coordinates.
*
* Longitude & latitude are in radians.
*
* @param t Time in Julian centuries from J2000
* @param planet One of the constants from Planets.MERCURY
* to Planets.NEPTUNE inclusive.
* @param ltype location element type:
*
- LocationElements.LONGITUDE for ecliptic longitude
*
- LocationElements.LATITUDE for ecliptic latitude
*
- LocationElements.RADIUS for distance from sun.
* (These are ecliptic coordinates of date, by the way!)
* @return The selected element, or 0.0 if planet parameter is
* invalid.
*/
public static double calcLE(
double t, // time in decimal centuries
int planet, // must be in the range SUN...NEPTUNE
int ltype) // LocationElements.LATITUDE, LONGITUDE, or RADIUS
{
double rval = 0.0;
if( planet > Planets.SUN && planet < Planets.PLUTO ) {
t /= 10.; // convert to julian millenia
double tPower = 1.0;
VsopTerms pT[] = null;
switch ( planet ) {
case Planets.MERCURY:
switch ( ltype ) {
case LocationElements.LONGITUDE:
pT = VsopData.MercuryLonTerms;
break;
case LocationElements.LATITUDE:
pT = VsopData.MercuryLatTerms;
break;
case LocationElements.RADIUS:
pT = VsopData.MercuryRadTerms;
break;
}
break;
case Planets.VENUS:
switch ( ltype ) {
case LocationElements.LONGITUDE:
pT = VsopData.VenusLonTerms;
break;
case LocationElements.LATITUDE:
pT = VsopData.VenusLatTerms;
break;
case LocationElements.RADIUS:
pT = VsopData.VenusRadTerms;
break;
}
break;
case Planets.EARTH:
switch ( ltype ) {
case LocationElements.LONGITUDE:
pT = VsopData.EarthLonTerms;
break;
case LocationElements.LATITUDE:
pT = VsopData.EarthLatTerms;
break;
case LocationElements.RADIUS:
pT = VsopData.EarthRadTerms;
break;
}
break;
case Planets.MARS:
switch ( ltype ) {
case LocationElements.LONGITUDE:
pT = VsopData.MarsLonTerms;
break;
case LocationElements.LATITUDE:
pT = VsopData.MarsLatTerms;
break;
case LocationElements.RADIUS:
pT = VsopData.MarsRadTerms;
break;
}
break;
case Planets.JUPITER:
switch ( ltype ) {
case LocationElements.LONGITUDE:
pT = VsopData.JupiterLonTerms;
break;
case LocationElements.LATITUDE:
pT = VsopData.JupiterLatTerms;
break;
case LocationElements.RADIUS:
pT = VsopData.JupiterRadTerms;
break;
}
break;
case Planets.SATURN:
switch ( ltype ) {
case LocationElements.LONGITUDE:
pT = VsopData.SaturnLonTerms;
break;
case LocationElements.LATITUDE:
pT = VsopData.SaturnLatTerms;
break;
case LocationElements.RADIUS:
pT = VsopData.SaturnRadTerms;
break;
}
break;
case Planets.URANUS:
switch ( ltype ) {
case LocationElements.LONGITUDE:
pT = VsopData.UranusLonTerms;
break;
case LocationElements.LATITUDE:
pT = VsopData.UranusLatTerms;
break;
case LocationElements.RADIUS:
pT = VsopData.UranusRadTerms;
break;
}
break;
case Planets.NEPTUNE:
switch ( ltype ) {
case LocationElements.LONGITUDE:
pT = VsopData.NeptuneLonTerms;
break;
case LocationElements.LATITUDE:
pT = VsopData.NeptuneLatTerms;
break;
case LocationElements.RADIUS:
pT = VsopData.NeptuneRadTerms;
break;
}
break;
default: break;
};
// Always six series to calculate
int i=0, j=0;
try {
for( ; i<6; i++ ) {
double sum = 0.;
VsopSet pv[] = pT[i].pTerms;
// sum the term = A x cos( B + C x tc ) for each row
for( j=0; j
Ads help maintain this website.