2001年5月25日更新(2 Projections)
  関谷トップページへ CG2001 トップページへ   このアプレットの実行

kace59m.java 軸測投影(マウスでの回転指示)(applet作図)

/*  kace59m.java From kace59.java 軸測投影(マウスでの回転指示)  
  河西朝雄,C言語によるはじめてのアルゴリズム入門,技術評論社,1992.5,p.371-374
  山本芳人,Javaによる図形処理入門,工学図書,1998.3,pp.205-208 2000.5.31 sekiya */

import java.applet.Applet;  		// Javaの言語パッケージ類
import java.awt.*;  // Graphics;	// グラフィックスクラス
import java.awt.event.*;			// JDK 1.1 
import java.lang.Math;				//  数学サブクラス
import java.lang.String;			//  ストリングクラス
import java.util.Date;				//  時間の取得

public class kace59m extends Applet implements MouseListener,MouseMotionListener  
{ 								// JDK 1.1 
	int doX,doY;				// マウスの位置 (山本芳人,Javaによる図形処理入門)
	int angX = 20, angY = -45;	// X,Y軸回りの角度とその初期値
	
	Glibwv glibwv;				// グラフィックスライブラリ(河西から移植)
	static double px, py;		// 座標の回転後のX,Y座標

	Point ap[];
	int f[]; 
	double x[];
	double y[]; 
	double z[]; 

	public void init() { // ロード時の初期化メソッド (山本芳人,Javaによる図形処理入門)
		addMouseListener(this);                // JDK 1.1 
		addMouseMotionListener(this);          // JDK 1.1 
		setBackground(new Color(255,200,255)); // 背景色 
	} //end init 

	//============= JDK 1.1 イベント処理(マウス) ============= 
	public void mousePressed(MouseEvent e) {  // 押す JDK 1.1 
		doX=e.getX();        //(a) マウスのボタンを押したx位置 
		doY=e.getY();        //(a) マウスのボタンを押したy位置 
	} //end mousePressed 

	public void mouseDragged(MouseEvent e)  { // ドラッグ 
		angX=angX+e.getY()-doY;      //(b) xの回転角度 
		angY=angY+e.getX()-doX;      //(b) yの回転角度 
		doX=e.getX(); doY=e.getY();  // マウスの位置 
		repaint(); 
	} //end mouseDragged 

	public void mouseReleased(MouseEvent e) { } // JDK 1.1 
	public void mouseClicked(MouseEvent e)  { } // JDK 1.1 
	public void mouseEntered(MouseEvent e)  { } // JDK 1.1 
	public void mouseExited(MouseEvent e)   { } // JDK 1.1 
	public void mouseMoved(MouseEvent e)    { } // JDK 1.1 
  

