/*  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;
}