import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Color;
//
/**惑星系クラス(Applet憑き)*/
public class PlanetarySystem2 extends Applet implements Runnable{
//汎用定数
public double G = 6.672*Math.pow(10,-11); //万有引力定数
public double mAU = 149597870; //天文単位/1000
//Applet用定数など
public static final int APPLET_WIDTH=300;
public static final int APPLET_HEIGHT=300;
public static final double RANDOM_PATTERNS=10000;//乱数パターン数
public Thread thread;
public Graphics graphics;
//主なfields
public int minorbodies; //メンバ小天体数
public double dt; //微少時間
public long time;//時間
//天体データ配列
public double[] x; //x座標
public double[] y; //y座標
public double[] z; //z座標
public double[] px; //運動量x成分
public double[] py; //運動量y成分
public double[] pz; //運動量z成分
public double[] m; //質量
public double[] r; //半径
public boolean[] isConflicted;//衝突フラグ
public int[] xx; //2DApplet表示用x座標
public int[] yy; //2DApplet表示用y座標
public int[] bxx; //2DApplet消去用x座標
public int[] byy; //2DApplet消去用y座標
public boolean[] isSeen;//2DApplet表示フラグ
//ウィンドウ変数
public double scale;//表示される領域の幅(=高さ)
public double CX;//表示領域センターx座標
public double CY;//表示領域センターy座標
public double WX0;//表示領域始点x座標
public double WY0;//表示領域始点y座標
public double WX1;//表示領域終点x座標
public double WY1;//表示領域終点y座標
//Applet初期化
public void init(){
time=0;
//コンピュータ時間によるMath.random()空回し
for(int i=0;i<(int)(System.currentTimeMillis()%RANDOM_PATTERNS);i++){
Math.random();
}
initialize();
initWindowCtoW();
graphics = this.getGraphics();
}
//------------------INITIALIZATION----------------------
public void initialize(){
CX=0;//宇宙のセンターをフォーカス
CY=0;//宇宙のセンターをフォーカス
scale=10*mAU;//1画面=0.01天文単位
dt=10000;//微少時間
minorbodies = 20;//天体数20個
x=new double[minorbodies];
y=new double[minorbodies];
z=new double[minorbodies];
px=new double[minorbodies];
py=new double[minorbodies];
pz=new double[minorbodies];
m=new double[minorbodies];
r=new double[minorbodies];
xx=new int[minorbodies];
yy=new int[minorbodies];
bxx=new int[minorbodies];
byy=new int[minorbodies];
isSeen=new boolean[minorbodies];
isConflicted=new boolean[minorbodies];
for(int i=0;iAPPLET_WIDTH || yy_>APPLET_HEIGHT){
isSeen[a] = false;
}else{
bxx[a]=xx[a];
byy[a]=yy[a];
xx[a]=(int)xx_;//2d変換
yy[a]=(int)yy_;//2d変換
isSeen[a] = true;
}
}
//計算-----------------------------------------------
public void calc(){
//運動量変化・衝突計算
for(int i=0;i