// Applet to display single slit diffraction // Gary D. Westfall // January, 1998 import java.awt.*; import java.applet.Applet; public class twoslit 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 d=100.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; double phi1,phi2,p1,p2; int x1,y1,x2,y2; int i1,i2; double factorb,factorp; double term1,term2; 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; factorb=2.0*Math.PI*(a*1.0e-6)/(2000.0*(lambda*1.0e-9)); factorp=2.0*Math.PI*(d*1.0e-6)/(2000.0*(lambda*1.0e-9)); i1=left; x1=left-center; beta1=(double)(x1)*factorb; b1=beta1/2.0; phi1=(double)(x1)*factorp; p1=phi1/2.0; term1=Math.cos(p1)*Math.cos(p1); term2=(Math.sin(b1)/b1)*(Math.sin(b1)/b1); y1=(int)(240.0*term1*term1*term2*term2); offg.setColor(Color.red); for(i=left+1;i<=right;i=i+2){ x2=i-center; i2=i; beta2=(double)(x2)*factorb; b2=beta2/2.0; phi2=(double)(x2)*factorp; p2=phi2/2.0; term1=Math.cos(p2)*Math.cos(p2); term2=(Math.sin(b2)/b2)*(Math.sin(b2)/b2); y2=(int)(240.0*term1*term1*term2*term2); 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,double dd) { a = aa; lambda = lamlam; d = dd; repaint(); } } class WestPanel extends Panel { Scrollbar abar; Scrollbar lambdabar; Scrollbar dbar; Label alabel; Label lambdalabel; Label dlabel; 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("Slit separation (micrometers)",Label.CENTER)); dlabel = new Label("100",Label.CENTER); add(dlabel); dbar = new Scrollbar(Scrollbar.HORIZONTAL,10000,1000,100,20000); add(dbar); add(new Label("")); add(new Label("Slit width (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("")); } public boolean handleEvent(Event evt) { // Read the two scrollbars and set the two labels int anew,lambdanew,dnew; int lambdaint; double a,lambda,d; String label; if(evt.target instanceof Scrollbar) { anew = abar.getValue(); lambdanew = lambdabar.getValue(); dnew = dbar.getValue(); a = (double)(anew)/100.0; d = (double)(dnew)/100.0; lambda = (double)(lambdanew); lambdaint = (int)(lambda); canvas.setvar(a,lambda,d); alabel.setText(""+a); lambdalabel.setText(""+lambdaint); dlabel.setText(""+d); return true; } else if ((evt.id == Event.ACTION_EVENT) && (evt.target instanceof Button)) { label = ((Button) evt.target).getLabel(); abar.setValue(1000); dbar.setValue(10000); lambdabar.setValue(550); alabel.setText("10"); lambdalabel.setText("550"); dlabel.setText("100"); a = 10.0; lambda=550.0; d = 100.0; canvas.setvar(a,lambda,d); canvas.redraw(label.equals("Reset")); return true; } return false; } }