2001年5月12日 氏名/日付追加
関谷トップページへ
CG2001 トップページへ
kace60.c 軸測投影 -回転体モデル, 河西,C言語によるはじめてのアルゴリズム入門p.378-380
/* kace60.c 軸測投影 -回転体モデル
河西,C言語によるはじめてのアルゴリズム入門p.378-380 2000.4.22, 2001.5.12 sekiya */
#include <stdlib.h> /* EXIT_SUCCESS */
#include <stdarg.h> /* sprintf */
#include "gint.f" /* グラフィックス初期化関数 gint,gend */
#include "basescrn.f" /* 基本画面設定関数 base_screen */
#include "gcls.f" /* 直線関数 */
#include "symbol.f" /* 文字関数 */
#include "Glibwv.h" /* Glibwv(タートル)関数(河西Glib.hをslsを使って移植) */
#include <math.h>
#include "rectfxor.f" /* 長方形塗りつぶし関数 */
#include <time.h>
void rotate(double ax, double ay, double az, double x,double y, double z,
double *px, double *py);/* 3次元回転変換関数(プロトタイプ) */
main(int argc,char *argv[])
{
int n, k, c, i, vxl=0, vxr=180;
double x, z, ax, ay, az, px, py, rd=3.1415926535898/180.0,
alpha,beta,gamma;
static double y[]={180,140,100,60,20,10,4,0,-999}, //高さ
r[]={100,55,10,10,10,50,80,80,-999}; //半径
char title[100], ni_char[4];
char *pa; /* *pa:日付用文字列(ポインタ変数)*/
long nowtime;
time(&nowtime);
pa = ctime(&nowtime);
*(pa+24)='\0';
printf("<%s>\n", pa); /* 実行年月日などをコマンドプロンプトに表示する。 */
c=5; // 色番号 5:黄色
ax = alpha = 35.0; // x軸回りの回転角
ay = beta = 0.0; // y軸回りの回転角
az = gamma = 20.0; // z軸回りの回転角
printf("ka_ce60.c 軸測投影-回転体 -p.378-380\n");
printf("非数字で入力を止めます。Ctrl+Cで終ります。\n");
if(argc==1)
{ /* 引数なし(標準) */
gint(640,400); /* グラフィックス初期化(640x400dot) */
} else
{ /* 引数あり(拡大) */
gint(1000,625); /* グラフィックス初期化(1000x625dot) */
base_screen(1000,625); /* 基本画面設定 */
}
gcls();
symbol(20,5,"軸測投影-回転体ka_ce60-河西,C言語によるはじめてのアルゴリズム入門p.378-380",5,1,1);
symbol(20,25,"九州ポリテクカレッジ 情報技術科 関谷",3,1,1); /* 2001.5.12 */
symbol(350,25, pa, 6, 1., 1.0);
window(-150, -50, 150, 250);
for(i=0; i<3; i++){
printf("alpha:%5.0lf, beta:%5.0lf gamma:%5.0lf\n", alpha,beta,gamma);
sprintf(title,"α:%3.0lf°β:%3.0lf°γ:%3.0lf°", alpha, beta, gamma);
symbol(vxl+10,50,title,4,1,1);
view(vxl,280,vxr,100);
vxl += 180; vxr +=180;
ax = alpha*rd; ay = beta*rd; az = gamma* rd;
for (k=0; (int)y[k]!=-999; k++){ // Y軸回りの回転軌跡(点のループ)
for(n=0; n<=360; n+=10){ // 角度のループ
x=r[k]*cos(n*rd);
z=r[k]*sin(n*rd);
rotate(ax, ay, az, x, y[k], z, &px, &py);
if (n == 0) /* 始点なら,現在値をセットするのみ */
setpoint(px,py);
else
moveto(px,py,c);//直線を引く現在点から(px,py)まで)
}
}
// y,x axiss plot
rotate(ax, ay, az, 0.0, 0.0, 0.0, &px, &py);setpoint(px, py);
rotate(ax, ay, az, 0.0,200.0, 0.0, &px, &py);moveto(px, py, 6);
symbol(PX2,PY2,"Y軸",6,1,1); // Glibwv.hでの変数を使用
rotate(ax, ay, az, 0.0, 0.0, 0.0, &px, &py);setpoint(px, py);
rotate(ax, ay, az, 110.0,0.0, 0.0, &px, &py);moveto(px, py, 7);
symbol(PX2,PY2,"X軸",7,1,1);
for(n=0; n<=360; n+=20){ // 稜線の軌跡;角度のループ
for (k=0; (int)y[k]!=-999; k++){ // 点を結ぶループ
x=r[k]*cos(n*rd);
z=r[k]*sin(n*rd);
rotate(ax, ay, az, x, y[k], z, &px, &py);
if (k == 0) /* 始点なら,現在値をセットするのみ */
setpoint(px,py);
else
moveto(px,py,c);//直線を引く現在点から(px,py)まで)
}
}
if(i == 2) continue;
while(printf("Key-in alpha gamma ->\n"),
scanf("%lf %lf", &alpha,&gamma) !=2) continue;
}
rectfillXOR(0,0,639,399,7);
gend(); /* グラフィックス終了 */
return EXIT_SUCCESS;
} /* main */
void rotate(double ax, double ay, double az, double x, double y, double z,
double *px, double *py) /* 3次元回転変換 */
{
double x1,y1,z1,x2,y2, cay,say,cax,sax,caz,saz;
cay=cos(ay); say= sin(ay); cax=cos(ax);sax=sin(ax); caz=cos(az); saz=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;
}