// Applet to display single slit diffraction// Gary D. Westfall// January, 1998import java.awt.*;import java.applet.Applet;public class diffrac 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=2.0*Math.PI*(a*1.0e-6)/(2000.0*(lambda*1.0e-9));		i1=left;		x1=left-center;		beta1=(double)(x1)*factor;		b1=beta1/2.0;		y1=(int)(240.0*(Math.sin(b1)/b1)*(Math.sin(b1)/b1));		offg.setColor(Color.red);		for(i=left+1;i<=right;i=i+2){			x2=i-center;			i2=i;			beta2=(double)(x2)*factor;			b2=beta2/2.0;			y2=(int)(240.0*(Math.sin(b2)/b2)*(Math.sin(b2)/b2));			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 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(""));		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;	}	}