From 2b71a3c73cf7aa1c25e51d85843d165190a62e55 Mon Sep 17 00:00:00 2001 From: glenda Date: Thu, 30 Jan 2025 23:47:24 +0000 Subject: [PATCH] spirals --- spiral.c | 60 ++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 19 deletions(-) diff --git a/spiral.c b/spiral.c index 53a211a283fe540fc21208abebd89d8435a12720..1da3bafd7d655cf0df970c10a3786f9f9205b81c 100644 --- a/spiral.c +++ b/spiral.c @@ -12,14 +12,14 @@ int frametime; double spr; int wings; double wingrads; -double eccen; +double turns; vlong starttime; void usage(void) { - fprint(2,"usage: %s [-f framerate] [-r rpm] [-w wings] [-e deg]\n", argv0); + fprint(2,"usage: %s [-f framerate] [-r rpm] [-w wings] [-t turns]\n", argv0); exits("usage"); } @@ -62,29 +62,50 @@ vecpt(double radians, double radius) void drawframe(double ts) { - double radians, radius; + double radians, radius, spiralrads, spiralx, spiraly; + uint numpoints, iradius; + int i, j, k; Point center; - Point wingpoints[6]; + Point *wingpoints; radians = fmod(ts / spr, spr) * RAD; radius = imageradius(screen) * 1.4; + iradius = radius + 1; center = imagecenter(screen); + + numpoints = iradius + iradius; + wingpoints = malloc(sizeof(Point) * numpoints); wingpoints[0] = center; - wingpoints[5] = addpt(center, Pt(1, 1)); + wingpoints[numpoints - 1] = center; draw(screen, screen->r, bg, nil, SPt(0, 0)); - for(int i = 0; i < wings; i++) - { - wingpoints[1] = addpt(center, vecpt(radians + eccen, radius / 3)); - wingpoints[2] = addpt(center, vecpt(radians, radius)); - radians += wingrads; - wingpoints[3] = addpt(center, vecpt(radians, radius)); - wingpoints[4] = addpt(center, vecpt(radians + eccen, radius / 3)); + for(i = 0; i < wings; i++){ + for(j = 0; j < iradius; j++){ + spiralrads = (double)j / (double)iradius * turns * RAD; + spiralx = sin(radians + spiralrads) * j; + spiraly = cos(radians + spiralrads) * j; + k = j; + wingpoints[k] = addpt(center, Pt(spiralx, spiraly)); + } + radians += wingrads; - fillbezspline(screen, wingpoints, 6, ~0, fg, Pt(0, 0)); + for(j = 0; j < iradius; j++){ + spiralrads = (double)(iradius - j) / (double)iradius * turns * RAD; + spiralx = sin(radians + spiralrads) * (iradius - j); + spiraly = cos(radians + spiralrads) * (iradius - j); + // weird syntax issue + k = j + iradius; + wingpoints[k] = addpt(center, Pt(spiralx, spiraly)); + } + + fillpoly(screen, wingpoints, numpoints, ~0, fg, Pt(0,0)); + + radians += wingrads; } + + free(wingpoints); } double @@ -110,7 +131,7 @@ main(int argc, char* argv[]) frametime = 1.0 / 30.0 * 1000; wings = 3; spr = 2; - eccen = RAD / 6; + turns = 1.0 / 6.0; ARGBEGIN{ case 'f': @@ -122,12 +143,14 @@ main(int argc, char* argv[]) case 'w': wings = atoi(EARGF(usage())); break; - case 'e': - eccen = DEG * atof(EARGF(usage())); + case 't': + turns = atof(EARGF(usage())); break; default: usage(); - } ARGEND + }ARGEND + + fprint(2,"turns: %f\n", turns); if(wings < 1) wings = 1; wingrads = PI / (double) wings; @@ -148,8 +171,7 @@ main(int argc, char* argv[]) einit(Emouse); timer = etimer(0, frametime); - for(;;) - { + for(;;){ etype = event(&e); if (etype == timer)