import java.awt.*;
import java.applet.*;
import java.awt.Graphics;
import java.awt.Button;
import java.awt.TextField;
import java.awt.event.*;
import java.util.*;
public class PlanetA extends Applet implements ActionListener {
private TextField keido= new TextField(5);
private TextField ido= new TextField(5);
private Button go= new Button("表示");
Label moji1= new Label("緯度(東京35.7)");
Label moji2= new Label("経度(東京139.7)");
double azd_v=0,azd_m=0,azd_st=0,azd_j=0;
double altd_v=0,altd_m=0,altd_st=0,altd_j=0;

public void init(){
add(moji1);
add(ido);
add(moji2);
add(keido);
add(go);
go.addActionListener(this);
}

public void actionPerformed(ActionEvent e){
Calendar cal1 = Calendar.getInstance();
int Y = cal1.get(Calendar.YEAR); //(2)現在の年を取得
int m = cal1.get(Calendar.MONTH) + 1; //(3)現在の月を取得
int D = cal1.get(Calendar.DATE); //(4)現在の日を取得
double JUT = cal1.get(Calendar.HOUR_OF_DAY); //(5)現在の時を取得
int minute = cal1.get(Calendar.MINUTE); //(6)現在の分を取得
double UT, d;
double LL=Double.parseDouble(keido.getText());
double LAT=Double.parseDouble(ido.getText());
UT=JUT-9.0+minute/60.0;
if(UT<0)UT = UT+24.0;
d= 367*Y - (int)(7*(Y+ (int)((m+9)/12))/4) + (int)(275*m/9) +D -730530;
d= d+ UT/24.0;
//地軸の傾き
double ECL=23.4393- (3.563E-7)*d;
//太陽
double Ns=0.0,Is=0.0,As=1.0;
double Ws=282.9404+ (4.700935E-5)*d;
double Es=0.016709- (1.151E-9)*d;
double Ms= 356.047+ 0.9856002585* d;
//火星
double Nm=49.5574+ (2.11081E-5)*d;
double Im=1.8497+ (1.78E-8)*d;
double Wm= 286.5016 + (2.92961E-5)*d;
double Am=1.523688;
double Em=0.093405 - (2.516E-9)*d;
double Mm=18.6021 + 0.5240207766*d;
//木星
double Nj=100.4542+ (2.76854E-5)*d;
double Ij=1.303+ (1.557E-7)*d;
double Wj= 273.8777 + (1.64505E-5)*d;
double Aj=5.20256;
double Ej=0.048498 - (4.469E-9)*d;
double Mj=19.8950 + 0.0830853001*d;
//金星
double Nv=76.6799+ (2.4659E-5)*d;
double Iv=3.3946+ (2.75E-8)*d;
double Wv= 54.891 + (1.38374E-5)*d;
double Av=0.72333;
double Ev=0.006773 - (1.302E-9)*d;
double Mv=48.0052 + 1.6021302244*d;
//土星
double Nst=113.6634+ (2.3898E-5)*d;
double Ist=2.4886- (1.081E-7)*d;
double Wst= 339.3939 + (2.97661E-5)*d;
double Ast=9.55475;
double Est=0.055546 - (9.499E-9)*d;
double Mst=316.9670 + 0.0334442282*d;
double N,I,W,A,E,M;
//太陽の位置計算
N=Ns; I=Is; W=Ws; A=As; E=Es; M=Ms;
if(M<0){
do{
M= M+360;
}while(M<0);
}
if(M>360){
do{
M= M-360;
}while(M>360);
}
double Er= M*(Math.PI/180.0) + E * Math.sin(M*(Math.PI/180.0))*(1.0+ E*Math.cos(M*(Math.PI/180.0)));//ラジアン
double xv= Math.cos(Er)-E;
double yv= Math.sqrt(1.0-E*E)*Math.sin(Er);
double v= Math.atan2( yv, xv);
double r= Math.sqrt( xv*xv+ yv*yv);
double rs= r;
double lonsun= v + W*(Math.PI/180.0);
double xs= r * Math.cos(lonsun);
double ys= r * Math.sin(lonsun);
double xe= xs;
double ye= ys * Math.cos(ECL*(Math.PI/180.0));
double ze= ys * Math.sin(ECL*(Math.PI/180.0));
double RA= Math.atan2( ye, xe);
double Decl= Math.asin(ze/r);
//星座時間
double GMST, GMST0, L, LST;
L= W + M;
while(L>360){
L=L-360;
}

while (L<0){
L=L+360;
}
double GMST0h= (L + 180)/15.0;//時間
double SIDTIMEh= GMST0h + UT + LL/15.0;
double RAh= RA*(180.0/Math.PI)/15.0;
double HAh= SIDTIMEh - RAh;
double HAd= HAh * 15.0;
double HA= HAd*(Math.PI/180.0);
LST= SIDTIMEh* 15.0* (Math.PI/180.0);
for(int i=0; i<4;i++){
switch (i){
case 0:
N=Nv; I=Iv; W=Wv; A=Av; E=Ev; M=Mv;break;//金星
case 1:
N=Nm; I=Im; W=Wm; A=Am; E=Em; M=Mm;break;//火星
case 2:
N=Nj; I=Ij; W=Wj; A=Aj; E=Ej; M=Mj;break;//木星
case 3:
N=Nst; I=Ist; W=Wst; A=Ast; E=Est; M=Mst;break;//土星
}
if(M<0){
do{
M= M+360;
}while(M<0);
}
if(M>360){
do{
M= M-360;
}while(M>360);
}
Er= M*(Math.PI/180.0) + E * Math.sin(M*(Math.PI/180.0))*(1.0+ E*Math.cos(M*(Math.PI/180.0)));//ラジアン
xv= A *( Math.cos(Er)-E);
yv= A * (Math.sqrt(1.0-E*E)*Math.sin(Er));
v= Math.atan2( yv, xv);
r= Math.sqrt( xv*xv+ yv*yv);
double xh= r*(Math.cos(N*(Math.PI/180.0))*Math.cos(v+W*(Math.PI/180.0)) -Math.sin(N*(Math.PI/180.0))*Math.sin(v+W*(Math.PI/180.0)*Math.cos(I*(Math.PI/180.0))));
double yh= r*(Math.sin(N*(Math.PI/180.0))*Math.cos(v+W*(Math.PI/180.0)) +Math.cos(N*(Math.PI/180.0))*Math.sin(v+W*(Math.PI/180.0)*Math.cos(I*(Math.PI/180.0))));
double zh= r* (Math.sin(v+W*(Math.PI/180.0))*Math.sin(I*(Math.PI/180.0)));
double lonecl= Math.atan2(yh, xh);
double latecl= Math.atan2(zh, Math.sqrt(xh*xh+yh*yh));
xh= r* Math.cos(lonecl)* Math.cos(latecl);
yh= r* Math.sin(lonecl)* Math.cos(latecl);
zh= r * Math.sin(latecl);
xs= rs * Math.cos(lonsun);
ys= rs * Math.sin(lonsun);
double xg= xh + xs;
double yg= yh + ys;
double zg= zh;
xe= xg;
ye= yg * Math.cos(ECL*(Math.PI/180.0)) - zg*Math.sin(ECL*(Math.PI/180.0));
ze= yg * Math.sin(ECL*(Math.PI/180.0)) + zg*Math.cos(ECL*(Math.PI/180.0));
RA= Math.atan2(ye, xe);
Decl= Math.atan2(ze, Math.sqrt(xe*xe+ye*ye));

HA= LST-RA; double x= Math.cos(HA) * Math.cos(Decl);
double y= Math.sin(HA) * Math.cos(Decl);
double z= Math.sin(Decl);
double xhor= x* Math.sin(LAT*(Math.PI/180.0))- z*Math.cos(LAT*(Math.PI/180.0));
double yhor= y;
double zhor= x* Math.cos(LAT*(Math.PI/180.0))+ z*Math.sin(LAT*(Math.PI/180.0));
double az= Math.atan2(yhor,xhor) + Math.PI;
double alt= Math.asin(zhor);
double azd= az*(180.0/Math.PI);
double altd= alt*(180.0/Math.PI);
switch (i){
case 0:
azd_v= azd; altd_v= altd;break;//金星
case 1:
azd_m= azd; altd_m= altd;break;//火星
case 2:
azd_j= azd; altd_j= altd;break;//木星
case 3:
azd_st= azd; altd_st= altd;break;//土星
}
}
repaint();
}
public void paint(Graphics g){
ido.setText("35.7");
keido.setText("139.7");
g.drawString("天頂",1,60);
g.drawString("80°",1,80);
g.drawString("70°",1,100);
g.drawString("60°",1,120);
g.drawString("50°",1,140);
g.drawString("40°",1,160);
g.drawString("30°",1,180);
g.drawString("20°",1,200);
g.drawString("10°",1,220);
g.drawString(" ------------------------------------------------------------------------------------",1,240);
g.drawString("北",1,240);g.drawString("東",90,240);g.drawString("南",180,240);
g.drawString("西",270,240);g.drawString("北",360,240);
if(altd_m>0)g.drawString("火",(int)azd_m,240-(int)altd_m*2);
if(altd_j>0)g.drawString("木",(int)azd_j,240-(int)altd_j*2);
if(altd_v>0)g.drawString("金",(int)azd_v,240-(int)altd_v*2);
if(altd_st>0)g.drawString("土",(int)azd_st,240-(int)altd_st*2);
}
}