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);
				}
			}
		}
	}
}