import java.awt.*; import java.applet.*; import java.awt.image.*; public class Potbar extends Applet implements Runnable { Thread runstring; public Scrollbar leftRight; private MyCanvas canv; private MyPanel thePanel; BorderLayout MyLay; int Flag; public boolean stopped=false; public Potbar() //to initialize Flag { setFlag(0); } public void setFlag(int fl) { Flag=fl; //Flag 0 do not begin string motion, 1 yes } public void init() { setLayout(MyLay=new BorderLayout()); thePanel=new MyPanel(this,canv); leftRight=new Scrollbar(Scrollbar.HORIZONTAL,80,0,40,110); canv=new MyCanvas(this); canv.init(); thePanel.init(); add("Center",canv); add("North",leftRight); add("South", thePanel); } public void start() { if(! stopped) { if(Flag==1){ canv.jj=1; canv.flag=1; runstring=new Thread(this); runstring.start(); } } } public void stop() { if(runstring != null){ runstring.suspend(); runstring=null; } } public void brk() { //stops motion temporarily runstring.stop(); stopped=false; setFlag(0); canv.jj=1; } public void run() { while(true){ try{ Thread.currentThread().sleep(380);} catch (InterruptedException e){ } canv.repaint(); } } public void paint(Graphics g){ canv.repaint(); //called many times } public boolean handleEvent(Event ev){ //events sent by Mypanel and scrollbar interpreted here if(ev.target instanceof Scrollbar){ if(ev.target==leftRight)canv.setWidth(leftRight.getValue()); canv.repaint(); return true; } if((ev.id==ev.MOUSE_DRAG)){ canv.Xmos=ev.x; canv.Ymos=ev.y; canv.erase=true; showStatus("Cursor" + ev.x + " " + ev.y); canv.repaint(); return true; } if(ev.id==ev.MOUSE_ENTER){ //to show black square at beginning //when mouse enters the applet canv.repaint(); return true; } return false; } } //class class MyCanvas extends Canvas implements ImageObserver{ //all the painting occurs here Potbar runstring; double myp,mxp,byp,bxp; double mxx,bxx,myy,byy,yypos,xxpos,pi,dx,dt; private Image offScreenImage; Graphics offScreenGraphics; int ypos,xpos,max,cor; int Xmos,Ymos,Xdef,Ydef; //mouse positions boolean erase=false; int first,incr,jj=1; double psr[][], psi[][], v[], p2[]; int flag=0; //do not draw equation public void init() { psr=new double[501][2]; psi=new double[501][2]; p2=new double[501]; v=new double[501]; jj=1; mxp=500/263.0; bxp=-mxp*17.0; myp=-600.0/155.0; byp=600*205.0/310.0; pi=3.14159265358979323846; max=500; dx=0.02; dt=0.9*dx*dx; Xdef=180; Ydef=45; incr=10; cor=-8; } public MyCanvas(Potbar runstring) //to initialize class and variables { this.runstring=runstring; setWidth(50); //initial position of the horizontal } public void update(Graphics g) { //To avoid screen flicker use double buffer technique offScreenImage=createImage(size().width,size().height); offScreenGraphics=offScreenImage.getGraphics(); offScreenGraphics.setColor(getBackground()); offScreenGraphics.fillRect(0,0,size().width,size().height); offScreenGraphics.setColor(g.getColor()); paint(offScreenGraphics); g.drawImage(offScreenImage,0,0,this); } public void setWidth(int hx) { xpos=hx; } void coormundo(double xiz,double ysu,double xde,double yinf) { //to convert world to screen coordinates. Gives mxx bxx for //x_screen=mxx*x_world +byy same for y. double maxx,maxy,xxfin,xxcom,yyin,yysu; maxx=350; maxy=250; xxcom=0.05*maxx; xxfin=0.8*maxx; yyin=0.98*maxy; yysu=0.2*maxy; mxx=(xxfin-xxcom)/(xde-xiz); bxx=0.5*(xxcom+xxfin-mxx*(xiz+xde)); myy=(yyin-yysu)/(yinf-ysu); byy=0.5*(yysu+yyin-myy*(yinf+ysu)); } public void rectangulo(Graphics g) { //draws instruction rectangle g.drawRect(120,25,110,155); g.drawString("Drag mouse",142,60); g.drawString("in this area",142,80); g.drawString("to select potential",132,120); } public void inirec(Graphics g) { //initial rectangle g.drawOval(Xdef-5,Ydef-10,10,10); g.drawLine(144,(int)(byy-50),144,Ydef+cor); g.drawLine(144,Ydef+cor,Xdef,Ydef+cor); g.drawLine(Xdef,Ydef+cor,Xdef,(int)(byy-50)); } public void inipot(Graphics g) { //initial potential shown g.setColor(Color.black); rectangulo(g); g.setColor(Color.blue); if(erase==false){ inirec(g); } else { g.setColor(getBackground()); inirec(g); } g.setColor(Color.blue); } public void potbar(Graphics g) { //selects potential as mouse drags if((Xmos<231)&&(Xmos>119)&&(Ymos>24)&&(Ymos<191)){ g.drawLine(144,97,144,Ymos+cor); g.drawLine(144,Ymos+cor,Xmos,Ymos+cor); g.drawLine(Xmos,Ymos+cor,Xmos,97); } } public void selectmom(Graphics g) { //select wave packet momentum with scrollbar int i; g.drawString("To Select Wave Packet Momentum ",100,10); g.setColor(Color.red); g.drawRect(5,10,340,190); for(i=0;i<6;i++){ g.drawLine(20+i*55,10,20+55*i,20); g.drawString(Integer.toString(12+4*i),20+i*55,25 ); } for(i=0;i<7;i++){ g.drawLine(339,97-12*i,345,97-12*i); } for(i=0;i<4;i++){ g.drawString(Integer.toString(100*i),315,104-24*i); } for(i=1;i<7;i++){ g.drawLine(339,97+14*i,345,97+14*i); } for(i=1;i<4;i++){ g.drawString(Integer.toString(-100*i),310,104+28*i); } } public void Equation1(Graphics g) { //to draw initial potential wavefunction //at beginning and after each stop int peo,peye,pex,peyo,peyv0,peyv1; double x,fact2; double k0,vh; double expon,poten; int minx,minix,maxix; int i,n,arrow; xxpos=(double)xpos; x=0.0; minix=0;// initialize selectmom(g); g.setColor(Color.blue); if(jj==1){ // initial conditions coormundo(0.0,1.5,max+1,-1.5); inipot(g); xxpos=(double)xpos; k0=pi*xxpos/10.0; arrow=(int)(2.0*xxpos/5.0)+100; g.setColor(Color.yellow); g.drawLine(70,85,arrow,85);//arrow g.drawLine(arrow-5,80,arrow,85); //upper tip g.drawLine(arrow-5,90,arrow,85); //lower tip g.setColor(Color.blue); potbar(g); if(Ymos==0)Ymos=45; if(Xmos==0)Xmos=180; minx=(int)(Xmos*mxp+bxp); poten=(double)(myp*Ymos+byp); if(minx<240){ minix=minx; maxix=240; } else{ maxix=minx; minix=240; } vh=poten; g.drawLine(17,97,280,97); //middle line for(i=0;iminix)&&(i0){ peo=(int)(mxx*(i-1)+bxx); peyo=(int)(myy*p2[i-1]+byy); peyv0=(int)(myy*v[i-1]/250.0+byy); pex=(int)(mxx*i+bxx); peye=(int)(myy*p2[i]+byy); g.drawLine(peo,peyo,pex,peye); peyv1=(int)(myy*v[i]/250.0+byy); if(n !=1) g.drawLine(peo,peyv0,pex,peyv1); } } } } } public void Equation(Graphics g) { int peo,peye,pex,peyo,peyv0,peyv1; double x,fact2; double k0,vh; double expon,poten; int i,n,arrow; xxpos=(double)xpos; x=0.0; selectmom(g); g.setColor(Color.blue); if(jj==1){ // initial conditions coormundo(0.0,1.5,max+1,-1.5); xxpos=(double)xpos; k0=pi*xxpos/10.0; g.setColor(Color.blue); for(i=0;i0){ peo=(int)(mxx*(i-1)+bxx); peyo=(int)(myy*p2[i-1]+byy); peyv0=(int)(myy*v[i-1]/250.0+byy); pex=(int)(mxx*i+bxx); peye=(int)(myy*p2[i]+byy); g.drawLine(peo,peyo,pex,peye); peyv1=(int)(myy*v[i]/250.0+byy); if(v[i] !=v[i-1])peo=pex; if(n !=1)g.drawLine(peo,peyv0,pex,peyv1); } } } // new iterations are now the old ones for(i=1;i=incr+1)first=jj-incr; Equation(g); jj=jj+incr; } } } class MyPanel extends Panel{ //controls Stop, start and scrollbars //transmits to Eqstring the events Potbar runstring; GridBagLayout GBLay; GridBagConstraints c; MyCanvas canv; public void init(){ GBLay=new GridBagLayout(); c=new GridBagConstraints(); setLayout(GBLay); c.gridx=1; c.gridy=1; c.gridheight=1; c.fill=GridBagConstraints.BOTH; /* Button sta=new Button("Cont"); GBLay.setConstraints(sta,c); add(sta);*/ // c.gridx=2; Button stp=new Button("Stop"); GBLay.setConstraints(stp,c); add(stp); c.gridx=2; Button rest=new Button("Start"); GBLay.setConstraints(rest,c); add(rest); } public MyPanel(Potbar runstring, MyCanvas canv) { this.canv=canv; this.runstring=runstring; } public boolean action(Event ev, Object arg) { if (ev.target instanceof Button) { String label=(String)ev.arg; if (label.equals("Stop")){ runstring.brk(); } if(label.equals("Start")){ runstring.setFlag(1); runstring.stopped=false; runstring.start(); } return true; } //else if(ev.target instanceof Scrollbar){ runstring.postEvent(ev);//sent to Eqstring handlEvent return true; } if((ev.id==ev.MOUSE_DRAG)){ runstring.postEvent(ev); } return false; } }