import java.awt.*; import java.applet.*; import java.awt.image.*; //copyright 2000 M Paez, U Antioquia, R landau, OSU//author Carlos Esteban Yaguna //Departamento de Fisica //Universidad de Antioquia //Medellin, Colombia //yaguna@pegasus.udea.edu.co public class Fotoel extends Applet { private FotCanva theCanvas; private Panel p1,p2,p3,p4; private Button equi,bor,agr,quitar; private CheckboxGroup radio; private Checkbox radio1,radio2; private int xini; private TextField text1,text2,text3; private Label l1,l2,l3; private Choice lista,lista2; private AudioClip sound; private Scrollbar s1,s2,s3; private FotFrame f; public void init() { sound=getAudioClip(getDocumentBase(), "drip.au"); xini=0; theCanvas=new FotCanva(); theCanvas.resize(300,300); theCanvas.setBackground(Color.black); p1=new Panel(); p2=new Panel(); p3=new Panel(); p4=new Panel(); lista=new Choice(); lista2=new Choice(); lista.addItem("Metal"); lista.addItem("Na"); lista.addItem("Al"); lista.addItem("Co"); lista.addItem("Cu"); lista.addItem("Zn"); lista.addItem("Ag"); lista2.addItem("F(z)=z^2"); lista2.addItem("F(z)=1/z"); lista2.addItem("F(z)=sqrt(z)"); lista2.addItem("F(z)=z+1/z"); lista2.addItem("F(z)=ze^ia"); lista2.addItem("F(z)=z^3/2"); text1=new TextField(3); text2=new TextField(3); text3=new TextField(3); l1=new Label("Inicial:"); l2=new Label("Delta: "); l3=new Label("Numero:"); equi=new Button("On"); bor=new Button("Off"); agr=new Button("Plot"); quitar=new Button("Retirar"); radio=new CheckboxGroup(); radio1=new Checkbox("Proton",radio,true); radio2=new Checkbox("Electron",radio,false); s1=new Scrollbar(Scrollbar.VERTICAL,100,0,0,200); s2=new Scrollbar(Scrollbar.HORIZONTAL,10,0,0,300); s3=new Scrollbar(Scrollbar.HORIZONTAL,10,0,0,200); p1.setLayout(new GridLayout(8,1)); p2.setLayout(new GridLayout(6,1)); p3.setLayout(new BorderLayout()); p4.setLayout(new GridLayout(1,2)); p2.add(l1); p2.add(text1); p2.add(l2); p2.add(text2); p2.add(l3); p2.add(text3); p1.add(equi); p1.add(bor); p1.add(agr); //p1.add(quitar); //p1.add(radio1); //p1.add(radio2); p1.add(lista); //p1.add(lista2); p3.add("Center",p1); //p3.add("South",p2); //p3.add("West",s3); p4.add(s2); p4.add(s3); setLayout(new BorderLayout()); add("East",p3); add("Center",theCanvas); add("West",s1); add("South",p4); theCanvas.init(); theCanvas.start(); theCanvas.repaint(); } public boolean handleEvent(Event e){ if(e.target instanceof Scrollbar){ if(e.target==s1){ theCanvas.freq=1e13*s1.getValue(); showStatus("Frecuencia de " + String.valueOf(e.arg)); } if(e.target==s2){ theCanvas.volt=1e-2*s2.getValue(); showStatus("Voltaje de " + String.valueOf(e.arg)+"^-2"); } if(e.target==s3){ theCanvas.inten=s3.getValue(); showStatus("Intensidad de " + String.valueOf(e.arg)); } theCanvas.repaint(); return true; } return super.handleEvent(e); } public boolean action(Event e, Object o) { if(e.target instanceof Button){ sound.play(); if(e.target == equi){theCanvas.bb=1; theCanvas.repaint(); return true;} if(e.target==bor){ theCanvas.bb=0; theCanvas.repaint(); //theCanvas.ii=1; return true;} if(e.target==agr){ String s="Experimental Values"; if(f!=null){ f.hide(); f.dispose(); } f=new FotFrame(s); f.resize(400,200); f.setBackground(Color.white); f.setResizable(false); f.show(); } /* if(e.target==quitar){ theCanvas.Nmax=0; theCanvas.bb=0; theCanvas.repaint(); } */ return false; } /* if(e.target instanceof Checkbox){ if(radio1.getState()==true)theCanvas.col=1; if(radio2.getState()==true)theCanvas.col=-1; return true; } if(e.target instanceof TextField){ if(e.target==text1) theCanvas.dpot[0]=Double.valueOf(text1.getText()).doubleValue(); if(e.target==text2) theCanvas.dsum=Double.valueOf(text2.getText()).doubleValue(); if(e.target==text3) theCanvas.num=Integer.parseInt(text3.getText()); theCanvas.promedio(); return true; } */ if(e.target instanceof Choice){ if(e.target==lista){ if(lista.getSelectedIndex()==1)theCanvas.trab=2.28; else if(lista.getSelectedIndex()==2)theCanvas.trab=4.08; else if(lista.getSelectedIndex()==3)theCanvas.trab=3.9; else if(lista.getSelectedIndex()==4)theCanvas.trab=4.7; else if(lista.getSelectedIndex()==5)theCanvas.trab=4.31; else if(lista.getSelectedIndex()==6)theCanvas.trab=4.73; theCanvas.trab*=1.6e-19; theCanvas.repaint(); } /* if(e.target==lista2){ if(lista2.getSelectedIndex()==0){ theCanvas.func1(); theCanvas.nn=1; theCanvas.fun=1; } else if(lista2.getSelectedIndex()==1){ theCanvas.func1(); theCanvas.nn=1; theCanvas.fun=2; } else if(lista2.getSelectedIndex()==2){ theCanvas.func1(); theCanvas.nn=1; theCanvas.fun=3; } else if(lista2.getSelectedIndex()==3){ theCanvas.func1(); theCanvas.nn=1; theCanvas.fun=4; } else if(lista2.getSelectedIndex()==4){ theCanvas.func1(); theCanvas.nn=1; theCanvas.fun=5; } else if(lista2.getSelectedIndex()==5){ theCanvas.func1(); theCanvas.nn=1; theCanvas.fun=6; } }*/ theCanvas.repaint(); return true; } return false; } } class FotCanva extends Canvas implements Runnable{ public double volt,e,h; int n,xp,yp,bb,paso,var2; double freq,inten,trab; Thread hilo; Image offScreenImage; public void init() { bb=0; freq=100e13; trab=2.28*1.6e-19; inten=10.0; e=1.6e-19; volt=0.1; paso=0; h=6.62e-34; offScreenImage=createImage(size().width,size().height); } public void start() { if(hilo==null); { hilo=new Thread(this); hilo.start(); } } public void stop() { if(hilo != null){ hilo.suspend(); hilo=null; } } public void run() { while(true){ if(bb==1) repaint(); try{ Thread.sleep(300); } catch(InterruptedException e){ } } } public void update(Graphics g) { //To avoid flicker Graphics 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 electron(Graphics g) { int i,j,pa,var; if(inten<50)var2=8; else if(inten<100)var2=6; else if(inten<150)var2=4; else var2=3; if(h*freq-trab>=e*volt){ g.setColor(Color.green); for(i=60;i<90;i+=var2) for(pa=50;pa<250;pa+=6){ var=paso+pa; if(var>250)var-=196; g.fillOval(var,i,2,2); } } } public void plot(Graphics g) { int i,volti; double ang,var1,var2; /*g.setColor(Color.lightGray); g.fillRect(50,50,200,50); g.fillArc(20,50,60,50,90,180); g.fillArc(220,50,60,50,90,-180); */ g.setColor(Color.yellow); g.drawLine(50,60,50,90); g.drawLine(250,60,250,90); g.drawLine(50,75,15,75); g.drawLine(250,75,285,75); g.drawLine(15,75,15,175); g.drawLine(285,75,285,175); g.drawLine(15,175,60,175); g.drawLine(285,175,240,175); g.drawLine(110,175,210,175); g.drawLine(240,160,240,190); g.drawLine(210,155,210,195); g.setColor(Color.cyan); g.drawOval(60,150,50,50); for(i=0;i<12;i++){ ang=30.0*i*3.1416/180.0; var1=Math.cos(ang); var2=Math.sin(ang); g.drawLine((int)(85+22.0*var1),(int)(175+22.0*var2),(int)(85+25.0*var1),(int)(175+25.0*var2)); } volti=(int)(volt*100); volt=volti/100.0; g.setColor(Color.lightGray); g.setFont(new Font("TimesRoman",Font.PLAIN,12)); g.drawString("Amperimeter",55,215); g.drawString(Double.toString(volt),215,175); g.drawString("+",200,155); g.drawString("-",245,160); g.setColor(Color.red); g.drawLine(50,50,250,50); g.drawLine(50,100,250,100); g.drawLine(51,51,250,51); g.drawLine(51,101,250,101); g.drawArc(20,50,60,50,90,180); g.drawArc(220,50,60,50,90,-180); g.drawArc(21,50,60,50,90,180); g.drawArc(221,50,60,50,90,-180); luz(g); } public void luz(Graphics g) { int i,j; double dist,var; g.setColor(Color.lightGray); g.drawString(Double.toString(freq*1e-13)+"e13 Hz",115,30); g.setColor(Color.pink); //g.fillOval(100,20,10,10); g.fillArc(100,10,20,20,200,50); g.setColor(Color.white); if(bb==1) for(i=0;i<10;i++){ g.drawLine(105,25,50,60+i*3); dist=Math.sqrt(Math.pow(110-50,2.0)+Math.pow(30-60+i*3,2.0)); } } public void corriente(Graphics g) { double pos,fac,var1,var2; h=6.62e-34; var1=2e11; var2=0.8; pos=0.0; if(bb==0)pos=0.0; else if(bb==1){ if(h*freq-trab<=e*volt)pos=0.0; else{ fac=var1*Math.sqrt(h*freq-trab-e*volt); pos=fac+var2*inten; } } pos*=3.14/180; g.setColor(Color.magenta); //g.drawString("pos = "+Double.toString(pos),200,200); g.drawLine(85,175,(int)(85+20*Math.cos(pos)),(int)(175-20*Math.sin(pos))); } public void paint(Graphics g) { int var,i; plot(g); corriente(g); g.setColor(Color.blue); for(i=0;i<5;i++) g.drawRect(0+i,0+i,306-2*i,234-2*i); if(bb==1){ electron(g); var=(int)(3e11*Math.sqrt(h*freq-trab-e*volt)); if(var<75)paso+=1; else if(var<150)paso+=3; else if(var<225)paso+=5; else paso+=7; if(paso>=200)paso=0; } } } class FotFrame extends Frame{ private Button b1; private Label l1,l2,l3; private TextField t1,t2,t3,t4,t5,t6,t7,t8; private Panel p1,p2,p3; private FotCanvas2 theCanvas2; String name; int num; public FotFrame(String s) { super(s); theCanvas2=new FotCanvas2(); theCanvas2.resize(200,200); theCanvas2.setBackground(Color.orange); b1=new Button("Plot"); l1=new Label("Freq.(e13Hz)"); l2=new Label(" Volt.(V)"); t1=new TextField(3); t2=new TextField(3); t3=new TextField(3); t4=new TextField(3); t5=new TextField(3); t6=new TextField(3); t7=new TextField(3); t8=new TextField(3); p1=new Panel(); p2=new Panel(); p1.setLayout(new GridLayout(5,2)); p2.setLayout(new BorderLayout()); p1.add(l1); p1.add(l2); p1.add(t1); p1.add(t2); p1.add(t3); p1.add(t4); p1.add(t5); p1.add(t6); p1.add(t7); p1.add(t8); p2.add("Center",p1); p2.add("South",b1); add("West",p2); add("Center",theCanvas2); theCanvas2.init(); } public boolean handleEvent(Event e) { if(e.id==Event.WINDOW_DESTROY){ hide(); dispose(); return true; } return super.handleEvent(e); } public boolean action(Event e, Object o) { if(e.target==b1){ theCanvas2.bb=1; theCanvas2.freq[0]=Double.valueOf(t1.getText()).doubleValue(); theCanvas2.volt[0]=Double.valueOf(t2.getText()).doubleValue(); theCanvas2.freq[1]=Double.valueOf(t3.getText()).doubleValue(); theCanvas2.volt[1]=Double.valueOf(t4.getText()).doubleValue(); theCanvas2.freq[2]=Double.valueOf(t5.getText()).doubleValue(); theCanvas2.volt[2]=Double.valueOf(t6.getText()).doubleValue(); theCanvas2.freq[3]=Double.valueOf(t7.getText()).doubleValue(); theCanvas2.volt[3]=Double.valueOf(t8.getText()).doubleValue(); theCanvas2.repaint(); } return true; } } class FotCanvas2 extends Canvas{ double freq[],volt[]; int num,xp,yp,bb; public void init() { bb=0; freq=new double[4]; volt=new double[4]; } void coordenadas(double x,double y) { int width,height,xpcero,ypcero; double ymmax,xmmax; width=200;//ancho del Canvas height=150;//altura xmmax=220;//coordenada de mundo maxima para x xpcero=30;//coordenada de pantalla para el punto medio ymmax=1.5; ypcero=100; xp=(int)(xpcero+(width-xpcero)/xmmax*x); yp=(int)(ypcero+((-height+ypcero)/ymmax*y)); } public void paint(Graphics g){ int x1,y1,i,xma,xmi,peni; double yma,ymi,pen; g.setFont(new Font("TimesRoman", Font.PLAIN,10)); g.setColor(Color.blue); coordenadas(-10,0); x1=xp; y1=yp; coordenadas(190,0); g.drawLine(x1,y1,xp,yp); g.drawString("x10^13Hz",xp+6,yp+12); coordenadas(0,-0.2); x1=xp; y1=yp; coordenadas(0,2.7); g.drawLine(x1,y1,xp,yp); g.drawString("V",xp-12,yp); coordenadas(30,0); g.drawLine(xp,yp-3,xp,yp+3); g.drawString("30",xp-4,yp+12); coordenadas(60,0); g.drawLine(xp,yp-3,xp,yp+3); g.drawString("60",xp-4,yp+12); coordenadas(90,0); g.drawLine(xp,yp-3,xp,yp+3); g.drawString("90",xp-4,yp+12); coordenadas(120,0); g.drawLine(xp,yp-3,xp,yp+3); g.drawString("120",xp-6,yp+12); coordenadas(150,0); g.drawLine(xp,yp-3,xp,yp+3); g.drawString("150",xp-6,yp+12); coordenadas(180,0); g.drawLine(xp,yp-3,xp,yp+3); g.drawString("180",xp-6,yp+12); coordenadas(0,1); g.drawLine(xp-3,yp,xp+3,yp); g.drawString("1",xp-20,yp+5); coordenadas(0,2); g.drawLine(xp-3,yp,xp+3,yp); g.drawString("2",xp-20,yp+5); xma=0; xmi=0; yma=0; ymi=5; if(bb==1){ g.setColor(Color.gray); for(i=0;i<4;i++){ coordenadas(freq[i],volt[i]); if(volt[i]>yma){yma=volt[i];xma=i;} if(volt[i]