import java.applet.Applet; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.lang.*; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; //--------------------------------------------------------------------// // 惑星までの距離 // //--------------------------------------------------------------------// public class planet1 extends Applet{ int year,mon,day,hour,min,sec; // 年・月・日・時・分・秒 int jyear,jmon,jday,jhour,jmin,jsec; // 日本時間 double jd,mjd,jjd; // ユリウス日・準ユリウス日・日本時間 double round_jd,round_au,round_km; // 数値丸め値 double pi,rad,aukm,tol; int fx,fy; // 画面フレームサイズ int cx1,cy1,cx2,cy2,plr; // 画面表示の中心位置・マーク大きさ double lcoef1,lcoef2; // 画面上での1AUの長さ SimpleDateFormat formatter; Date currentDate; Font font; double x[]=new double[9]; // 惑星座標位置(太陽原点) double y[]=new double[9]; double z[]=new double[9]; int gx[]=new int[9]; // 画面上での惑星位置 int gy[]=new int[9]; double lens[]=new double[9]; // 太陽からの距離 (AU) double lens2[]=new double[9]; // 太陽からの距離 (km) double lene[]=new double[9]; // 地球からの距離 (AU) double lene2[]=new double[9]; // 地球からの距離 (km) double ox[]=new double[360]; // 軌道上点座標値 double oy[]=new double[360]; int gox[]=new int[360]; // 画面上での軌道上点位置 int goy[]=new int[360]; // 惑星の名前 String namee[]={"Mercury","Venus","Earth","Mars","Jupiter","Saturn", "Uranus","Neptune","Pluto"}; // 表示色 Color plcolor[]={Color.pink,Color.green,Color.cyan,Color.red, Color.magenta,Color.orange,Color.green,Color.cyan, Color.lightGray}; // 軌道長半径 double sma[]={0.38710,0.72333,1,1.52368,5.20260,9.55491,19.21845, 30.11039,39.54034}; // 離心率 double eccen[]={0.20563,0.00677,0.01671,0.09340,0.04850,0.05555, 0.04638,0.00946,0.24901}; // 近日点黄経 double lofp[]={77.4561,131.5637,102.9373,336.0602,14.3312,93.0572, 173.0054,48.1203,224.1416}; // 昇交点黄経 double lofan[]={48.3309,76.6799,0,49.5581,100.4644,113.6655,74.0059, 131.7840,110.3182}; // 軌道傾斜角 double inc[]={7.0050,3.3947,0,1.8497,1.3033,2.4889,0.7732,1.7700, 17.1451}; // 平均黄経 double meanl[]={250.2047,181.1787,99.9736,355.1710,34.3100,50.0607, 314.0491,304.3457,238.4650}; // 角速度 °/日 double pinv[]={4.092377,1.602169,0.985647,0.524071,0.083129,0.033498, 0.011769,0.006020,0.004016}; //--------------------------------------------------------------------// public void init(){ year=2000;mon=1;day=1;hour=1;min=10;sec=0; jyear=2000;jmon=1;jday=1;jhour=10;jmin=10;jsec=0; jd=2450000;mjd=50000;jjd=2450000; round_jd=1.0e-5;round_au=1.0e-4;round_km=1.0;tol=1.0e-8; fx=600;fy=550; cx1=120;cy1=400;cx2=420;cy2=400;plr=3; lcoef1=65.0;lcoef2=2.6; pi=4*Math.atan(1.0);rad=pi/180.0;aukm=1.4959787e8; degreeToRadian(lofp); degreeToRadian(lofan); degreeToRadian(inc); degreeToRadian(meanl); degreeToRadian(pinv); currentDate = new Date(); formatter=new SimpleDateFormat("s",Locale.getDefault()); font=new Font("Monospaced",Font.PLAIN,14); } //--------------------------------------------------------------------// public void paint(Graphics g){ int scale1,scale2,scx1,scy1,scx2,scy2; double dth; g.setFont(font); g.setColor(Color.black); g.fillRect(0,0,fx,fy); g.setColor(Color.white); // 現在時刻・ユリウス日 getCurrentDate(); jjd=dateToJulianDay(jyear,jmon,jday,jhour,jmin,jsec); jd=jjd-0.375; mjd=jd-2400000.5; julianDayToDate(jd); // 現在時刻・ユリウス日表示 g.drawString("JST",5,20); writeDate(g,jyear,jmon,jday,jhour,jmin,jsec,50,20); g.drawString("GMT",305,20); writeDate(g,year,mon,day,hour,min,sec,350,20); g.drawString("JD",5,40); writeJD(g,jd,50,40); g.drawString("MJD",305,40); writeJD(g,mjd,350,40); // 惑星との距離 e_distance(jd); g.drawString("form Earth",5,70); for(int i=0;iラジアン void degreeToRadian(double angle[]){ for(int i=0;iユリウス日 double dateToJulianDay(int year,int mon,int day, int hour,int min,int sec){ double d2=day+hour/24.0+min/1440.0+sec/86400.0; int m2=(mon+9)%12+1; int y2=year-(int)(m2/11); double jd=(int)(365.25*y2)+(int)(y2/400)-(int)(y2/100) +(int)(30.59*m2)+d2+1721088.5; return jd; } //--------------------------------------------------------------------// // ユリウス日->時刻 public void julianDayToDate(double jd){ int aa=(int)(jd+68569.5); int bb=(int)(aa/36524.25); int cc=aa-(int)(36524.25*bb+0.75); int ee=(int)((cc+1)/365.25025); int ff=cc-(int)(365.25*ee)+31; int gg=(int)(ff/30.59); int hh=(int)(gg/11); double ii=jd+0.5-(int)(jd+0.5); year=100*(bb-49)+ee+hh; mon=gg-12*hh+2; day=ff-(int)(30.59*gg); hour=(int)(24*ii); min=(int)(1440*(ii-hour/24.0)); sec=(int)(86400*(ii-hour/24.0-min/1440.0)); } //--------------------------------------------------------------------// // ケプラー方程式 double kepler(double m,double e){ double ei=m+e*Math.sin(m); double mi=ei-e*Math.sin(ei); double dm=Math.abs(m-mi); while(dm>tol){ ei=ei+(m-mi)/(1-e*Math.cos(ei)); mi=ei-e*Math.sin(ei); dm=Math.abs(m-mi); } return ei; } //--------------------------------------------------------------------// // 3次元2点間距離 double distance3D(double x1,double y1,double z1, double x2,double y2,double z2){ double dx=x2-x1; double dy=y2-y1; double dz=z2-z1; return Math.sqrt(dx*dx+dy*dy+dz*dz); } //--------------------------------------------------------------------// // 画面上座標 void coordG(double x[],double y[],int gx[],int gy[], int cx,int cy,double coef){ for(int i=0;i