2000年6月13日更新(新規作成)
  関谷トップページへ CGトップページへ   戻る(Java6章ページへ)  

ボール状の点描(光源のパラメータa,b,cをコマンドラインで受け取る)

// GraphicsE3p.java ボール状の点描(中山茂、Java2グラフィックスプログラミング入門、技報堂出版、1999、pp.124-125)
// (光源のパラメータa,b,cをコマンドラインで受け取る。 2000.6.13 sekiya
import java.awt.*;
import java.awt.event.*;
public class GraphicsE3p extends Frame {

   static double 	a=-0.2,b=-0.2,c=1.0;	// static変数に変える
  
  public static void main(String ar[]) {
    Frame f=new GraphicsE3p(); 
    f.setTitle("Javaピクセル(カラーボール)");
    f.setSize(640,400);
    f.setBackground(Color.blue);
    f.setVisible(true);

	int count = ar.length;	// java GraphicsE3p 数値3個まで(a b c)
	if(count > 0) {
		a = Double.parseDouble(ar[0]);
		if(count > 1) {
			b = Double.parseDouble(ar[1]);
			if(count > 2) {
				c = Double.parseDouble(ar[2]);
			}
		}
	}		
  }
  GraphicsE3p(){ addWindowListener(new WinAdapter()); }
  class WinAdapter extends WindowAdapter {
    public void windowClosing(WindowEvent we) { System.exit(0); }
  }
  public void paint(Graphics g) {
    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 	d,m=13.7;
    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);
        }
      }
    }
  }
}