2000年6月14日更新(新規作成)
関谷トップページへ
CGトップページへ
戻る(Java6章ページへ)
Applet実行のページへ)
ボール状の点描(光源のパラメータa,b,cをテキストフィールドで)
// GraphicsE3pt.java ボール状の点描(中山茂、Java2グラフィックスプログラミング入門、技報堂出版、1999、pp.124-125)
// (光源のパラメータa,b,cをコマンドラインで受け取る。 2000.6.13 sekiya
// Applet, Application 共用に変更 2000.6.14 関谷
// 「有賀妙子・竹岡尚三著、Java1.1プログラミング、ソフトバンク、1997,pp.161-164」など参照
import java.awt.*;
import java.awt.event.*;
import java.applet.*; // Applet
class WinAdapter extends WindowAdapter {
public void windowClosing(WindowEvent we) { System.exit(0); }
}
public class GraphicsE3pt extends Applet implements ActionListener { // Frame {
String Pname_a, Pname_b, Pname_c; // html fileからのパラメータ用
static double aa=-0.2, bb=-0.2, cc=1.0; // static変数に変える。入力値保存
Button butt; // ボタン
TextField tf_a, tf_b, tf_c; // テキストフィールド
Label label_a, label_b, label_c,label_t1, label_t2; // ラベル
public void init() { // for Applet only 初期化
setBackground(Color.blue);
Pname_a = getParameter("p_a"); // <param name=p_a value=0.5>
if (Pname_a != null)
aa = Double.valueOf(Pname_a).doubleValue();
Pname_b = getParameter("p_b");
if (Pname_b != null)
bb = Double.valueOf(Pname_b).doubleValue();
Pname_c = getParameter("p_c");
if (Pname_c != null)
cc = Double.valueOf(Pname_c).doubleValue();
init_common(); // for java(アプリケーションでの初期化用)
}
void init_common(){ // GUI部品の設定
butt = new Button("再描画"); // ボタン
add(butt);
butt.addActionListener(this); // イベントリスナーを指定
label_a = new Label(" aa(Enter要)"); // ラベル
add(label_a);
tf_a = new TextField(String.valueOf(aa)); // テキストフィールド
add(tf_a);
tf_a.addActionListener(this); // イベントリスナーを指定
label_b = new Label(" bb(Enter要)");
add(label_b);
tf_b = new TextField(String.valueOf(bb));
add(tf_b);
tf_b.addActionListener(this);
label_c = new Label(" cc(Enter要)");
add(label_c);
tf_c = new TextField(String.valueOf(cc));
add(tf_c);
tf_c.addActionListener(this);
} //end init_common()
public void actionPerformed(ActionEvent e) { // イベント処理
Double buffer;
if (e.getSource() == butt) {
repaint(); // paintの呼び出し
}
if (e.getSource() == tf_a) { // イベントの選択
buffer = Double.valueOf(tf_a.getText()); // 文字の取り出し
aa = buffer.doubleValue(); // 数値に変える
}
if (e.getSource() == tf_b) {
buffer = Double.valueOf(tf_b.getText());
bb = buffer.doubleValue();
}
if (e.getSource() == tf_c) {
buffer = Double.valueOf(tf_c.getText());
cc = buffer.doubleValue();
}
}
public static void main(String ar[]) { // アプリケーションの処理
int count = ar.length; // java GraphicsE3pt 数値3個まで(aa bb cc)
if(count > 0) { // to html file and init() param
aa = Double.parseDouble(ar[0]);
if(count > 1) {
bb = Double.parseDouble(ar[1]);
if(count > 2) {
cc = Double.parseDouble(ar[2]);
}
}
}
Frame f = new Frame();
f.setTitle("Javaピクセル(カラーボール)"); // to html file
GraphicsE3pt grae3pt = new GraphicsE3pt();
grae3pt.init_common(); // grae3ptkクラスの初期化
f.add(grae3pt,"Center"); // Frameにgrae3ptを入れる
f.setSize(640,400); // to html file
f.setBackground(Color.blue); // to init()
f.setVisible(true);
f.addWindowListener(new WinAdapter());
}
// GraphicsE3p(){ addWindowListener(new WinAdapter()); } // main()に移す
public void paint(Graphics g) {
g.drawString("中山茂、Java2グラフィックスプログラミング入門、技報堂出版、1999、pp.124-125)",20,40);
g.drawString("球の陰影 of Applet by 関谷 aa:"+ String.valueOf(aa) + " bb: " + String.valueOf(bb) + " cc: " + String.valueOf(cc), 20, 60);
fireball(g,100,100,50,'r');
fireball(g,200,200,100,'g');
fireball(g,400,200,150,'w');
fireball(g,550,300,50,'y');
}
public void fireball(Graphics g, int x0, int y0, int r, char color)
{
int xi,yi,dy,dx,dxy,z,bw, xmax, xmin, ymax, ymin;
double a=-0.2, b=-0.2, c=1.0, d, m=13.7;
a = aa; b = bb; c = cc; // for input and display original value
g.setColor(new Color(0,0,0));
d=Math.sqrt(Math.pow(a,2.0)+Math.pow(b,2.0)+Math.pow(c,2.0));
a*=m/d; b*=m/d; c*=m/d;
xmax=x0+r; xmin=x0-r;
ymax=y0+r; ymin=y0-r;
for(yi=ymin;yi<=ymax;yi++){
for(xi=xmin ;xi<=xmax;xi++){
dx=xi-x0;
dy=yi-y0;
dxy=(int)(Math.sqrt(Math.pow(dx,2.0)+Math.pow(dy,2.0)));
if(dxy<=r){
z=(int)Math.sqrt(r*r-Math.pow(dxy,2.0));
bw=(int)((dx*a+dy*b+z*c)/r*18);
if(bw<0) bw=0;
if(color=='r') g.setColor(new Color(bw,0,0));
else if(color=='g') g.setColor(new Color(0,bw,0));
else if(color=='y') g.setColor(new Color(bw,bw,0));
else g.setColor(new Color(bw,bw,bw));
g.drawLine(xi,yi,xi,yi);
}
}
}
}
}