// PROGRAM koch // 再帰的方法を用いて3次コッホ曲線を生成する #include "TrueBASIC.h" #include "csgraphics.h" int main(); void initial(double *x1, double *y1, double *x2, double *y2, int *n); void draw(double x1, double y1, double x2, double y2, int n); int main() { int k = 0, n; double x1, x2, y1, y2; GWopen(0); initial(&x1, &y1, &x2, &y2, &n); // 異なる反復数のコッホ曲線を描く do { k = 0; draw(x1, y1, x2, y2, n); while(!TBkeyinput()); k = TBgetkey(); // 任意のキーが押されたら停止 ++n; // 世代数 GWclear(-1); } while(k != 's'); GWquit(); return 0; } void initial(double *x1, double *y1, double *x2, double *y2, int *n) { float xwin, ywin; (*n) = 0; // 反復数 (*x1) = 1; // 線分の左の端の座標 (*y1) = 5; // 単位は任意 (*x2) = 10; // 線分の右の端の座標 (*y2) = 5; compute_aspect_ratio(8.0f, &xwin, &ywin); GWindow(0.0f, 0.0f, xwin, ywin); GWsetpen(BLUE, -1, -1, -1); } void draw(double x1, double y1, double x2, double y2, int n) { double dx, dy, x1n, x2n, xmid, y1n, y2n, ymid; if(n > 0) { dx = (x2 - x1)/3; dy = (y2 - y1)/3; x1n = x1 + dx; y1n = y1 + dy; x2n = x1 + 2*dx; y2n = y1 + 2*dy; // 線分 (dx,dy) を 60 度回転し (x1n,y1n) に付け加える xmid = 0.5*dx - 0.866*dy + x1n; ymid = 0.5*dy + 0.866*dx + y1n; draw(x1, y1, x1n, y1n, n-1); draw(x1n, y1n, xmid, ymid, n-1); draw(xmid, ymid, x2n, y2n, n-1); draw(x2n, y2n, x2, y2, n-1); } else GWline((float)(x1), (float)(y1), (float)(x2), (float)(y2)); }