//
/* ---------------------------------------------------------------------------------------------- diode.java ダイオード ver. 1.00 (JDK 1.02) ueyama@infonet.co.jp 1999.03.06 ---------------------------------------------------------------------------------------------- */ import java.applet.Applet; import java.awt.*; import java.lang.Math; import java.util.*; public class diode extends Applet implements Runnable { int Dir=0; // 0: 逆方向 1: 順方向 int Sw=0; // 0: OFF 1: ON int Wait=256; // 表示変更待ち時間 (msec) int Epx[]=new int[40], Epy[]=new int[40]; // 電子位置座標 int Hpx[]=new int[40], Hpy[]=new int[40]; // 正孔位置座標 int Qty0=20; // キャリア初期数 int Qmax=40; // キャリア最大数 int Qtye=20,Qtyh=20; // 電子、正孔数 boolean Run=true; boolean Er[]=new boolean[40], Hr[]=new boolean[40]; Image Gif; Image buf=null; Thread th=null; int R,G,B; Random Rnd=new Random(); public void init() { int i,j; boolean c; R=Integer.parseInt(getParameter("bg_red")); G=Integer.parseInt(getParameter("bg_green")); B=Integer.parseInt(getParameter("bg_blue")); setBackground(new Color(R,G,B)); MediaTracker mt=new MediaTracker(this); Gif=getImage(getCodeBase(),"diode.gif"); mt.addImage(Gif, 0); try { mt.waitForID(0); } catch(InterruptedException e){}; buf=createImage(size().width,size().height); carrier_initialize(); } public void start() { if(th==null) { th=new Thread(this); th.start(); } } public boolean inside(int x, int a, int b) { return (x<=Math.max(a,b) && x>=Math.min(a,b)) ? true:false; } public void carrier_initialize() { int i,j,k,x,y; for(i=0;i戻る94) return 2; else return 1; } public int move_y() // 10%は上に、10%は下に、80%は動かない { int x=Math.abs(Rnd.nextInt())%100; if(x<10) return 1; else if(x>89) return -1; else return 0; } public void carrier_move() { int i,j,k,q,x,y=0; for(i=0;i 178 && Hr[i]==false && i =315) Hpx[i]=48; } } public void dsp_m(int n, int f, Graphics g) // 回路記号等の表示 { int x=0,y=0, w=0,h=0, ox=0,oy=0; Graphics gx=g.create(); switch(n) { case 0: x= 78; y=189; w=93; h=47; ox=470; oy= 0; break; // 電池 case 1: x=224; y=188; w=55; h=32; ox=540; oy=124; break; // スイッチ case 2: x=400; y= 98; w=69; h=69; ox=470; oy= 94; break; // 電球 case 3: x= 13; y= 9; w=31; h=31; ox=564; oy= 0; break; // P 極性 case 4: x=329; y= 9; w=31; h=31; ox=564; oy= 0; break; // N 極性 case 5: x=385; y=213; w=26; h=23; ox=595; oy= 0; break; // 低速ボタン case 6: x=443; y=213; w=26; h=23; ox=595; oy= 69; break; // 高速ボタン case 7: x=414; y=213; w=26; h=23; ox=595; oy=138; break; // 停止ボタン case 8: x=414; y=213; w=26; h=23; ox=595; oy=184; break; // 移動ボタン case 9: x= 12; y=109; w=17; h=44; ox=540; oy=188; break; // 電流矢印(上向) case 10: x=343; y=111; w=17; h=44; ox=557; oy=188; break; // 電流矢印(上向) } gx.clipRect(x,y,w,h); gx.drawImage(Gif,x-ox,y-(oy+f*h),this); gx.dispose(); } public void paint(Graphics g) { int i; g.setColor(new Color(R,G,B)); g.fillRect(0,0,size().width,size().height); g.drawImage(Gif,0,0,this); dsp_m(0,Dir,g); // 電池や電球を描く dsp_m(1,Sw,g); dsp_m(2,(Dir*Sw==1 && Run)?1:0,g); dsp_m(3,Sw*2+(1-Dir),g); dsp_m(4,Sw*2+Dir,g); dsp_m(5,0,g); dsp_m(6,(Wait==64)?2:0,g); dsp_m((Run)?7:8,0,g); if(Sw==1 && Dir==1 && Run) dsp_m(9,0,g); if(Sw==1 && Dir==1 && Run) dsp_m(10,0,g); g.clipRect(57,3,259,98); g.setColor(new Color(51,102,255)); // 電子を描く for(i=0;i 189) Dir=(Dir==0)?1:0; // 電池をクリック if(inside(x,224,279) && y>188) // スイッチをクリック { Sw=(Sw==0)?1:0; Qtye=Qty0;Qtyh=Qty0; if(Sw==0) carrier_initialize(); else { for(i=0;i 213) // 低速ボタンをクリック { Graphics gb=getGraphics(); dsp_m(5,1,gb); Wait*=2; } if(inside(x,443,469) && y>213 && Wait>64) // 高速ボタンをクリック { Graphics gb=getGraphics(); dsp_m(6,1,gb); Wait/=2; } if(inside(x,414,440) && y>213) // 停止・再開ボタンをクリック { Graphics gb=getGraphics(); dsp_m((Run)?7:8,1,gb); Run=!Run; } return true; } public void stop() { if(th!=null) { th.stop(); th=null; } } } //