@@ 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)