// PROGRAM koch // improved output 8/9/95 by computing aspect ratio // generate triadic Koch curve using recursion #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); // draw Koch curve for different number of iterations do { k = 0; draw(x1, y1, x2, y2, n); while(!TBkeyinput()); k = TBgetkey(); // pause until any key is hit ++n; // number of stages of generation 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; // number of iterations (*x1) = 1; // coordinates at left end of line (*y1) = 5; // arbitrary units (*x2) = 10; // coordinates at right end of line (*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; // rotate line segment (dx,dy) by 60 degs and add to (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)); }