/* kacp60.c 軸測投影 -柱体モデル 河西,C言語によるはじめてのアルゴリズム入門p.381-382 2000.5.2, 2001.5.12(date print) 5,19(paint upper or bottom surface) 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 "paint.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, xtotal, ytotal; double ax, ay, az, rd=3.1415926535898/180.0, alpha,beta,gamma, px, py; static double x[]={ 0, 20, 0, 60,100, 60, 0,-999}, // x座標 z[]={40, 60,100,120, 60, 20, 40,-999}, // z座標 h=100.0, // 高さ btx[30],bty[30], // 底面 tpx[30],tpy[30]; // 底面 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 = -60.0; // y軸回りの回転角 az = gamma = 0.0; // z軸回りの回転角 printf("ka_cp60.c 軸測投影-柱体 -p.381-382\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_cp60-河西,C言語によるはじめてのアルゴリズム入門p.381-382",5,1,1); symbol(20,25,"九州ポリテクカレッジ 情報技術科 関谷",3,1,1); /* 2001.5.12 */ symbol(350,25, pa, 6, 1., 1.0); symbol(20,75,"見える面(上面or底面)を塗る 2001.5.19",2,1,1); /* 2001.5.19 */ window(-150,-100,100,150); 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; xtotal=ytotal=0; for (k=0; (int)x[k]!=-999; k++){ // 底面(点のループ) rotate(ax, ay, az, x[k], 0.0, z[k], &btx[k], &bty[k]); xtotal += btx[k]; ytotal += bty[k]; // 座標値合計 if (k == 0) /* 始点なら,現在値をセットするのみ */ setpoint(btx[k], bty[k]); else moveto(btx[k], bty[k],c);//直線を引く現在点から(btx[k], bty[k])まで } if (alpha <= 0){ // 底面を塗りつぶす xtotal -= btx[k-1]; ytotal -= bty[k-1]; printf("btm k:%d, xtotal:%d , ytotal:%d\n", k, xtotal, ytotal); px = xtotal/(k-1); py = ytotal/(k-1); setpoint(px, py); moveto(px+2, py+2, 6); // 重心点の座標変換 printf("btm PX1:%d, PY1:%d\n", PX1, PY1); paint( /* 塗装関数 PAINTing function */ PX1, /* int x,x位置(0〜639〜)[dot] */ PY1, /* int y, y位置(0〜339〜)[dot] */ i+1, /* int c, 塗装色番号 (0〜7〜15) Color */ c); /* int b境界色番号 (0〜7〜15) Bound */ } n = k; xtotal=ytotal=0; for (k=0; (int)x[k]!=-999; k++){ // 上面(点のループ) rotate(ax, ay, az, x[k], h, z[k], &tpx[k], &tpy[k]); xtotal += tpx[k]; ytotal += tpy[k]; // 座標 if (k == 0) /* 始点なら,現在値をセットするのみ */ setpoint(tpx[k], tpy[k]); else moveto(tpx[k], tpy[k],c);//直線を引く現在点から(tpx[k], tpy[k])まで) } if (alpha > 0){ // 上面を塗りつぶす xtotal -= tpx[k-1]; ytotal -= tpy[k-1]; px = xtotal/(k-1); py = ytotal/(k-1); setpoint(px, py); moveto(px+1, py+1, 6); printf("top PX1:%d, PY1:%d\n", PX1, PY1); paint(PX1, PY1, i+1, c); } for(k=0; k<n; k++) // 底面と上面の各点を結ぶ WvLine(btx[k],bty[k],tpx[k],tpy[k],c); // y,x,z axiss plot rotate(ax, ay, az, 0.0, 0.0, 0.0, &px, &py);setpoint(px, py); rotate(ax, ay, az, 0.0,120.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); rotate(ax, ay, az, 0.0, 0.0, 0.0, &px, &py); setpoint(px, py); rotate(ax, ay, az, 0.0, 0.0,150.0, &px, &py); moveto(px, py, 7); symbol(PX2,PY2,"Z軸",5,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; }