//
/* ----------------------------------------------------------------------------------------------
nand.java NAND 回路 ver. 1.10 (JDK 1.02)
ueyama@infonet.co.jp 2005.01.28
update: 2007.08.03
---------------------------------------------------------------------------------------------- */
import java.applet.Applet;
import java.awt.*;
public class nand extends Applet
{
int A=0, B=0, X=1; // 入力 A, B、 出力 X
int T=1; // トランジスタの表示 0:SW 1:Tr
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"));
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_g(int x, int y, int m, int n, int c)
{
int w=0, h=0, ox=0, oy=0;
switch(c)
{
case 0: w= 24; h=31; ox=493; oy= 0; break; // トランジスタ
case 1: w= 9; h=14; ox=493; oy=124; break; // 2進数 (大)
case 2: w= 8; h=12; ox=511; oy=124; break; // 2進数 (小)
case 3: w= 6; h= 6; ox=527; oy=124; break; // ラジオボタン用ドット
}
Graphics gx=getGraphics();
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_p()
{
int x,y;
X=(A+B==2)?0:1;
dsp_g(116, 29, T, (A==0)?1:0, 0); // トランジスタ T1 の表示
dsp_g(199, 29, T, (B==0)?1:0, 0); // トランジスタ T2 の表示
dsp_g(199,103, T, A+2, 0); // トランジスタ T3 の表示
dsp_g(199,162, T, B+2, 0); // トランジスタ T4 の表示
dsp_g( 3,111, 1, A, 1); // 入力 A の2進数表示
dsp_g( 3,170, 1, B, 1); // 入力 B の2進数表示
dsp_g(337, 74, 1, X, 1); // 出力 X の2進数表示
for(y=0; y<4; y++)
{
dsp_g(426, 85+y*25, (y==A*2+B)?1:0, y/2, 2); // 真理値表 A の表示
dsp_g(449, 85+y*25, (y==A*2+B)?1:0, y%2, 2); // 真理値表 B の表示
dsp_g(472, 85+y*25, (y==A*2+B)?1:0, (y==3)?0:1, 2); // 真理値表 X の表示
}
dsp_g(416,196, 0, T, 3); // ラジオボタン Tr の表示
dsp_g(455,196, 0, (T==1)?0:1, 3); // ラジオボタン SW の表示
}
public void paint(Graphics g)
{
int i;
g.clearRect(0, 0, size().width, size().height);
g.drawImage(Img, 0, 0, this);
dsp_p();
}
public boolean mouseDown(Event e, int x, int y)
{
if(x<40) // 入力信号をクリック
{
if(inside(y, 100, 130)) A=(A==0)?1:0;
if(inside(y, 160, 190)) B=(B==0)?1:0;
}
if(inside(x, 418, 488) && inside(y, 78, 178)) // 真理値表をクリック
{
A=(y-78)/50; B=((y-78)/25)%2;
X=((y-78)/25==3)?0:1;
}
if(x>410 && inside(y, 188, 207)) // SW, Tr 表示の切り替え
{
if(x>447) T=0;
else T=1;
}
dsp_p();
return true;
}
}
//戻る