//=======================file name : SolarSys=========== // Simulation for a soler system 1.03 (JDK1.02) // KATO Noriyoshi 1997.3.23 // Sendai Miyagi Japan //==================================================== import java.applet.*; import java.awt.*; public class SolarSys extends Applet implements Runnable { Graphics g_this; Image offScreen; Graphics offGraphics; Dimension dim1; Thread th; Color col=new Color(75,85,135); //variables for Runge-Kutta double x[][]=new double[10][3]; double v[][]=new double[10][3]; double dx[][][]=new double[10][10][3]; double nrm[][][]=new double[10][10][3]; double pow[][]=new double[10][10]; double ik[][][]=new double[4][10][3]; double im[][][]=new double[4][10][3]; double r[][]=new double[10][10]; double aa[][]=new double[10][10]; double al[][]=new double[10][10]; int ap[][]=new int[10][10]; double b[]=new double[10]; double c[]=new double[10]; double d[][]=new double[10][3]; double x0[][]=new double[10][3]; double mass[]=new double[10]; double x1[][]=new double[10][3]; double v1[][]=new double[10][3]; double v2[][]=new double[10][3]; double vn[][]=new double[10][3]; double w[][]=new double[10][3]; double w1[][]=new double[10][3]; double va[]=new double[10]; double f[][]=new double[10][3]; double coef[]={1.,2.,2.,1.}; //switch of forces boolean swa=true; boolean swb=true; boolean swc=true; boolean swd=true; int dim;//# of dimension -1 int n;//# of body-1 double dt;//time interval double time;//time int FONTSIZE1=12; int oldx[][]=new int[3][2]; int oldnv[][]=new int[3][4]; Point pt0=new Point(220,200); int drawmode=2; int drawinitflag=1; int stepflag=0; int drawvflag=1; int targetn=0; int oldtargetn=0; int dd[]={10,5,20}; int DD=11; Color co[]={Color.cyan,Color.green,Color.yellow}; public void init(){ int i,k; Font f=new Font("TimesRoman",Font.PLAIN,FONTSIZE1); setFont(f); setLayout(new BorderLayout()); Panel p = new Panel(); p.setLayout(new GridLayout(4,1)); p.add(new Button("Start")); p.add(new Button("Stop")); p.add(new Button("Strobo")); p.add(new Button("Reset")); add("East", p); initrk();//initialize for RK method drawinitflag=1; resize(500,400); setBackground(col); dim1=this.size(); if (offScreen == null) { offScreen = createImage(dim1.width,dim1.height); offGraphics = offScreen.getGraphics(); } } //calculation for the accelaration public void acce(){ int i,j,k; double fw,fw1; if(swa||swc){ for(i=0;i<=n;i++){ if(swa){ for(j=0;j<=i;j++){ fw=0.; for(k=0;k<=dim;k++){ if(i!=j){ dx[i][j][k]=x1[i][k]-x1[j][k]; dx[j][i][k]=x1[j][k]-x1[i][k]; } else dx[i][j][k]=x1[i][k]-x0[j][k]; fw+=dx[i][j][k]*dx[i][j][k]; } r[i][j]=Math.sqrt(fw); for(k=0;k<=dim;k++){ if(r[i][j]!=0) nrm[i][j][k]=dx[i][j][k]/r[i][j]; else nrm[i][j][0]=1.; if(i!=j) nrm[j][i][k]=-nrm[i][j][k]; } r[i][j]-=al[i][j]; r[j][i]=r[i][j]; if(ap[i][j]==0) pow[i][j]=1.; if(ap[i][j]==-2) pow[i][j]=1./r[i][j]/r[i][j]; if(ap[i][j]==1) pow[i][j]=r[i][j]; if(ap[i][j]==2){ if(r[i][j]>al[i][j]){ pow[i][j]=r[i][j]-al[i][j]; } else{ pow[i][j]=0.; } } pow[i][j]=pow[i][j]*aa[i][j]; pow[j][i]=pow[i][j]; } } fw1=0; for(k=0;k<=dim;k++) fw1+=v1[i][k]*v1[i][k]; va[i]=Math.sqrt(fw1); for(k=0;k<=dim;k++){ if(va[i]!=0.) vn[i][k]=v1[i][k]/va[i]; } } } for(i=0;i<=n;i++){ for(k=0;k<=dim;k++) f[i][k]=0.;//clear } for(i=0;i<=n;i++){ for(k=0;k<=dim;k++){ if(swa){ for(j=0;j<=n;j++) f[i][k]+=pow[i][j]*nrm[i][j][k]; } if(swb) f[i][k]+=b[i]*v1[i][k]; if(swc) f[i][k]+=c[i]*va[i]*va[i]*vn[i][k]; if(swd) f[i][k]+=d[i][k]; f[i][k]/=mass[i]; } } } //Runge-Kutta method public void rk(){ int i,j,k,l; for(i=0;i<=n;i++){ for(k=0;k<=dim;k++){ x1[i][k]=x[i][k]; v1[i][k]=v[i][k]; w[i][k]=0.; w1[i][k]=0.; } } acce(); for(l=0;l<=2;l++){ for(i=0;i<=n;i++){ for(k=0;k<=dim;k++){ ik[l][i][k]=dt*v1[i][k]; im[l][i][k]=dt*f[i][k]; x1[i][k]=x[i][k]+ik[l][i][k]/coef[l+1]; v1[i][k]=v[i][k]+im[l][i][k]/coef[l+1]; w[i][k]+=ik[l][i][k]*coef[l]; w1[i][k]+=im[l][i][k]*coef[l]; } } acce(); } for(i=0;i<=n;i++){ for(k=0;k<=dim;k++){ ik[l][i][k]=dt*v1[i][k]; im[l][i][k]=dt*f[i][k]; x1[i][k]=x[i][k]+(w[i][k]+ik[3][i][k])/6.; v1[i][k]=v[i][k]+(w1[i][k]+im[3][i][k])/6.; } } for(i=0;i<=n;i++){ for(k=0;k<=dim;k++){ x[i][k]=x1[i][k]; v[i][k]=v1[i][k]; } } } public void initrk(){ int i,j; dim=1;//# of dimension-1 n=2;//# ob bodies-1 dt=.03;//time interval //initial position of a body x[i][n]@i:body #,n:axis# // x y z x[0][0]=120 ; x[0][1]=0. ; x[1][0]=140 ; x[1][1]=0. ; x[2][0]=0. ; x[2][1]=0.; //position of fixed point // x0 y0 z0 x0[0][0]=0. ; x0[0][1]=0. ; x0[1][0]=0. ; x0[1][1]=0. ; x0[2][0]=0. ; x0[2][1]=0. ; //velosity v[i][n]@i:body#,n:axis# // v x v y vz v[0][0]=0. ; v[0][1]=-18.; v[1][0]=0. ; v[1][1]=-32. ; v[2][0]=0. ; v[2][1]=-(v[0][1]+v[1][1] *0.1)/10.; //mass mass[0]=1; mass[1]=0.1; mass[2]=10; //---setting of the forces------- swa=true;//interaction between two bodies //strength aa[0][0]=0; aa[1][0]=-500.; aa[1][1]=0; aa[2][0]=-50000.; aa[2][1]=-5000.; aa[2][2]=0; //power ap[0][0]=0; ap[1][0]=-2; ap[1][1]=0; ap[2][0]=-2; ap[2][1]=-2; ap[2][2]=0; //length of spring al[0][0]=0.; al[1][0]=0.; al[1][1]=0.; al[2][0]=0.; al[2][1]=0.; al[2][2]=0.; if(n>0){//symmetrize for(i=1;i<=n;i++){ for(j=0;j380)&&(xd>360)&&(xd<430))){ i=targetn; repaint(); v[i][0]=(double)(xd-x[i][0]-pt0.x)/2.; v[i][1]=(double)(yd-x[i][1]-pt0.y)/2.; } return true; } public boolean mouseDown(Event e,int xd,int yd){ int i; if((yd>380)&&(xd>365)&&(xd<425)){ oldtargetn=targetn; targetn=(xd-365)/20; repaint(); } return true; } public boolean action(Event e, Object o) { if(e.target instanceof Button) { if ("Start".equals(o)) { drawinitflag=1; stepflag=0; drawmode = 2; calc(); drawmode = 1; } if ("Stop".equals(o)) { stepflag=0; drawmode = 2; return true; } if ("Strobo".equals(o)) { drawinitflag=1; stepflag=1; drawmode = 1; return true; } if ("Reset".equals(o)) { drawinitflag=1; stepflag=0; drawmode = 2; initrk(); drawvflag=1; repaint(); return true; } return true; } return super.handleEvent(e); } public void start(){ if(th==null){ th=new Thread(this); th.start(); } } public void run(){ while(th!=null){ if(drawmode==1){ try{ calc(); calc(); calc(); calc(); calc(); repaint(); th.sleep(50); }catch(InterruptedException e){ ; } } } } public void stop(){ if(th !=null){ th.stop(); th=null; } } public void update(Graphics g){ paint(g); } public void paint(Graphics g){ int i,j,k; if(drawinitflag==1){ offGraphics.setColor(getBackground()); offGraphics.fillRect(0,0,dim1.width,dim1.height); drawinitflag=0; } if(stepflag !=1){ offGraphics.setColor(getBackground()); offGraphics.fillRect(0,0,dim1.width,dim1.height); } for(i=0;i<=n;i++){ offGraphics.setColor(co[i]); oldx[i][0]=pt0.x+(int)(x[i][0]-dd[i]*.5); oldx[i][1]=pt0.y+(int)(x[i][1]-dd[i]*.5); offGraphics.fillOval(oldx[i][0],oldx[i][1],dd[i],dd[i]); offGraphics.fillOval(370+20*i,385,DD,DD); offGraphics.setColor(Color.pink); oldnv[i][0]=pt0.x+(int)(x[i][0]); oldnv[i][1]=pt0.y+(int)(x[i][1]); oldnv[i][2]=pt0.x+(int)(x[i][0]+v[i][0]*2.); oldnv[i][3]=pt0.y+(int)(x[i][1]+v[i][1]*2.); offGraphics.drawLine(oldnv[i][0],oldnv[i][1],oldnv[i][2],oldnv[i][3]); } offGraphics.setColor(getBackground()); offGraphics.fillOval(373+20*targetn,388,DD-6,DD-6); offGraphics.setColor(Color.white); offGraphics.drawString("Body selector",370,380); g.drawImage(offScreen,0,0,this); } }