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