	public void paint(Graphics g){  // C 言語でのmain()の本体部分

		int   i, k, c, vxl=300, vxr=500;
		double ax, ay, az, rd=3.1415926535898/180.0;
		double alpha, beta, gamma;
		String str1, str2, str3;
		double al[], be[], ga[];

	//    data of points and lines
	f=new int[50]; x=new double[50]; y=new double[50]; z=new double[50];

  for (i=0; i<40; i++) z[i]=0.0;  for (i=0; i<=3; i++) z[i]=100.0;
  for (i=6; i<=8; i++) z[i]=100.0;  for (i=16; i<=18; i++) z[i]=100.0;
  z[11]=z[22]=z[31]=z[32]=z[37]=100.0;  for (i=24; i<=27; i++) z[i]=100.0;
  for (i=28; i<=30; i++) z[i]=80.0;
  for (i=33; i<=36; i++) z[i]=80.0;
  z[38]=80.0;
  
  for (i=0; i<40; i++) y[i]=0.0;
  y[0]=y[1]=y[5]=y[6]=y[8]=y[9]=y[12]=y[13]=y[16]=y[18]=y[19]=y[21]=50.0;
  y[17]=y[20]=y[22]=y[23]=80.0;
  y[24]=y[35]=y[37]=y[38]=72.0;
  y[25]=y[26]=y[29]=y[30]=y[31]=y[32]=y[33]=y[34]=90.0;
  y[27]=y[28]=y[36]=61.0;

  for (i=0; i<40; i++) f[i]=1;
  f[0]=f[8]=f[12]=f[14]=f[16]=f[19]=f[22]=f[24]=f[32]=f[34]=f[37]=-1;
  f[39]=-999;
  
  for (i=0; i<40; i++) x[i]=0.0;
  x[0]=x[3]=x[4]=x[5]=x[6]=x[7]=x[13]=x[15]=x[18]=x[21]=80.0;
  x[17]=x[20]=x[22]=x[23]=40.0;
  x[24]=x[25]=x[30]=x[31]=x[34]=x[35]=x[37]=x[38]=50.0;
  x[26]=x[27]=x[28]=x[29]=x[32]=x[33]=x[36]=65.0;

		g.setColor(Color.black);
		g.drawString("<河西、軸測投影(c言語によるはじめてのアルゴリズム入門、pp.371-374>",10,20);	/* タイトル1 */
		g.drawString("<山本芳人,Javaによる図形処理入門,工学図書,1998.3,pp.205-208>",10,40);	/* タイトル1 */
		g.drawString("(マウスドラッグ) by 関谷、2000.5.31",430,20);
		Date d=new Date();			// 現在年月日・時刻の取得
		g.drawString(d.toString(),10,60);	// dを文字列に変換して表示
		

		alpha=(double)angX; beta = (double)angY; gamma = 0.0;
		
		for (i = 0; i <2; i++){		// 2回の描画(マウスによる2つの角と、固定の角

			if(i==0) g.setColor(Color.magenta);		// 文字や線の色の設定
			else  g.setColor(Color.blue);

			if(i==1) {						// 固定の角
				alpha =45.0; beta=-45.0;
			}	
				
			str1 = String.valueOf(alpha);     // alpha
			str2 = String.valueOf(beta);      // beta
			str3 = String.valueOf(gamma);     // gamma
			g.drawString("α:"+str1+"  β:"+str2+"  γ:"+str3, vxl+50,80);
			
			glibwv.Window(-75.0, -100.0, 75.0, 200.0);
			if(i==0){
				vxl=300; vxr=600;
				glibwv.View(vxl,80,vxr,680);
				vxl=30; vxr=230;
			} else
				glibwv.View(vxl,80,vxr,480);

			ax = alpha*rd; ay = beta*rd; az = gamma* rd;
			for (k=0; f[k]!=-999; k++){
				rotate(ax, ay, az, x[k], y[k], z[k]);
				if (f[k] == -1)   /* 始点なら */
					glibwv.SetPoint(px,-py);
				else
					glibwv.MoveTo(g, px,-py);
			}

			// 原点とy axiss plot
			rotate(ax, ay, az, 0.0, 0.0, 0.0);glibwv.SetPoint(px,-py);
			glibwv.MoveTo(g, px,-py);g.drawString("原点", glibwv.Cpx(), glibwv.Cpy() );  
			rotate(ax, ay, az, 0.0,80.0, 0.0);glibwv.MoveTo(g, px,-py);
			g.drawString("Y軸", glibwv.Cpx(), glibwv.Cpy());   

			// x axiss plot
			rotate(ax, ay, az, 0.0, 0.0, 0.0);glibwv.SetPoint(px,-py);
			rotate(ax, ay, az, 100.0,0.0, 0.0);glibwv.MoveTo(g, px,-py);
			g.drawString("X軸", glibwv.Cpx(), glibwv.Cpy() );  

			// z axiss plot
			rotate(ax, ay, az, 0.0, 0.0, 0.0);glibwv.SetPoint(px,-py);
			rotate(ax, ay, az, 0.0,0.0,120.0);glibwv.MoveTo(g, px,-py);
			g.drawString("Z軸", glibwv.Cpx(), glibwv.Cpy() );  
		}

	} //  end of paint (c main() )

	void rotate(double ax, double ay, double az, double x, double y, double z) 
	/* 3次元回転変換 */
	{
		double x1,y1,z1,x2,y2, cay,say,cax,sax,caz,saz;

		cay=Math.cos(ay); say= Math.sin(ay); cax=Math.cos(ax);
		sax=Math.sin(ax); caz= Math.cos(az); saz=Math.sin(az);
		x1 = x*cay+z*say; 
		y1 = y;
		z1 = -x*say +z*cay;

		x2 = x1;
		y2 = y1*cax -z1*sax;

		px = x2*caz -y2*saz;
		py = x2*saz + y2*caz;
	}	// end of rotate
}   // end of class