/**小天体クラス*/ public class Minorbody{ public PlanetarySystem motherSystem; 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 double xx_; //2DApplettest用x座標 public double yy_; //2DApplettest用y座標 public boolean isSeen;//2DApplet表示フラグ /**コンストラクタ 形式 : no paramter*/ public Minorbody(){} /* 形式 : new Minorbody(属する天体系クラス,x,y,z,px,py,pz,m,r) */ public Minorbody(PlanetarySystem ms_,double x_,double y_,double z_, double px_,double py_,double pz_, double m_,double r_){ motherSystem=ms_; x= x_; y= y_; z= z_; px=px_; py=py_; pz=pz_; m= m_; r= r_; } /**万有引力による運動量変化(dtによる近似)及び衝突 形式 : beEffected(相手の小天体クラス) 戻り値 : = 衝突したか */ public boolean beEffected(Minorbody a){ double l2; //距離の2乗 boolean ans=false; l2 = (a.x-x)*(a.x-x)+(a.y-y)*(a.y-y)+(a.z-z)*(a.z-z); //衝突 /* if(l2<(a.r+r)*(a.r+r)){ px = px+a.px; py = py+a.py; pz = pz+a.pz; x = (x*m+a.x*a.m)/(m+a.m);//重心の位置を新天体の位置に y = (y*m+a.y*a.m)/(m+a.m);//重心の位置を新天体の位置に z = (y*m+a.z*a.m)/(m+a.m);//重心の位置を新天体の位置に m = m+a.m; r = Math.pow(r*r*r+a.r*a.r*a.r , 1.0/3.0);//体積から計算 a.isConflicted = true;//相手の衝突フラグを立てる return true; }*/ px -= motherSystem.K*m*a.m/l2 * (x-a.x)/Math.abs(x-a.x) * motherSystem.dt; py -= motherSystem.K*m*a.m/l2 * (y-a.y)/Math.abs(y-a.y) * motherSystem.dt; pz -= motherSystem.K*m*a.m/l2 * (z-a.z)/Math.abs(z-a.z) * motherSystem.dt; return false; } /**運動量による位置変化(差分近似)*/ public void move(){ double denom = m*motherSystem.dt; x+=px/denom*10000;//System.out.print("vx="+px/denom); y+=py/denom*10000;//System.out.print(",vy="+py/denom); z+=pz/denom*10000;//System.out.println(",vz="+pz/denom); // Console.readLine(); //2d変換 xx_= (x-motherSystem.WX0)*motherSystem.APPLET_WIDTH/motherSystem.scale; yy_= (y-motherSystem.WY0)*motherSystem.APPLET_HEIGHT/motherSystem.scale; //表示領域判定 if(xx_<0.0 || yy_<0.0 || xx_>motherSystem.APPLET_WIDTH || yy_>motherSystem.APPLET_HEIGHT){ isSeen = false; }else{ xx=(int)xx_;//2d変換 yy=(int)yy_;//2d変換 isSeen = true; } } }