/* * h6a.java - revised 24 Nov 2010 - width 433, height 401 * @author jackord@kw.igs.net * central force motion: apsidal angle integral */ import java.applet.Applet; import java.awt.*; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class h6a extends Applet implements ActionListener { int kk=0; int n=1; int norbit=1; int orbit=0; // Global variables double c=0; double dr=0; double el=1; double [] dtheta=new double[10001]; String b1s="+1"; Button b1=new Button(b1s); String b2s="0"; Button b2=new Button(b2s); String b3s="-1"; Button b3=new Button(b3s); String b4s="-2"; Button b4=new Button(b4s); String b5s="-3"; Button b5=new Button(b5s); String b6s="-5"; Button b6=new Button(b6s); String b7s="Orbit"; Button b7=new Button(b7s); public void init() { setLayout(new FlowLayout(FlowLayout.LEFT)); add(b1); add(b2); add(b3); add(b4); add(b5); add(b6); add(b7); b1.addActionListener(this); b2.addActionListener(this); b3.addActionListener(this); b4.addActionListener(this); b5.addActionListener(this); b6.addActionListener(this); b7.addActionListener(this); setBackground(new Color(211, 211, 211)); } public void paint(Graphics g) { double a, b, cf, e, en, x, y, ya, yb, yc, el2; double r, theta, z1, z2; int ro, xo, yo, x1, y1, x2, y2; xo=216; yo=200; ro=180; int np=10000; cf=5; g.setFont(new Font("TimesRoman", Font.PLAIN, 14)); g.setColor(Color.black); g.drawRect(0, 0, 2*xo, 2*yo); if (kk==1) { g.drawLine(xo, yo, 2*xo, yo); // Axes for energy plot g.drawLine(xo, 0, xo, 2*yo); g.setColor(Color.green); // Plot Energy Diagram el2=el*el/2; x=1.2; y=el2/x/x; x1=2*xo; y1=(int)(yo-ro*y/cf); do { x=x-.002; y=el2/x/x; // Centrifugal potential x2=(int)(xo+ro*x); y2=(int)(yo-ro*y/cf); g.drawLine(x1, y1, x2, y2); x1=x2; y1=y2; } while (y2>0); g.setColor(Color.magenta); x=1.2; y=v(x); x1=2*xo; y1=(int)(yo-ro*y/cf); // Central-force potential do { x=x-.002; y=v(x); x2=(int)(xo+ro*x); y2=(int)(yo-ro*y/cf); g.drawLine(x1, y1, x2, y2); x1=x2; y1=y2; } while ((y2<2*yo)&&(x2>xo)); g.setColor(Color.blue); x=1.2; y=el2/x/x+v(x); x1=2*xo; y1=(int)(yo-ro*y/cf); do { x=x-.002; y=el2/x/x+v(x); // Total potential x2=(int)(xo+ro*x); y2=(int)(yo-ro*y/cf); g.drawLine(x1, y1, x2, y2); x1=x2; y1=y2; } while ((y2<2*yo)&&(y2>0)); g.setColor(Color.red); en=el2+v(1); y1=(int)(yo-ro*en/cf); g.drawLine(xo, y1, 2*xo, y1); if (n>-2.5) { e=1E-8; a=.1; b=.5; c=0; // Find Pericenter ya=el2/a/a+v(a); yb=el2/b/b+v(b); yc=0; while ((b-a)>e) { // Bisection Algorithm c=(a+b)/2; yc=el2/c/c+v(c); if (yc>en) { a=c; } else { b=c; } } } else { c=.1; // Cutoff for -3 & -5 } x1=(int)(xo+ro*c); g.drawLine(x1, yo, x1, y1); g.drawLine(xo+ro, yo, xo+ro, y1); // Show Apsides theta=0; z1=0; dr=(1-c)/np; // Find Apsidal Angle for (int i=1; i-2.5) { x1=(int)(c*ro+.5); g.drawArc(xo-x1, yo-x1, 2*x1, 2*x1, 0, 360); // Inner t.p. boundary } g.setColor(Color.blue); r=1; theta=0; x1=xo+ro; y1=yo; for (int j=1; j<=norbit; j=j+1) { for (int i=1; i<=np; i=i+1) { // In to inner t.p. r=r-dr; theta=theta+dtheta[i]; x2=(int)(xo+ro*r*Math.cos(theta)); y2=(int)(yo-ro*r*Math.sin(theta)); g.drawLine(x1, y1, x2, y2); x1=x2; y1=y2; } if (n>-2.5) { for (int i=np; i>=1; i=i-1) { // Back to outer t.p. r=r+dr; theta=theta+dtheta[i]; x2=(int)(xo+ro*r*Math.cos(theta)); y2=(int)(yo-ro*r*Math.sin(theta)); g.drawLine(x1, y1, x2, y2); x1=x2; y1=y2; } } if (n==-5) { // Lower half of circle r=1; theta=0; x1=xo+ro; y1=yo; for (int i=1; i<=np; i=i+1) { r=r-dr; theta=theta-dtheta[i]; x2=(int)(xo+ro*r*Math.cos(theta)); y2=(int)(yo-ro*r*Math.sin(theta)); g.drawLine(x1, y1, x2, y2); x1=x2; y1=y2; } } } orbit=0; } kk=0; } double v(double r) { // Potential double y=0; if (n==1) { y=r*r/2; } if (n==0) { y=r; } if (n==-1) { y=Math.log(r); } if (n==-2) { y=-1/r; } if (n==-3) { y=-1/r/r/2; } if (n==-5) { y=-1/r/r/r/r/4; } return y; } public void actionPerformed(ActionEvent e) { String tst; tst=e.getActionCommand(); if (b1s.equals(tst)) { kk=1; n=1; norbit=2; el=.488; } if (b2s.equals(tst)) { kk=1; n=0; norbit=16; el=.488; } if (b3s.equals(tst)) { kk=1; n=-1; norbit=16; el=.488; } if (b4s.equals(tst)) { kk=1; n=-2; norbit=1; el=.488; } if (b5s.equals(tst)) { kk=1; n=-3; norbit=1; el=.999; } if (b6s.equals(tst)) { kk=1; n=-5; norbit=1; el=1/Math.sqrt(2); } if (b7s.equals(tst)) { if (orbit==1) { kk=2; } } repaint(); } }