import java.awt.*;
import java.applet.*;
import java.lang.*;
public class rutherford2 extends Applet implements Runnable
{
int xLoc = 0;
int yLoc = 0;
int xNucl = 112;
int yNucl = 112;
double forceConst = 100000;
double radius;
double xSpeedInit = 9;
double xSpeed = xSpeedInit;
double ySpeed = 0;
double time=0,delta_time=.01;
int circleSize = 20;
int nuclSize = 100;
int appletSize = 300;
Thread moveCircle;
Rectangle clipRect;
public void init()
{
this.setLayout(new BorderLayout());
setBackground(Color.white);
resize(appletSize,appletSize);
clipRect = new Rectangle(0,0,0,0);
moveCircle=null;
}
public void paint(Graphics g)
{
clipRect = new Rectangle(xLoc,yLoc,circleSize,circleSize);
g.setColor(Color.black);
g.fillRect(0,0,appletSize,appletSize);
g.setColor(Color.blue);
g.fillOval(xNucl-nuclSize/2,yNucl-nuclSize/2,xNucl+nuclSize/2,yNucl+nuclSize/2);
g.setColor(Color.red);
g.fillOval(xLoc,yLoc,circleSize,circleSize);
}
public void update(Graphics g)
{
// comment out the next line to try repaint clipping
g.clipRect(clipRect.x, clipRect.y, clipRect.width + 1, clipRect.height + 1);
paint(g);
}
public void start()
{
if (moveCircle == null)
{
moveCircle = new Thread(this);
moveCircle.start();
}
}
public void run()
{
while (moveCircle != null)
{
xLoc += xSpeed;
yLoc += ySpeed;
radius = Math.sqrt((xLoc-xNucl)*(xLoc-xNucl)+(yLoc-yNucl)*(yLoc-yNucl));
if (radius < nuclSize)
{
xSpeed +=forceConst*(xLoc-xNucl)/(nuclSize*nuclSize*nuclSize)*delta_time;
ySpeed +=forceConst*(yLoc-yNucl)/(nuclSize*nuclSize*nuclSize)*delta_time;
}
else
{
xSpeed +=forceConst*(xLoc-xNucl)/(radius*radius*radius)*delta_time;
ySpeed +=forceConst*(yLoc-yNucl)/(radius*radius*radius)*delta_time;
}
if ((xLoc + circleSize) > appletSize ||(xLoc + circleSize) <0) {xLoc=circleSize;
yLoc=(int)Math.round(Math.random()*300);xSpeed=xSpeedInit;ySpeed=0;}
if ((yLoc < 0) || ((yLoc + circleSize) > appletSize)) {xLoc=circleSize;
yLoc=(int)Math.round(Math.random()*300);xSpeed=xSpeedInit;ySpeed=0;}
clipRect = clipRect.union(new Rectangle(xLoc, yLoc,
circleSize,circleSize));
showStatus("angle turned through = "+(int)( 57.3*Math.atan((double)(-ySpeed/xSpeed))));
repaint();
// comment this line out for repaint clipping
//uncomment the next two lines to use repaint clipping
//repaint(clipRect.x, clipRect.y,
//clipRect.width + 1, clipRect.height + 1);
try {Thread.sleep(50);}
catch (InterruptedException e){}
}
}
public void stop()
{
if (moveCircle != null) moveCircle.stop();
moveCircle = null;
}
}