~aleteoryx/9c

2b71a3c73cf7aa1c25e51d85843d165190a62e55 — glenda 10 months ago 2a7e00c
spirals
1 files changed, 41 insertions(+), 19 deletions(-)

M spiral.c
M spiral.c => spiral.c +41 -19
@@ 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)