// Applet to do kinetic theory simulation // Gary D. Westfall // August, 1997 import java.awt.*; import java.applet.*; import java.lang.*; import java.util.*; public class kinetic extends Applet { Image offscreenImage; public void init() { setBackground(Color.white); setupMyImage(); centerCanvas c = new centerCanvas(offscreenImage); Panel westPanel; westPanel = new WestPanel(c); setLayout(new BorderLayout()); add("West",westPanel); add("Center",c); } public void setupMyImage() { if (offscreenImage != null) { offscreenImage.flush(); } offscreenImage=createImage(500,300); } } class centerCanvas extends Canvas { int left=30; int right=385; int step=50; boolean myBegin,myReset; double volume=150.0; double oldvolume=150.0; double temp=200.0; double t=5.0; Rectangle r; Image myOffImage; Graphics offg; int numCollisions; public centerCanvas(Image offImage) { myOffImage=offImage; offg = offImage.getGraphics(); myReset=true; repaint(); } public void update(Graphics g){ paint(g); } public void paint(Graphics g) { r = bounds(); if(myReset){ drawMyBackground(g); myReset=false; } else if (myBegin){ drawMySim(g); myBegin=false; } } public void setvar(double voln,double tem,double tt){ volume=voln; temp=tem; t=tt; if(volume != oldvolume){ myReset=true; repaint(); oldvolume=volume; } } public void redraw(boolean beginn,boolean reset){ myBegin = beginn; myReset = reset; repaint(); } public void drawMySim(Graphics g){ double xx[] = new double[10]; double yy[] = new double[10]; double vx[] = new double[10]; double vy[] = new double[10]; int i,j,k; int x,y; double step; int diff; int w,h; int level; double v; double theta; int xspread,yspread; int numSteps; double ratio; long timeBegin,timeEnd,timeDiff; double xval,yval; offg.setFont(new Font("TimesRoman", Font.PLAIN, 12)); w = r.width; h = r.height; level=h-(int)(volume); v=2.0*Math.sqrt(temp); xspread=w-18; yspread=h-level-14; numCollisions=0; for(i=0;i<10;i++){ xx[i]=20.0+Math.random()*(double)(xspread-20); yy[i]=(double)(level)+15.0+Math.random()*(double)(yspread-20); theta=2.0*Math.PI*Math.random(); vx[i]=v*Math.cos(theta); vy[i]=v*Math.sin(theta); } numSteps=10*(int)(t); step=0.1; timeBegin=System.currentTimeMillis(); for(i=0;i (r.width-9)){ numCollisions++; diff = x - (r.width-9); x = x - diff; xval=(double)x; vx[j] = (-Math.abs(vx[j])); } else if (x < 9){ numCollisions++; diff = 9 - x; x = x + diff; xval=(double)x; vx[j] = (+Math.abs(vx[j])); } if(y > (r.height-9)){ numCollisions++; diff = y - (r.height-9); y = y - diff; yval=(double)y; vy[j] = (+Math.abs(vy[j])); } else if (y < (level+5)){ numCollisions++; diff = (level+5) - y; y = y + diff; yval=(double)y; vy[j] = (-Math.abs(vy[j])); } xx[j]=xval; yy[j]=yval; offg.fillOval(x-5,y-5,10,10); } if(i == numSteps-1){ offg.setColor(Color.white); offg.fillRect(6,h-45,150,38); offg.setColor(Color.black); offg.drawRect(6,h-45,150,38); offg.drawString("Number of collisions = "+numCollisions,10,h-30); ratio=(double)(numCollisions)/t; offg.drawString("Collisions.second = "+ratio,10,h-15); } g.drawImage(myOffImage,0,0,this); timeEnd=System.currentTimeMillis(); timeDiff=timeEnd-timeBegin; if(timeDiff < 100){ while (timeDiff < 100) { timeEnd=System.currentTimeMillis(); timeDiff=timeEnd-timeBegin; } } timeBegin=timeEnd; } } public void drawMyVGraph(Graphics g){ } public void drawMyBackground(Graphics g){ int w,h; int i; w = r.width; h = r.height; offg.setColor(Color.white); offg.fillRect(0,0,w,h); offg.setColor(Color.black); for(i=0;i<4;i++){ offg.drawRect(i,i,w-2*i-1,h-2*i-1); } offg.setColor(Color.blue); offg.fillRect(4,h-(int)volume-50,w-8,50); offg.fillRect(w/2-20,4,40,h-(int)(volume)-10); g.drawImage(myOffImage,0,0,this); } } class WestPanel extends Panel { Scrollbar volbar; Scrollbar tempbar; Scrollbar tbar; Label vollabel; Label templabel; Label tlabel; Button beginb; Button reset; centerCanvas canvas; Label numColLabel; Label rateLabel; public WestPanel(centerCanvas c){ canvas=c; setBackground(Color.gray); setFont(new Font("TimesRoman", Font.PLAIN, 12)); setForeground(Color.white); setLayout(new GridLayout(0,1)); add(new Label("")); vollabel = new Label("V = 150 cm^3",Label.CENTER); add(vollabel); volbar = new Scrollbar(Scrollbar.HORIZONTAL,150,10,50,246); add(volbar); add(new Label("")); templabel = new Label("T = 200 K",Label.CENTER); add(templabel); tempbar = new Scrollbar(Scrollbar.HORIZONTAL,200,20,0,400); add(tempbar); add(new Label("")); tlabel = new Label("t = 5 s",Label.CENTER); add(tlabel); tbar = new Scrollbar(Scrollbar.HORIZONTAL,5,5,5,60); add(tbar); add(new Label("")); setFont(new Font("TimesRoman", Font.PLAIN, 14)); beginb = new Button("Begin"); beginb.setForeground(Color.white); beginb.setBackground(Color.green); add(beginb); add(new Label("")); reset = new Button("Reset"); reset.setForeground(Color.black); reset.setBackground(Color.lightGray); add(reset); add(new Label("")); add(new Label("")); } public boolean handleEvent(Event evt){ // Read all three scollbars and set all three labels int volnew,tempnew,tnew; double vol,temp,t; String label; if(evt.target instanceof Scrollbar){ volnew = volbar.getValue(); tempnew = tempbar.getValue(); tnew = tbar.getValue(); vol = (double)(volnew); temp = (double)(tempnew); t = (double)(tnew); canvas.setvar(vol,temp,t); vollabel.setText("V = "+vol+" cm^3"); templabel.setText("T = "+temp+" K"); tlabel.setText("t = "+t+" s"); return true; } else if ((evt.id == Event.ACTION_EVENT) && (evt.target instanceof Button)){ label=((Button) evt.target).getLabel(); canvas.redraw( label.equals("Begin"), label.equals("Reset")); return true; } return false; } }