Java tutorial
//package com.java2s; public class Main { /** * Calculate the difference between true solar time and mean. The "equation * of time" is a term accounting for changes in the time of solar noon for * a given location over the course of a year. Earth's elliptical orbit and * Kepler's law of equal areas in equal times are the culprits behind this * phenomenon. See the * <A HREF="http://www.analemma.com/Pages/framesPage.html">Analemma page</A>. * Below is a plot of the equation of time versus the day of the year. * * <P align="center"><img src="doc-files/EquationOfTime.png"></P> * * @param t number of Julian centuries since J2000. * @return Equation of time in minutes of time. */ private static double equationOfTime(final double t) { double eps = Math.toRadians(obliquityCorrected(t)); double l0 = Math.toRadians(sunGeometricMeanLongitude(t)); double m = Math.toRadians(sunGeometricMeanAnomaly(t)); double e = eccentricityEarthOrbit(t); double y = Math.tan(eps / 2); y *= y; double sin2l0 = Math.sin(2 * l0); double cos2l0 = Math.cos(2 * l0); double sin4l0 = Math.sin(4 * l0); double sin1m = Math.sin(m); double sin2m = Math.sin(2 * m); double etime = y * sin2l0 - 2 * e * sin1m + 4 * e * y * sin1m * cos2l0 - 0.5 * y * y * sin4l0 - 1.25 * e * e * sin2m; return Math.toDegrees(etime) * 4.0; } /** * Calculate the corrected obliquity of the ecliptic. * * @param t number of Julian centuries since J2000. * @return Corrected obliquity in degrees. */ private static double obliquityCorrected(final double t) { final double e0 = meanObliquityOfEcliptic(t); final double omega = Math.toRadians(125.04 - 1934.136 * t); return e0 + 0.00256 * Math.cos(omega); } /** * Calculate the Geometric Mean Longitude of the Sun. * This value is close to 0 degree at the spring equinox, * 90 degree at the summer solstice, 180 degree at the automne equinox * and 270 degree at the winter solstice. * * @param t number of Julian centuries since J2000. * @return Geometric Mean Longitude of the Sun in degrees, * in the range 0 degree (inclusive) to 360 degree (exclusive). */ private static double sunGeometricMeanLongitude(final double t) { double L0 = 280.46646 + t * (36000.76983 + 0.0003032 * t); L0 = L0 - 360 * Math.floor(L0 / 360); return L0; } /** * Calculate the Geometric Mean Anomaly of the Sun. * * @param t number of Julian centuries since J2000. * @return Geometric Mean Anomaly of the Sun in degrees. */ private static double sunGeometricMeanAnomaly(final double t) { return 357.52911 + t * (35999.05029 - 0.0001537 * t); } /** * Calculate the eccentricity of earth's orbit. This is the ratio * {@code (a-b)/a} where <var>a</var> is the semi-major axis * length and <var>b</var> is the semi-minor axis length. Value * is 0 for a circular orbit. * * @param t number of Julian centuries since J2000. * @return The unitless eccentricity. */ private static double eccentricityEarthOrbit(final double t) { return 0.016708634 - t * (0.000042037 + 0.0000001267 * t); } /** * Calculate the mean obliquity of the ecliptic. * * @param t number of Julian centuries since J2000. * @return Mean obliquity in degrees. */ private static double meanObliquityOfEcliptic(final double t) { final double seconds = 21.448 - t * (46.8150 + t * (0.00059 - t * (0.001813))); return 23.0 + (26.0 + (seconds / 60.0)) / 60.0; } }