//
/* ----------------------------------------------------------------------------------------------
xor_gate.java EX-OR回路 ver. 2.00 (JDK 1.02)
ueyama@infonet.co.jp 1999.10.24
update: 2007.11.23
---------------------------------------------------------------------------------------------- */
import java.applet.Applet;
import java.awt.*;
import java.lang.Math;
public class xor_gate extends Applet
{
int A=0, B=0, X=0; // A, B: 入力信号 X: 出力
int Tt[][]={{0,0,0},{0,1,1},{1,0,1},{1,1,0}}; // 真理値表
Image Img;
public void init()
{
String bg=getParameter("bgcolor"); // 背景色の読み込み
int bgc=Integer.valueOf(bg,16).intValue();
setBackground(new Color(bgc));
MediaTracker mt=new MediaTracker(this);
Img=getImage(getCodeBase(), getParameter("figure")); // gif ファイルの読み込み
mt.addImage(Img, 0);
try
{
mt.waitForID(0);
}
catch(InterruptedException e){};
}
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_p(int x, int y, int m, int n, int c) // 画像の表示
{
Graphics gx=getGraphics();
int w=0, h=0, ox=0, oy=0;
switch(c)
{
case 0: w=15; h=21; ox=258; oy= 0; break; // 数字(大)
case 1: w=21; h=21; ox=273; oy= 0; break; // 電球
case 2: w=13; h=13; ox=294; oy= 0; break; // "上下"
case 3: w= 8; h=11; ox=294; oy= 26; break; // 数字(小)
case 4: w=28; h=13; ox=258; oy= 48; break; // "消灯・点灯"
case 5: w=10; h=12; ox=258; oy= 74; break; // "A・B・X"
case 6: w=63; h=15; ox=258; oy= 86; break; // "真理値表・電球回路"
case 7: w=32; h=25; ox=258; oy=116; break; // スイッチ
}
gx.clipRect(x,y,w,h);
gx.clearRect(x,y,w,h);
gx.drawImage(Img,x-(ox+m*w),y-(oy+n*h),this);
gx.dispose();
}
public void dsp_s() // 数値、スイッチ、電球の表示
{
int i,j, m=A*2+B;
Graphics gr=getGraphics();
dsp_p( 32, 5,0,A,0); dsp_p( 32, 34,0,B,0); // 入力信号 (0,1)
dsp_p(190, 20,0,X,0); // 出力信号 (0,1)
dsp_p( 47, 97,0,A,7); dsp_p(152, 97,1,B,7); // スイッチ
dsp_p(220,135,0,X,1); // 電球
dsp_p(322, 10,0,0,6); dsp_p(492, 10,0,1,6); // "真理値表"・"電球回路"
gr.setColor(new Color(153,153,153));
for(i=0;i<6;i++) // 真理値表の表示
{
gr.drawLine(286,35+i*27,421,35+i*27); // 真理値表罫線
gr.drawLine(456,35+i*27,591,35+i*27);
if(i>1)
{
for(j=0;j<4;j++)
{
gr.drawLine(286+j*45,35,286+j*45,170); // 真理値表罫線
gr.drawLine(456+j*45,35,456+j*45,170);
if(j<3) dsp_p(286+j*45+17,42,j,0,5);
if(j<3) dsp_p(456+j*45+17,42,j,0,5);
}
dsp_p(286+0*45+17,70+(i-2)*27,(i-2==m)?1:0,Tt[i-2][0],3); // A (0,1)
dsp_p(286+1*45+17,70+(i-2)*27,(i-2==m)?1:0,Tt[i-2][1],3); // B (0,1)
dsp_p(286+2*45+17,70+(i-2)*27,(i-2==m)?1:0,Tt[i-2][2],3); // X (0,1)
dsp_p(456+0*45+17,70+(i-2)*27,(i-2==m)?1:0,Tt[i-2][0],2); // A (上,下)
dsp_p(456+1*45+17,70+(i-2)*27,(i-2==m)?1:0,Tt[i-2][1],2); // B (上,下)
dsp_p(456+2*45+ 8,70+(i-2)*27,(i-2==m)?1:0,Tt[i-2][2],4); // X (消灯,点灯)
}
}
}
public void paint(Graphics g)
{
g.clearRect(0,0,size().width,size().height);
Graphics gx=getGraphics();
gx.clipRect(0,0,257,size().height);
gx.drawImage(Img,0,0,this); // 記号、回路図の表示
gx.dispose();
dsp_s(); // 数値、スイッチ、電球の表示
}
public boolean mouseDown(Event e, int x, int y)
{
int m=0;
if(inside(x, 20, 75) && inside(y, 0, 30)) m=1; // 入力 A がクリックされた
if(inside(x, 20, 75) && inside(y,30, 60)) m=2; // 入力 B
if(inside(x, 50, 90) && inside(y,90,125)) m=1; // SW A がクリックされた
if(inside(x,140,180) && inside(y,90,125)) m=2; // SW B
if((inside(x,286,421) || inside(x,456,591)) && inside(y, 62, 170)) // 真理値表 がクリックされた
{
A=Tt[(y-62)/27][0];
B=Tt[(y-62)/27][1];
m=3;
}
if(m>0)
{
if(m==1) A=(A==0)?1:0;
if(m==2) B=(B==0)?1:0;
X=Tt[A*2+B][2];
dsp_s();
}
return true;
}
}
//戻る