/*  ka_ce62.c koch curve 	p.387-389 1998.3.19 sekiya
		2000.5.13 window(), view(), rectfxor
		2001.5.12  symbol(name, date) */

#include <stdlib.h>   /* EXIT_SUCCESS */
#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 <stdarg.h>   /* sprintf */
#include <time.h>

void koch(int n, double leng);

main(int argc,char *argv[])
{
	int n=4, vxl=20, vxr=200, vyl=50, vyu=140;	/* n:コッホ次数 */
	double leng=300.0;			/* leng:n次の長さ */
	char title[100];
	char    *pa;        /* *pa:日付用文字列(ポインタ変数)*/
	long nowtime;

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

	printf("ka_cp62.c Koch curve 	p.387-389\n");  
	printf("Ctrl+Cで終ります。\n");  

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

	for (n=0; n < 9; n++){
		printf(" n:%d\n", n);

		view(vxl, vyl, vxr, vyu);
		sprintf(title,"次数n:%d", n);
		symbol(vxl+10, vyl+20, title,4,1,1);		
		vxl += 200; vxr +=200;
		if(n==2 || n == 5) {
			vxl=20; vxr=200; vyl += 100; vyu += 100;
		}

		setpoint(10,300);
		setangle(0);
		koch(n, leng);
	}

	rectfillXOR(0,0,639,399,7);
	gend(); /* グラフィックス終了 */

	return EXIT_SUCCESS;
} /* main */

void koch(int n, double leng)
{
	if (n==0 || leng < 3) {
		move(leng, 5);
	} else {
		koch(n-1,leng/3);
		turn(60);
		koch(n-1,leng/3);
		turn(-120);
		koch(n-1,leng/3);
		turn(60);
		koch(n-1,leng/3);
	}
}