// Applet to display double slit interference // Gary D. Westfall // January, 1998 import java.awt.*; import java.applet.Applet; public class inter2 extends Applet { Image offscreenImage; String imageName="spectrum.jpg"; public MediaTracker tracker; public Image image; public void init() { setBackground(Color.white); tracker= new MediaTracker(this); image=this.getImage(getDocumentBase(),imageName); tracker.addImage(image,0); try { tracker.waitForID(0); } catch (InterruptedException e) { } setupMyImage(); centerCanvas c = new centerCanvas(image,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 { boolean myReset; double a=10.0; double lambda=550; Image myOffImage,spectrumImage; Graphics offg; public centerCanvas(Image i1,Image offImage) { spectrumImage=i1; myOffImage=offImage; offg = offImage.getGraphics(); repaint(); } public void update(Graphics g) { paint(g); } public void paint(Graphics g) { drawMyBackground(g); } public void drawMyBackground(Graphics g) { int left=14; int right=350; int center; int i; double beta1,beta2,b1,b2; int x1,y1,x2,y2; int i1,i2; double factor; center = (right-left)/2 + left; offg.setColor(Color.white); // Clear background to white offg.fillRect(0,0,500,300); offg.setFont(new Font("TimesRoman",Font.BOLD,12)); offg.setColor(Color.black); // Draw axes offg.drawImage(spectrumImage,74,5,this); // Put on light spectrum x1=74+(int)(((lambda-400.0)/300.0)*216.0); for(i=0;i<3;i++){ offg.drawLine(x1+i-1,2,x1+i-1,27); } for(i=0;i<=2;i++){ offg.drawLine(left,270+i,right,270+i); offg.drawLine(center+i-1,270,center+i-1,30); } for(i=1;i<9;i++){ // Draw ticks x1=i*20+center; x2=center-i*20; offg.drawLine(x1,265,x1,270); offg.drawLine(x2,265,x2,270); } for(i=1;i<5;i++){ // Axis labels x1=center+i*40-5; x2=center-i*40-7; i1=4*i; i2=-4*i; offg.drawString(""+i1,x1,285); offg.drawString(""+i2,x2,285); } x1=center-3; offg.drawString("0",x1,285); offg.drawString("Distance along screen (cm)",110,297); // x axis label; factor=Math.PI*(a*1.0e-6)/(2000.0*(lambda*1.0e-9)); i1=left; x1=left-center; beta1=(double)(x1)*factor; y1=(int)(240.0*(Math.cos(beta1))*(Math.cos(beta1))); offg.setColor(Color.red); for(i=left+1;i<=right;i=i+2){ x2=i-center; i2=i; beta2=(double)(x2)*factor; y2=(int)(240.0*(Math.cos(beta2))*(Math.cos(beta2))); offg.drawLine(i1,270-y1,i2,270-y2); x1=x2; y1=y2; i1=i2; } g.drawImage(myOffImage,0,0,this); } public void redraw(boolean reset) { repaint(); } public void setvar(double aa,double lamlam) { a = aa; lambda = lamlam; repaint(); } } class WestPanel extends Panel { Scrollbar abar; Scrollbar lambdabar; Label alabel; Label lambdalabel; Button reset; centerCanvas canvas; 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("")); add(new Label("")); add(new Label("")); add(new Label("")); add(new Label("Slit separation (micrometers)",Label.CENTER)); alabel = new Label("10",Label.CENTER); add(alabel); abar = new Scrollbar(Scrollbar.HORIZONTAL,1000,100,10,2500); add(abar); add(new Label("")); add(new Label("Wavelength (nanometers)",Label.CENTER)); lambdalabel = new Label("550",Label.CENTER); add(lambdalabel); lambdabar = new Scrollbar(Scrollbar.HORIZONTAL,550,10,400,700); add(lambdabar); add(new Label("")); add(new Label("")); reset = new Button("Reset"); reset.setForeground(Color.black); reset.setBackground(Color.lightGray); add(reset); add(new Label("")); add(new Label("")); add(new Label("")); add(new Label("")); add(new Label("")); } public boolean handleEvent(Event evt) { // Read the two scrollbars and set the two labels int anew,lambdanew; int lambdaint; double a,lambda; String label; if(evt.target instanceof Scrollbar) { anew = abar.getValue(); lambdanew = lambdabar.getValue(); a = (double)(anew)/100.0; lambda = (double)(lambdanew); lambdaint = (int)(lambda); canvas.setvar(a,lambda); alabel.setText(""+a); lambdalabel.setText(""+lambdaint); return true; } else if ((evt.id == Event.ACTION_EVENT) && (evt.target instanceof Button)) { label = ((Button) evt.target).getLabel(); abar.setValue(1000); lambdabar.setValue(550); alabel.setText("10"); lambdalabel.setText("550"); a = 10.0; lambda=550.0; canvas.setvar(a,lambda); canvas.redraw(label.equals("Reset")); return true; } return false; } }