import java.awt.*;import java.applet.*;public class Bohr extends Applet implements Runnable{	Thread moveThread;	private static final int MOVEPAUSE = 50;	public Image offScreenImage;	mycan thecanvas;	public boolean myGo = false;	public int ni=2;	public void start()  {		if(myGo) {			if(moveThread == null){				moveThread = new Thread(this);				moveThread.start();			}		}	}		public void stop()  {		if(moveThread != null){			moveThread.stop();			try {				moveThread.join();			}			catch (InterruptedException e) { }		}		moveThread=null;	}			public void run() {		while (true){			try {				moveThread.sleep(MOVEPAUSE);			}catch(InterruptedException e) {			}			thecanvas.repaint();		}	}		public void init() {		super.init();		offScreenImage = createImage(450,350);		thecanvas = new mycan(this,offScreenImage);		//{{INIT_CONTROLS		setLayout(null);		resize(500,350);		panel1 = new java.awt.Panel();		panel1.setLayout(new GridLayout(0,1,0,0));		panel1.reshape(450,0,50,350);		add(panel1);		Group1 = new CheckboxGroup();		radioButton1 = new java.awt.Checkbox("1", Group1, false);		radioButton1.reshape(0,0,50,50);		radioButton1.setBackground(Color.white);		panel1.add(radioButton1);		radioButton2 = new java.awt.Checkbox("2", Group1, true);		radioButton2.reshape(0,50,50,50);		radioButton2.setBackground(Color.white);		panel1.add(radioButton2);		radioButton3 = new java.awt.Checkbox("3", Group1, false);		radioButton3.reshape(0,100,50,50);		radioButton3.setBackground(Color.white);		panel1.add(radioButton3);		radioButton4 = new java.awt.Checkbox("4", Group1, false);		radioButton4.reshape(0,150,50,50);		radioButton4.setBackground(Color.white);		panel1.add(radioButton4);		radioButton5 = new java.awt.Checkbox("5", Group1, false);		radioButton5.reshape(0,200,50,50);		radioButton5.setBackground(Color.white);		panel1.add(radioButton5);		radioButton6 = new java.awt.Checkbox("6", Group1, false);		radioButton6.reshape(0,250,50,50);		radioButton6.setBackground(Color.white);		panel1.add(radioButton6);		radioButton7 = new java.awt.Checkbox("7", Group1, false);		radioButton7.reshape(0,300,50,50);		radioButton7.setBackground(Color.white);		panel1.add(radioButton7);		//}}				add("Center",thecanvas);	}	public boolean handleEvent(Event event) {		if (event.target == radioButton1 && event.id == Event.ACTION_EVENT){			ni = 1;			thecanvas.repaint();		}		if (event.target == radioButton2 && event.id == Event.ACTION_EVENT){			ni = 2;			thecanvas.repaint();		}		if (event.target == radioButton3 && event.id == Event.ACTION_EVENT){			ni = 3;			thecanvas.repaint();		}		if (event.target == radioButton4 && event.id == Event.ACTION_EVENT){			ni = 4;			thecanvas.repaint();		}		if (event.target == radioButton5 && event.id == Event.ACTION_EVENT){			ni = 5;			thecanvas.repaint();		}		if (event.target == radioButton6 && event.id == Event.ACTION_EVENT){			ni = 6;			thecanvas.repaint();		}		if (event.target == radioButton7 && event.id == Event.ACTION_EVENT){			ni = 7;			thecanvas.repaint();		}		return super.handleEvent(event);	}		//{{DECLARE_CONTROLS	java.awt.Panel panel1;	java.awt.Checkbox radioButton1;	CheckboxGroup Group1;	java.awt.Checkbox radioButton2;	java.awt.Checkbox radioButton3;	java.awt.Checkbox radioButton4;	java.awt.Checkbox radioButton5;	java.awt.Checkbox radioButton6;	java.awt.Checkbox radioButton7;	//}}}class mycan extends java.awt.Canvas{	Image offScreenImage;	Bohr a;	public double r0 = 7;	public int ex, ey, xf = 0, yf = 0, nf = 0;	public int xnuc = 40, ynuc = 110;		public mycan(Bohr myApplet, Image myImage) {		offScreenImage = myImage;		a = myApplet;		resize(450,350);		repaint();	}	public void update(Graphics g){		Graphics offg = offScreenImage.getGraphics();		paint(offg);		g.drawImage(offScreenImage, 0, 0, this);	}			public void paint(Graphics g){		g.setColor(Color.white);		g.fillRect(0,0,450,350);		drawNucleus(xnuc,ynuc,g);		g.setColor(Color.gray);		for (int i = 1; i<9; i++) {			drawOrbit(xnuc,ynuc,(int)(r0*i*i),g);		}		// output area for spectral lines		g.setColor(Color.darkGray);		g.fillRect(16,16,408,38);		g.setColor(Color.blue);		g.drawRect(18,18,404,34);		g.setColor(Color.black);		g.fillRect(20,20,400,30);		g.setFont(new Font("TimesRoman", Font.PLAIN, 12));		g.drawString("0",15,13);		g.drawString("1",215,13);		g.drawString("2 10   m",410,13);		g.drawString("-6",431,9);		// location of spectral lines (1 pixel = 5 nm)		g.setColor(Color.gray);		for (int i=1; i<5; i++){			for (int j=i+1; j<5*i; j++){				int lam5 = (int)(0.2/(0.01097*(1/(double)(i*i) - 1/(double)(j*j))));				if (lam5 < 400) g.drawLine(lam5+20,30,lam5+20,40);			}		}		// output area for energies		g.setColor(Color.pink);		g.fillRect(36,150,40,199);		g.setColor(Color.black);		g.drawRect(36,150,40,199);		// energies: 0 at 160, 1 eV = 12 pixels		g.setFont(new Font("TimesRoman", Font.PLAIN, 12));		g.drawString("E (eV)",16,145);		g.drawString("0",25,163);		g.drawLine(36,160,76,160);		g.drawString("-15",15,343);		g.setColor(Color.gray);		for (int i=1; i<20; i++){			int E = 160+(int)(12*13.6/(i*i));			g.drawLine(47,E,65,E);		}		g.setColor(Color.red);		int Ei = 160+(int)(12*13.6/(a.ni*a.ni));		g.drawLine(41,Ei,71,Ei);				ey = ynuc;		ex = xnuc + (int)(r0*a.ni*a.ni);		drawElectron(ex, ey, g);		if (nf > a.ni){			g.setColor(Color.yellow);			drawArrow(g, xf, yf, ex, ey);			g.setColor(Color.blue);			g.fillOval(xf-3,yf-3,7,7);			int Ef = 160+(int)(12*13.6/(nf*nf));			g.drawLine(41,Ef,71,Ef);					double lambda = 1.0/(0.01097*(1/(double)(a.ni*a.ni) - 1/(double)(nf*nf)));			g.setFont(new Font("TimesRoman", Font.PLAIN, 18));			g.drawString(" = "+outString(""+lambda,5)+" nm",330,70);			g.drawLine(328,69,322,59);  // paint letter lambda			g.drawLine(322,69,325,64);			g.drawLine(80,340,86,340);  // paint letter Delta			g.drawLine(80,340,83,330);			g.drawLine(86,340,83,330);			double deltaE = 13.6*(1/(double)(a.ni*a.ni) - 1/(double)(nf*nf));			g.drawString("E = "+outString(""+deltaE,4)+" eV",88,341);			int lam5 = (int)(lambda/5.0);			if (lam5 < 400) {				// choose color according to spectrum (white outside the visible)				g.setColor(Color.white);				if (lambda > 400) g.setColor(Color.magenta);				if (lambda > 430) g.setColor(Color.blue);				if (lambda > 480) g.setColor(Color.green);				if (lambda > 560) g.setColor(Color.yellow);				if (lambda > 610) g.setColor(Color.orange);				if (lambda > 650) g.setColor(Color.red);				if (lambda > 710) g.setColor(Color.white);				g.fillRect(lam5+19,26,3,18);				g.drawLine(56, Ef+1, 56, Ei);				g.drawLine(54, Ei-5, 56, Ei);				g.drawLine(58, Ei-5, 56, Ei);			}		}	}	public void drawOrbit(int x, int y, int r, Graphics g){		g.drawOval(x-r,y-r,2*r,2*r);	}		public void drawElectron(int x, int y, Graphics g){		g.setColor(Color.red);		g.fillOval(x-3,y-3,7,7);	}			public void drawNucleus(int x, int y, Graphics g){		g.setColor(Color.green);		g.fillOval(x-3,y-3,7,7);	}		public String outString(String inString, int l){    // returns the first l chars of string		int ls = (int)Math.min(inString.length(),l);		return inString.substring(0,ls);	}		public boolean handleEvent(Event event) {		if (event.target == this && event.id == Event.MOUSE_DOWN) {			xf = 0;			yf = 0;			nf = 0;			int cx = event.x;			int cy = event.y;			int dist = (int)(Math.sqrt((cx-xnuc)*(cx-xnuc) + (cy-ynuc)*(cy-ynuc)));			for (int i = a.ni+1; i<10; i++){				if (Math.abs((int)(r0*i*i)-dist) < 4) {					xf = cx;					yf = cy;					nf = i;				}			}			//System.out.println("cx,cy "+cx+" "+cy+" xf,yf "+xf+" "+yf);			//System.out.println("a.ni "+a.ni+" dist "+dist);			repaint();			return true;		}		return super.handleEvent(event);	}		public void drawArrow(Graphics g, int tailX, int tailY, int headX, int headY) {	    double theta = Math.atan( (double)(tailY-headY)/(tailX-headX) );	    if((tailX-headX)>=0) theta+= Math.PI;	    int w1=10/2, w2=20/2, w3=30/2;	    double s = Math.sin(theta);	    double c = Math.cos(theta);	    	    int sw1 = (int)(s*w1);	    int sw2 = (int)(s*w2);	    int sw3 = (int)(s*w3);	    int cw1 = (int)(c*w1);	    int cw2 = (int)(c*w2);	    int cw3 = (int)(c*w3);	    int[] exes = {tailX-sw1, headX-cw3-sw1, headX-cw3-sw2, headX, headX-cw3+sw2, headX-cw3+sw1, tailX+sw1, tailX-sw1};	    int[] whys = {tailY+cw1, headY-sw3+cw1, headY-sw3+cw2, headY, headY-sw3-cw2, headY-sw3-cw1, tailY-cw1, tailY+cw1};	    Polygon arrow = new Polygon(exes, whys, 8);	    g.fillPolygon(arrow); 	    g.setColor(Color.gray);	    g.drawPolygon(arrow);   	}	}