//
/* ----------------------------------------------------------------------------------------------
wave.java 波の干渉 ver. 1.00 (JDK 1.02)
ueyama@infonet.co.jp 2001.03.30
---------------------------------------------------------------------------------------------- */
import java.applet.Applet;
import java.awt.*;
public class wave extends Applet implements Runnable
{
int Pl=0;
int Mx=0; // 鏡の位置 max: 23;
int Bw=340, Bh=145; // バッファのサイズ
int Mc=0; // 鏡位置の変更量
int Ms=-1; // クリックされたボタン No.
int Wait=32; // 表示変更待機時間 (msec)
int Sin[]={0,1,2,3,4,5,6,7,7,8,9,10,11,11,12,12,13,13,14,14,14,14,14,
14,14,14,14,14,13,13,12,12,11,11,10,9,8,7,7,6,5,4,3,2,1,
0,-1,-2,-3,-4,-5,-6,-7,-7,-8,-9,-10,-11,-11,-12,-12,-13,-13,-14,-14,-14,-14,-14,
-14,-14,-14,-14,-14,-13,-13,-12,-12,-11,-11,-10,-9,-8,-7,-7,-6,-5,-4,-3,-2,-1};
Color gray=new Color(204,204,204), red=new Color(204,0,0), orange=new Color(238,136,68);
boolean Run=false;
Image Img;
Image Buf;
Thread th;
public void init()
{
String bgc=getParameter("bgcolor"); // html 背景色
int col=Integer.valueOf(bgc,16).intValue();
setBackground(new Color(col));
Buf=createImage(Bw,Bh);
MediaTracker mt=new MediaTracker(this);
Img=getImage(getCodeBase(), getParameter("figure")); // GIF ファイル
mt.addImage(Img, 0);
try
{
mt.waitForID(0);
}
catch(InterruptedException e){};
}
public void start()
{
th=new Thread(this);
th.start();
}
public void stop()
{
if(th!=null)
{
th.stop();
th=null;
}
}
public void update(Graphics g)
{
paint(g);
}
public boolean inside(int x, int a, int b)
{
return (x<=Math.max(a,b) && x>=Math.min(a,b)) ? true:false;
}
public void dsp_b(int x, int y, int m, int n, int c) // 画像の表示
{
int ox=0,oy=0,w=0,h=0;
switch(c)
{
case 0: w= 26; h= 23; ox= 0; oy= 0; break; // ボタン
case 1: w= 11; h= 37; ox=156; oy= 0; break; // "反射光", "干渉光"
}
Graphics gx=getGraphics();
gx.clipRect(x,y,w,h);
gx.drawImage(Img,x-(ox+w*m),y-(oy+h*n),this);
gx.dispose();
}
public void dsp_btn() // ボタンの表示
{
int m0=(Ms==0)?1:0, m1=(Ms==1)?1:0, m2=(Ms==5)?1:0, m4=(Ms==7)?1:0;
dsp_b( 2,177,0, (Mx== 0)?2:m0, 0); // ← ボタン
dsp_b( 32,177,1, (Mx==23)?2:m1, 0); // → ボタン
dsp_b(152,177,2, (Wait==512)?2:m2, 0); // << ボタン
dsp_b(182,177,(Run)?5:3, (Ms==6 || Ms==8)?1:0, 0); // |> ボタン
dsp_b(212,177,4, (Wait== 8)?2:m4, 0); // >> ボタン
}
public void dsp_wave() // 波 を描く
{
int i,j,x;
Graphics gr=getGraphics();
Graphics mg=Buf.getGraphics();
mg.clearRect(0,0,Bw,Bh); // バッファのクリア
mg.setColor(gray);
mg.fillRect(0,33,Mx,50); // 反射膜(鏡)を描く
mg.fillRect(0,93,Mx,50);
for(i=Pl,j=700; i*j>0; i--,j--) // 波を描く
{
if(Bw-(Pl-i)>0) mg.setColor(gray); // ランド反射光
else mg.setColor(red);
x=(Bw-(Pl-i)>0)?Bw-(Pl-i): (Pl-i)-Bw;
mg.fillRect(x,Sin[i%90]/2+7,3,3);
if(Bw-(Pl-i)>Mx) mg.setColor(gray); // ピット反射光
else mg.setColor(red);
x=(Bw-(Pl-i)>Mx)?Bw-(Pl-i): Mx-(Bw-(Pl-i)-Mx);
mg.fillRect(x,Sin[i%90]/2+57,3,3);
if(Bw-(Pl-i)<=Mx) // 干渉光
{
mg.setColor(orange);
mg.fillRect(x,(Sin[(Mx*2+i)%90]+Sin[i%90])/2+117,3,3);
}
}
gr.drawImage(Buf,30,17,this); // バッファの表示
gr.dispose();
mg.dispose();
}
public void paint(Graphics g)
{
g.setColor(gray); // 鏡の表示
g.fillRect(0, 0,30,100);
g.fillRect(0,110,30, 50);
dsp_b(10, 32,0,0,1); // "反射光" の表示
dsp_b(10,116,1,0,1); // "干渉光" の表示
dsp_btn(); // ボタンの表示
}
public void run()
{
while(true)
{
dsp_wave();
try
{
Thread.sleep((Run && Mc==0)?Wait:64);
}
catch (InterruptedException e){};
if(Run) Pl++; // 波を動かす
if(Ms==0 && Mx>0) Mx--; // 鏡面の移動
if(Ms==1 && Mx<23) Mx++;
}
}
public boolean mouseDown(Event e, int x, int y) // マウスがクリックされたときの処理
{
if(y>177 && (x<58 || inside(x,152,238)))
{
Ms=(x-2)/30; // クリックされたボタン No.
if(Ms==0 && Mx>0) Mc=-1; // ← ボタン
if(Ms==1 && Mx<23) Mc=1; // → ボタン
if(Ms==5 && Wait<512) Wait*=2; // << ボタン
if(Ms==6) Run=!Run; // |> ボタン
if(Ms==7 && Wait>8) Wait/=2; // >> ボタン
dsp_btn(); // ボタンの表示
}
return true;
}
public boolean mouseUp(Event e, int x, int y) // クリックが終わったときの処理
{
if(Ms>=0)
{
Ms=-1; Mc=0;
dsp_btn();
}
return true;
}
}
//戻る