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