/*  ka_ce63.c Tree curve-1 	p.395-398 1998.3.20, 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"  /*  タートル関数(河西) */
#include "rectfxor.f"   /* 長方形塗りつぶし関数 */
#include <math.h>
#include <time.h>

void tree(int n, double x0, double y0, double leng, double angle);
double scale, branch;

main(int argc,char *argv[])
{
	int		 i, n, vxl=0, vxr=180;
	double x0, y0, leng, angle;
	char title[100];
	char    *pa;        /* *pa:日付用文字列(ポインタ変数)*/
	long nowtime;

	time(&nowtime);
	pa = ctime(&nowtime);
	*(pa+24)='\0';
	printf("<%s>\n", pa);	/* 実行年月日などをコマンドプロンプトに表示する。 */

	n=8;					/* 枝の次数 */
	x0=300.0; y0=400.0;		/* 根の位置 */
	leng = 100.0;			/* 枝の長さ */
	angle = 90.0;			/* 枝の向き */
	scale = 1.4;			/* 枝の伸び率 */
	branch = 20.0;			/* 枝の分岐角 */

	printf("ka_ce63.c Tree curve-1 p.396-398\n");  
	printf("Ctrl+Cで終ります。\n");  

	if(argc==1)  { /* 引数なし(標準) */
		gint(640,400); /* グラフィックス初期化(640x400dot) */
	}  else { /* 引数あり(拡大) */
		gint(1000,625); /* グラフィックス初期化(1000x625dot) */
		base_screen(640,400); /* 基本画面設定 */
	}
	symbol(20,5,"樹木曲線ka_cp63-河西,C言語によるはじめてのアルゴリズム入門p.385-387",5,1,1);
	symbol(20,25,"九州ポリテクカレッジ 情報技術科 関谷",3,1,1);	/* 2001.5.12 */
	symbol(350,25, pa, 6, 1., 1.0);
	window(100,0,500,400);

	for(i=0;i<3;i++){
		while(printf("Key-in n branch scale ->\n"),scanf("%d %lf %lf", &n, &branch,&scale)!=3);
		sprintf(title,"n:%d 角:%2.0lf°比:%1.1lf", n, branch, scale);
		symbol(vxl+10,50,title,4,1,1);		

		view(vxl, 100,vxr,280);
		vxl += 180; vxr +=180;

		printf("n:%d 角:%5.0lf 比:%5.1lf", n, branch,scale);
		tree(n, x0, y0, leng, angle);
	}
	rectfillXOR(0,0,639,399,7);
	gend(); /* グラフィックス終了 */
	 return EXIT_SUCCESS;
} /* main */

void tree(int n, double x0, double y0, double leng, double angle)
{
	if (n==0) {
		return;
	} else {
		setpoint(x0,y0); setangle(angle);
		move(leng, 5);				// 5:color

		x0=LPX; y0=LPY;
		tree(n-1,x0,y0,leng/scale,angle-branch);// 右部分木
//		tree(n-1,x0,y0,leng/scale*0.7,angle-branch);// 右部分木(小さく)
		tree(n-1,x0,y0,leng/scale,angle+branch);// 左部分木
	}
}