seeseeauthor
public abstract class Planet extends HeavenlyBody {
public static final int SUN = -1;
public static final int MERCURY = 0;
public static final int VENUS = 1;
public static final int EARTH = 2;
public static final int MARS = 3;
public static final int JUPITER = 4;
public static final int SATURN = 5;
public static final int URANUS = 6;
public static final int NEPTUNE = 7;
public static final int PLUTO = 8;
public static final double DEGREES_PER_DAY = 360.0 / 365.242191 ;
public static final int planetEpoch = AstroCalendar.EPOCH_1990_PRE_MID;
private Angle helioCentricLongitude;
private double daysSinceEpoch;
paramtheInstance
public Planet (AstroCalendar theInstance) {
super(theInstance);
helioCentricLongitude = null;
daysSinceEpoch = theInstance.daysFromEpoch(planetEpoch);
}
public Angle getHelioCentricLongitude() {
if (helioCentricLongitude == null) {
helioCentricLongitude =
Angle.sumOf(getLongitudeAtEpoch(),
DEGREES_PER_DAY * daysSinceEpoch / getPeriod()) ;
}
return helioCentricLongitude;
}
public double getDaysSinceEpoch() {
return daysSinceEpoch;
}
public Angle getLongitudeWithRespectTo (Planet another) {
Angle l = getHelioCentricLongitude();
Angle L = another.getHelioCentricLongitude();
double a = getSemiMajorAxis();
if (a > another.getSemiMajorAxis()) {
Angle longitudeDifference = Angle.differenceOf(l, L);
double tanLambda = longitudeDifference.sin() /
(a - longitudeDifference.cos());
return Angle.sumOf(l, Angle.atan(tanLambda));
} else {
Angle longitudeDifference = Angle.differenceOf(L, l);
double tanLambda =
a * longitudeDifference.sin() /
(1.0 - a * longitudeDifference.cos());
return Angle.sumOf(Angle.sumOf(L, 180.0),
Angle.atan(tanLambda));
}
}
public abstract Angle getLongitudeAtEpoch();
public abstract double getPeriod();
public abstract double getSemiMajorAxis();
}