package views;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import models.Coordinates;
import models.coordinates.EclipticCoordinates;
import models.coordinates.LocalHorizontalCoordinates;
import models.coordinates.UserCoordinates;
/**
*
* @author francois
*
*/
public class Moon extends Astre {
protected static int paintWidth = 14;
protected static int paintHeight = 14;
private final Image icon;
/**
* creates the moon
*/
public Moon() {
color = Color.blue;
this.icon = Toolkit.getDefaultToolkit().getImage("data/img/moon_icon.png");
}
@Override
public void draw(Graphics g, UserCoordinates uc, Circle mapBounds) {
LocalHorizontalCoordinates lhc = moonPosition(uc);
if (lhc.isVisible()) {
g.setColor(getColor());
Point p = getProjection(lhc, mapBounds);
g.drawImage(icon, p.x - paintWidth / 2, p.y - paintHeight / 2, paintWidth, paintHeight, null);
//g.fillOval(p.x - paintWidth / 2, p.y - paintHeight / 2, paintWidth, paintHeight);
}
}
/**
* @param uc
* @return the position of the moon in ecliptic coordinates
*/
public static LocalHorizontalCoordinates moonPosition(UserCoordinates uc) {
EclipticCoordinates c = moonPosition(uc.getJulianDate().getDecimalCentury());
return Coordinates.eclipticToLocalHorizontal(c, uc);
}
private static EclipticCoordinates moonPosition(final double T) {
double T2 = T * T;
double T3 = T2 * T;
double L = Math.toRadians(270.434164) + Math.toRadians(481267.8831) * T - Math.toRadians(0.001133) * T2 + Math.toRadians(0.0000019) * T3;
double M = Math.toRadians(296.104608) + Math.toRadians(477198.8491) * T + Math.toRadians(0.009192) * T2 + Math.toRadians(0.0000144) * T3;
double D = Math.toRadians(350.737486) + Math.toRadians(445267.1142) * T - Math.toRadians(0.001436) * T2 + Math.toRadians(0.0000019) * T3;
double F = Math.toRadians(11.250889) + Math.toRadians(483202.0251) * T - Math.toRadians(0.003211) * T2 - Math.toRadians(0.0000003) * T3;
double Omega = Math.toRadians(259.183275) - Math.toRadians(1934.1420) * T + Math.toRadians(0.002078) * T2 + Math.toRadians(0.0000022) * T3;
double lambda = L + Math.toRadians(6.288750) * Math.sin(M) + Math.toRadians(1.274018) * Math.sin(2 * D - M) + Math.toRadians(0.658309) * Math.sin(2 * D) + Math.toRadians(0.213616) * Math.sin(2 * M);
double B = Math.toRadians(5.128189) * Math.sin(F) + Math.toRadians(0.280606) * Math.sin(M + F) + Math.toRadians(0.277693) * Math.sin(M - F) + Math.toRadians(0.173238) * Math.sin(2 * D - F);
double omega1 = Math.toRadians(0.0004664) * Math.cos(Omega);
double omega2 = Math.toRadians(0.0000754) * Math.cos(Omega + Math.toRadians(275.05) - Math.toRadians(2.3) * T);
double beta = B * (1 - omega1 - omega2);
return new EclipticCoordinates(lambda, beta);
}
}