/* the solar system 3D */ /* coded by Ikeuchi Mitsuru */ /* ver 0.0.1 2003.08.24 */ /* ver 0.0.2 2003.08.27 change to realistic r and v */ import java.awt.*; import java.awt.event.*; import java.applet.*; public class solarSystem3D extends Applet implements MouseListener, MouseMotionListener, ItemListener, AdjustmentListener, Runnable { /*-------------------------------------- define gloval -----*/ Choice cvw; Scrollbar scs; Thread th = null; Dimension dim; Image imgOff; Graphics gOff; int sleepTime = 30; double scale = 1.0; int dispMode = 0; int dgX, dgY, dgXb,dgYb; double cx = 0.0; double cy = 0.0; double cz = 0.0; double theta = 15.0*3.14/180.0; double fai = 108.0*3.14/180.0; double dtheta = 0.0*3.14/180.0; double pai = 3.1415926536; double t = 0.0; /* time (s) */ double dt = 3600.0; /* time division (s) */ double solarSys[][] = { /* mass(kg) radious(m) orbitR(m) v_tan(m/s) color */ /* 0 Sun */ { 1.9890e30, 6.960e8, 0.0, 0.0, 0.01 }, /* 1 Mercury */ { 3.3022e23, 2.440e6, 5.790e10, 4.790e4, 0.60 }, /* 2 Venus */ { 4.8690e24, 6.052e6, 1.082e11, 3.505e4, 0.85 }, /* 3 Earth */ { 5.9742e24, 6.378e6, 1.496e11, 2.980e4, 0.33 }, /* 4 Mars */ { 6.4191e23, 3.397e6, 2.280e11, 2.414e4, 0.08 }, /* 5 Jupiter */ { 1.8988e27, 7.149e7, 7.784e11, 1.306e4, 0.45 }, /* 6 Saturn */ { 5.6841e26, 6.027e7, 1.4246e12, 9.650e3, 0.50 }, /* 7 Uranus */ { 8.6967e25, 2.556e7, 2.8669e12, 6.800e3, 0.55 }, /* 8 Neptune */ { 1.0285e26, 2.476e7, 4.4860e12, 5.430e3, 0.60 }, /* 9 Pluto */ { 1.4000e22, 1.137e6, 5.8897e12, 4.740e3, 0.75 } }; int Nmt = 10; int NN = Nmt + 1; double AU = 1.49597870e11; /* data from Web Version of MICA */ /* http://aa.usno.navy.mil/data/docs/WebMICA_2.html */ /* 2003 Jan 01 00:00:00.0 - 02:00:00.0 */ double posXYZ[][][] = { { /* 0 Sun */ { +0.001358537, -0.004387529, -0.001897513 }, { +0.001358834, -0.004387372, -0.001897454 }, { +0.001359131, -0.004387214, -0.001897394 } }, { /* 1 Mercury */ { +0.229184455, +0.198328442, +0.082759575 }, { +0.228137761, +0.199079593, +0.083269366 }, { +0.227087386, +0.199827443, +0.083777775 } }, { /* 2 Venus */ { -0.524625643, +0.428639950, +0.226207669 }, { -0.525201284, +0.428059124, +0.225982795 }, { -0.525776197, +0.427477699, +0.225757605 } }, { /* 3 Earth */ { -0.171170878, +0.883816752, +0.383177939 }, { -0.171888243, +0.883698845, +0.383126842 }, { -0.172605514, +0.883580456, +0.383075536 } }, { /* 4 Mars */ { -1.502331750, -0.557843298, -0.215113746 }, { -1.502095722, -0.558288672, -0.215324408 }, { -1.501859512, -0.558733978, -0.215535045 } }, { /* 5 Jupiter */ { -3.440225378, +3.671532995, +1.657499617 }, { -3.440468380, +3.671356832, +1.657430024 }, { -3.440711371, +3.671180657, +1.657360424 } }, { /* 6 Saturn */ { +0.617032002, +8.336344971, +3.416667095 }, { +0.616787728, +8.336355304, +3.416681879 }, { +0.616543453, +8.336365632, +3.416696661 } }, { /* 7 Uranus */ { +17.021312941, -9.560537477, -4.428021449 }, { +17.021397975, -9.560416379, -4.427969614 }, { +17.021483008, -9.560295281, -4.427917778 } }, { /* 8 Neptune */ { +19.520965719, -21.016674783, -9.088236086 }, { +19.521064398, -21.016594627, -9.088205735 }, { +19.521163077, -21.016514471, -9.088175383 } }, { /* 9 Pluto */ { -6.503495729, -29.044102940, -7.104381294 }, { -6.503365358, -29.044136477, -7.104431040 }, { -6.503234987, -29.044170013, -7.104480786 } } }; int kind[] = new int[NN]; double mass[] = new double[NN]; double radious[] = new double[NN]; double xx[] = new double[NN]; /* i-th x-position */ double yy[] = new double[NN]; /* i-th y-position */ double zz[] = new double[NN]; /* i-th z-position */ double vx[] = new double[NN]; /* i-th x-velocity */ double vy[] = new double[NN]; /* i-th y-velocity */ double vz[] = new double[NN]; /* i-th z-velocity */ double ffx[] = new double[NN]; /* i-th x-force */ double ffy[] = new double[NN]; /* i-th y-force */ double ffz[] = new double[NN]; /* i-th z-force */ double fbx[] = new double[NN]; /* i-th x-force before dt */ double fby[] = new double[NN]; /* i-th y-force before dt */ double fbz[] = new double[NN]; /* i-th z-force before dt */ int srtz[][] = new int[2][NN]; /* z-sort work space */ double px[] = new double[NN]; double py[] = new double[NN]; double pz[] = new double[NN]; double pnt[][] = { { 0.0, 0.0, 0.0 }, { 1.0e11, 0.0, 0.0 }, { 0.0, 1.0e11, 0.0 }, { 0.0, 0.0, 1.0e11 } }; double ppnt[][] = new double[4][3]; /*----------------------------- applet control functions -----*/ public void init() { resize(630,360); setBackground(Color.white); dim = getSize(); imgOff = createImage(dim.width,dim.height); gOff = imgOff.getGraphics(); scs= new Scrollbar(Scrollbar.HORIZONTAL,100,10,10,510); add(new Label("scale=")); add(scs); scs.addAdjustmentListener(this); addMouseListener(this); addMouseMotionListener(this); cvw = new Choice(); cvw.addItem("axis"); cvw.addItem("no axis"); add(new Label("view=")); add(cvw); cvw.addItemListener(this); setInitialPosition(); offPaint(); repaint(); } public void start() { if (th == null) { th = new Thread(this); th.start(); } } public void stop() { if (th != null) { th.stop(); th = null; } } public void itemStateChanged(ItemEvent ev){ if (ev.getSource() == cvw){ dispMode = cvw.getSelectedIndex(); offPaint(); repaint(); } } public void adjustmentValueChanged(AdjustmentEvent ev){ if (ev.getSource() == scs) { scale = 0.01*(double)(scs.getValue()); repaint(); } } public void mousePressed(MouseEvent ev){ } public void mouseReleased(MouseEvent ev){ dgXb = 0; dgYb = 0; dgX = 0; dgY = 0; } public void mouseClicked(MouseEvent ev){ } public void mouseEntered(MouseEvent ev){ } public void mouseExited (MouseEvent ev){ } public void mouseMoved (MouseEvent ev){ } public void mouseDragged(MouseEvent ev){ dgXb = dgX; dgYb = dgY; dgX=ev.getX(); dgY=ev.getY(); if (dgXb==0 && dgYb==0) { dgXb = dgX; dgYb = dgY; } theta -= 0.5*3.14/180.0*(dgX-dgXb); fai += 0.5*3.14/180.0*(dgY-dgYb); } public void run() { while (th != null) { try { calcposition(); offPaint(); repaint(); Thread.sleep(sleepTime); } catch (InterruptedException e) { } } } public void update(Graphics g) { paint(g); } public void paint(Graphics g) { g.drawImage(imgOff,0,0,this); } /* ----------------------------- offPaint -------------------- */ void offPaint() { int i,j,k; int ix,iy,ir,ilx,ily,ilx2,ily2; double mag; gOff.setColor(Color.black); gOff.fillRect(0,0,dim.width,dim.height); rotate(theta,fai); zSort(); if (dispMode==0) { for (i=0; i2.0) { mag = 2.0; } else if (mag<0.1) { mag = 0.1; } ir = (int)(scale*radious[j]/1.0e6*mag+0.499)+3; if (j==0) { gOff.setColor(Color.gray); for (k=1; k<4; k++) { ilx = (int)(scale*ppnt[0][0]/1.0e9+0.499)+200; ily = -(int)(scale*ppnt[0][1]/1.0e9+0.499)+180; ilx2 = (int)(scale*ppnt[k][0]/1.0e9+0.499)+200; ily2 = -(int)(scale*ppnt[k][1]/1.0e9+0.499)+180; gOff.drawLine(ilx,ily,ilx2,ily2); if (k==1) { gOff.drawString("x",ilx2,ily2); } else if (k==2) { gOff.drawString("y",ilx2,ily2); } else if (k==3) { gOff.drawString("z",ilx2,ily2); } } } gOff.setColor(Color.getHSBColor( (float)(solarSys[j][4]),0.95f,0.95f)); gOff.fillOval(ix-ir/2,iy-ir/2, ir, ir); } } else if (dispMode==1) { for (i=0; i2.0) { mag = 2.0; } else if (mag<0.1) { mag = 0.1; } ir = (int)(scale*radious[j]/1.0e6*mag+0.499)+3; gOff.setColor(Color.getHSBColor( (float)(solarSys[j][4]),0.95f,0.95f)); gOff.fillOval(ix-ir/2,iy-ir/2, ir, ir); } } gOff.setColor(Color.yellow); gOff.drawString("scale="+(int)(scale*100.0+0.499)+"%",500,20); gOff.drawString("from 2003.01.01",500,40); gOff.drawString("t="+(int)(t/3600.0/24.0+0.499)+"(day)",500,60); gOff.setColor(Color.getHSBColor((float)(solarSys[0][4]),0.95f,0.95f)); gOff.drawString("Sun",500,200); gOff.setColor(Color.getHSBColor((float)(solarSys[1][4]),0.95f,0.95f)); gOff.drawString("Mercury",500,220); gOff.setColor(Color.getHSBColor((float)(solarSys[2][4]),0.95f,0.95f)); gOff.drawString("Venus",500,240); gOff.setColor(Color.getHSBColor((float)(solarSys[3][4]),0.95f,0.95f)); gOff.drawString("Earth",500,260); gOff.setColor(Color.getHSBColor((float)(solarSys[4][4]),0.95f,0.95f)); gOff.drawString("Mars",500,280); gOff.setColor(Color.getHSBColor((float)(solarSys[5][4]),0.95f,0.95f)); gOff.drawString("Jupiter",500,300); gOff.setColor(Color.yellow); gOff.drawString("Earth-Mars",500,90); gOff.drawString("d="+(int)(distance(3,4)/1.0e3+0.499)+"(km)",500,110); /* gOff.setColor(Color.yellow); gOff.drawString("theta="+(int)(theta*180.0/3.1416+0.49)+"",500,90); gOff.drawString("fai="+(int)(fai*180.0/3.1416+0.49)+"",500,110); */ } double distance(int i, int j) { double x,y,z; x = xx[i] - xx[j]; y = yy[i] - yy[j]; z = zz[i] - zz[j]; return(Math.sqrt(x*x+y*y+z*z)); } /*------------------------------------- sort z ----------*/ void zSort() { int i,j,w; for (i=0; isrtz[1][j+1]) { w = srtz[0][j]; srtz[0][j]=srtz[0][j+1]; srtz[0][j+1]=w; w = srtz[1][j]; srtz[1][j]=srtz[1][j+1]; srtz[1][j+1]=w; } } } } /*------------------------------------- rotate ----------*/ void rotate(double th,double fi) { int i; double cosTh,sinTh,cosFi,sinFi; cosTh = Math.cos(th); sinTh = Math.sin(th); cosFi = Math.cos(fi); sinFi = Math.sin(fi); for (i=0; i