//
/* ----------------------------------------------------------------------------------------------
    fixed-point.java	固定小数点数						ver. 1.00 (JDK 1.02)
    														ueyama@infonet.co.jp  2005.03.10
---------------------------------------------------------------------------------------------- */

import java.applet.Applet;
import java.awt.*;


public class fixed_point extends Applet
{
	int			Bin[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	int			B0  = 8;											// 小数点の位置
	double		Dc  = 0.0;											// 10進数
	double		Itg = 0.0;											// 整数部
	double		Dcm = 0.0;											// 小数部
	String		Sb  = "";											// 整数部文字列
	Image		Img;
	Graphics	gr;
	
	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){};
		gr=getGraphics();
	}
	
	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 n, int c)
	{
		Graphics	gx=gr.create();
		int			w=0, h=0, ox=0, oy=0;
		switch(n)
		{
			case	 0:	w= 20; h=32; ox=  0; oy=  0; break;			// 0, 1
			case	 1:	w=  7; h=32; ox= 40; oy=  0; break;			// 小数点
			case	 7:	w= 16; h=24; ox=  0; oy= 32; break;			// 10進数 数字
			case	 5:	w= 26; h=23; ox= 56; oy=  0; break;			// クリアボタン
		}
		gx.clipRect(x,y,w,h);
		gx.drawImage(Img,x-(ox+c*w),y-oy,this);
		gx.dispose();
	}
	
	public void dsp_bin()
	{
		int i;
		gr.clearRect(0, 0, 608, 32);
		for(i=0; i<16; i++)
		{
			dsp_g((15-i)*38,  0, 0, Bin[i]);						// 2進数の表示
			dsp_g((15-i)*38+25, 0, 1, (i==B0)?0:1);					// 小数点の表示
		}
	}

	public void cal_dec()												// 10進数への変換 & 表示
	{
		int i,m=0,n=0;
		Dc=0.0;
		Graphics	gx=gr.create();
		gx.clearRect(123,51,350,19);
		for(i=0; i<16; i++) Dc += Bin[i] * Math.pow(2, i-B0);		// 10進数に変換
		Itg=Math.floor(Dc);											// 整数部
		Dcm=(Dc-Itg);												// 小数部
		Sb=Double.toString(Itg);									// 整数部を文字列にする
		n=Sb.length();
		Sb=Sb.substring(0, n-2);									// 文字列末尾の ".0" を削除する
		if(Dcm>0)													// 小数部を文字列に加える
		{
			Sb+=".";
			for(i=0; i<15; i++)
			{
				Dcm*=10;
				n=(int)(Math.floor(Dcm));
				Sb+=Integer.toString(n);
				Dcm-=(double)n;
			}
			while(Sb.endsWith("0"))									// 文字列末尾の "0" を削除する
			{
				n=Sb.length();
				Sb=Sb.substring(0, n-1);
			}
		}
		gr.clearRect(176, 56, 336, 24);
		for(i=0; i20) B0=15-x/38;								// 小数点をクリック
			dsp_bin();
		}
		if(inside(x, 636, 662) && inside(y, 6, 29) && Dc>0.0)		// クリアボタン
		{
			dsp_g(636, 6, 5, 1);
			for(i=0; i<16; i++) Bin[i]=0;
			dsp_bin();
		}
		cal_dec();
		return true;
	}
	public boolean mouseUp(Event e, int x, int y)
	{
		if(inside(x, 636, 662) && inside(y, 6, 29)) dsp_g(636, 6, 5, (Dc==0)?2:0);	// クリアボタン
		return true;
	}
}
//
戻る