・データを3ケース/画面とした。1組はプログラムの定数で与え、2組はキー入力にした。
・3組のパラメータを1つのスクリーンに表示する。
・Y軸とX軸を表示する。
・新しい線分について、その追番号を表示する
/* kace59.c 軸測投影 - 河西,C言語によるはじめてのアルゴリズム入門p.371-374 1998.3.21,2000.4.22 sekiya */ #include <stdlib.h> /* EXIT_SUCCESS */ #include <stdarg.h> /* sprintf */ #include <math.h> #include <time.h> #include "gint.f" /* グラフィックス初期化関数 gint,gend */ #include "basescrn.f" /* 基本画面設定関数 base_screen */ #include "gcls.f" /* 直線関数 */ #include "symbol.f" /* 文字関数 */ #include "Glibwv.h" /* Glibwv(タートル)関数(河西Glib.hをslsを使って移植) */ #include "rectfxor.f" /* 長方形塗りつぶし関数 */ void rotate(double ax, double ay, double az, double x,double y, double z, double *px, double *py);/* 3次元回転変換関数(プロトタイプ) */ main(int argc,char *argv[]) { static struct { int f; // f==-1:線分の開始、f==-999:データの終わり double x,y,z; } a[] ={ -1,80,50,100, 1,0,50,100, 1,0,0,100, 1,80,0,100, 1,80,0,0, 1,80,50,0, 1,80,50,100, 1,80,0,100, -1,0,50,100, 1,0,50,0, 1,0,0,0, 1,0,0,100, -1,0,50,0, 1,80,50,0, -1,0,0,0, 1,80,0,0, -1,0,50,100, 1,40,80,100, 1,80,50,100, -1,0,50,0, 1,40,80,0, 1,80,50,0, -1,40,80,100, 1,40,80,0, -1,50,72,100, 1,50,90,100, 1,65,90,100, 1,65,61,100, 1,65,61,80, 1,65,90,80, 1,50,90,80, 1,50,90,100, -1,65,90,100, 1,65,90,80, -1,50,90,80, 1,50,72,80, 1,65,61,80, -1,50,72,100, 1,50,72,80, -999,0,0,0 }; int i, k, c, vxl=0, vxr=200, ni; double ax, ay, az, px, py, rd=3.1415926535898/180.0; double alpha=20.0, beta=-45.0, gamma=0.0; 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:黄色 printf("ka_ce59.h 軸測投影 -p.371-374\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_ce59-河西,C言語によるはじめてのアルゴリズム入門p.371-374",5,1,1); symbol(20,25,"例題59 by 関谷順太",5,1,1); symbol(350,25, pa, 7,1.,1.0); window(-100,-100,100,100); 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,300,vxr,120); vxl += 180; vxr +=180; ax = alpha*rd; ay = beta*rd; az = gamma* rd; ni=1; for (k=0; a[k].f!=-999; k++){ rotate(ax, ay, az, a[k].x, a[k].y, a[k].z, &px, &py); // printf("k:%2d px:%lf py:%lf\n", k, px, py); if (a[k].f == -1) /* 始点なら,現在値をセットするのみ */ setpoint(px,py); else { moveto(px,py,c); // 直線を引く(現在点から(px,py)まで) if(a[k-1].f == -1){ sprintf(ni_char,"%2d",ni++); // 新しい線分の番号 symbol(PX1,PY1,ni_char,3,1,1); // Glibwv.hでの変数を使用 } } } // 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,100.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, 100.0,0.0, 0.0, &px, &py);moveto(px,py, 7); symbol(PX2,PY2,"X軸",7,1,1); if(i == 2) continue; while(printf("Key-in alpha beta gamma ->\n"), scanf("%lf %lf %lf", &alpha,&beta,&gamma) !=3) 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; }