//
/* ----------------------------------------------------------------------------------------------
information.java 情報量 ver. 2.10 (JDK 1.02)
ueyama@infonet.co.jp 2003.02.15
update: 2011.08.10
---------------------------------------------------------------------------------------------- */
import java.applet.Applet;
import java.awt.*;
import java.lang.Math;
public class information extends Applet
{
int Kox=15, Koy=60, Dox=15, Doy=15; // キー・液晶 表示基準座標
int Kx[]={ 0, 0, 46, 92, 0, 46, 92, 0, 46, 92, 46, 92, 92}; // キー表示座標値
int Ky[]={152,114,114,114, 76, 76, 76, 38, 38, 38,152,152, 0}; // 0,1,2,3,4,5,6,7,8,9,.,=,P
int Dp=-1; // 小数点位置
String Key="1"; // キー入力値
boolean Eq =true; // true: '=' キーをクリック
boolean Err=false, One=true;
double Val=0.0; // 情報量 (bit)
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_p(int x, int y, int n, int c) // 図や文字を描く
{
int w=0, h=0, ox=0, oy=0;
switch(c)
{
case 0: w=14; h=17; ox= 0; oy= 0; break; // キー数字
case 1: w=38; h=31; ox= 0; oy=59; break; // キー
case 2: w=13; h=21; ox= 0; oy=17; break; // 液晶数字
case 3: w=13; h=21; ox= 0; oy=38; break; // 液晶数字(小数点付き)
case 4: w=20; h=12; ox=130; oy=59; break; // "bit"
case 5: w=37; h=21; ox=143; oy=17; break; // "Err."
}
Graphics gx=getGraphics();
gx.clipRect(x,y,w,h);
gx.drawImage(Img,x-(ox+n*w),y-oy,this);
gx.dispose();
}
public void dsp_lcd() // 液晶表示
{
int i=0,m=0,l=0, in=0, dc=0;
double real=0.0, dec=0.0;
Graphics gx=getGraphics();
gx.setColor(new Color(181,181,156));
gx.fillRect(Dox-4,Doy-4,138,40); // 液晶部のクリア
Dp=Key.indexOf("."); // キー入力文字列中の小数点の位置
String ks=(Dp>=0)? Key.substring(0,Dp)+Key.substring(Dp+1): Key; // 液晶表示用文字列("." を含まない)
if(Eq) // 情報量の表示 ('=' キークリック時)
{
i=Integer.parseInt(ks);
if(i==0) Err=true;
if(i==1 && Dp==-1) One=true;
if(Dp>=0) // 小数点を含むとき
{
String ds=ks.substring(Dp); // 入力値 小数部文字列
if(Dp>0) in=Integer.parseInt(ks.substring(0,Dp)); // 入力値 整数部
dc=Integer.parseInt(ds); // 入力値 小数部
real=in+dc/Math.pow(10, ds.length()); // 入力値 実数値
if(real>1.0) real=1/real; // 逆数入力時
}
else
{
real=Integer.parseInt(ks); // 入力値
real=1/real; // 逆数入力モード時
}
Val = -1 * Math.log(real) / Math.log(2.0); // 情報量
ks=""+(int)Val; // 情報量 整数部(文字列)
Dp=ks.length(); // 情報量 整数部桁数(情報量の表示のため)
dec=Val-(int)Val; // 情報量 小数部
for(i=0; i<8; i++) // 情報量 小数部を1桁ずつ ks に加える
{ // (表示桁数確保のため)
dec*=10.0;
ks+=(int)dec;
dec-=(int)dec;
}
if(One) ks="0";
else
{
l=ks.length();
while(ks.endsWith("0") && l>Dp) // 情報量 末尾の '0' を削除
{
ks=ks.substring(0,l-1);
l=ks.length();
}
}
if(ks.length()==Dp) Dp=-1;
if(!Err) dsp_p(108+Dox, 23+Doy, 0, 4); // "bit" の表示
}
if(Err) dsp_p(91+Dox, Doy, 0, 5); // "Err." の表示
else // 数値 (入力値 or 情報量) の表示
{
l=10-ks.length();
if(l<10)
{
for(i=0; i<10; i++)
{
m=(i>=l)? Integer.parseInt(ks.substring(i-l, i-l+1)): 10;
dsp_p(13*i+Dox, Doy, m, (i-l+1==Dp && Dp>=0)? 3:2);
}
}
else dsp_p(13*9+Dox, Doy, 10, (Dp<0)?2:3); // 最初に入力された "." の表示
}
}
public void paint(Graphics g)
{
int i,j;
g.clearRect(0,0,size().width,size().height);
g.setColor(new Color(181,181,156));
g.fillRect(Dox-5,Doy-5,140,42); // 液晶部
g.drawRoundRect(0, 0, size().width-1, size().height-1,10,10); // 外枠
g.setColor(new Color(120,120,100));
g.drawRect(Dox-5,Doy-5,140,42); // 液晶部枠
for(i=0; i<12; i++) dsp_p(Kx[i]+Kox, Ky[i]+Koy, 0, 1); // キーの表示
for(i=0; i<12; i++) dsp_p(Kx[i]+Kox+12, Ky[i]+Koy+7, i, 0); // キー文字の表示
dsp_p(Kx[i]+Kox, Ky[i]+Koy, 1, 1); // P, 1/P キー
dsp_lcd(); // 液晶 数値の表示
}
public boolean mouseDown(Event e, int mx, int my)
{
int i, n=Key.length();
for(i=0;i<13;i++) if(inside(mx,Kx[i]+Kox,Kx[i]+Kox+38) && inside(my,Ky[i]+Koy,Ky[i]+Koy+31)) break;
if(i<13) // キーがクリックされた
{
Val=0.0;
if(Eq) Key="";
Eq=Err=One=false;
if(i<10 && n<9) Key+=i; // 数値キー
if(i==10) Key+="."; // '.'
if(i==11 && n>0) Eq=true; // '='
if(i==12 && n>0 && !Eq) Key=Key.substring(0, n-1); // "BS"
dsp_lcd(); // キー入力値 or 情報量の表示
}
return true;
}
}
//戻る