From 16b2039dcba74f8a3b3a906600a5da0fa10ac87d Mon Sep 17 00:00:00 2001 From: glenda Date: Fri, 1 Jan 1988 08:25:12 +0000 Subject: [PATCH] wings! --- spiral.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 108 insertions(+), 11 deletions(-) diff --git a/spiral.c b/spiral.c index fe6f494e65a7795f0558dbccf25ae567dd6fd6c2..5edb443aa252dddc9ac9c80d7e1515b856377548 100644 --- a/spiral.c +++ b/spiral.c @@ -2,45 +2,142 @@ #include #include #include -#include + +#define RAD (PI * 2) + +Image *bg,*fg; + +int frametime; +double spr; +int wings; +double wingrads; + +vlong starttime; void usage(void) { - fprint(2,"usage: %s\n", argv0); + fprint(2,"usage: %s [-f framerate] [-r rpm] [-w wings]\n", argv0); exits("usage"); } Point -Spt(int x, int y) +SPt(int x, int y) { return addpt(Pt(x, y), screen->r.min); } Rectangle -Srect(int x0, int y0, int x1, int y1) +SRect(int x0, int y0, int x1, int y1) { return rectaddpt(Rect(x0, y0, x1, y1), screen->r.min); } +Point +imagecenter(Image* img) +{ + return divpt(addpt(img->r.min, img->r.max), 2); +} + +double +imageradius(Image* img) +{ + Point dims; + dims = divpt(subpt(img->r.max, img->r.min), 2); + return 1.4 + sqrt(dims.x*dims.x + dims.y*dims.y); +} + +Point +vecpt(double radians, double radius) +{ + double x,y; + x = sin(radians) * radius; + y = cos(radians) * radius; + + return Pt(x + 1, y + 1); +} + +void +drawframe(double ts) +{ + double radians, radius; + Point center; + + radians = fmod(ts / spr, spr) * RAD; + radius = imageradius(screen); + center = imagecenter(screen); + + draw(screen, screen->r, bg, nil, SPt(0, 0)); + + for(int i = 0; i < wings; i++) + { + line(screen, center, addpt(vecpt(radians, radius), center), Enddisc, Enddisc, 2, fg, Pt(0,0)); + radians += wingrads * 2; + } +} + +double +ftime(void) +{ + return ((double)(nsec() - starttime)) / 1000000000.0; +} + +void +eresized(int new) +{ + if(new && getwindow(display, Refnone) < 0) + fprint(2,"can't reattach to window\n"); + drawframe(ftime()); +} + void main(int argc, char* argv[]) { - Image* drawsrc; + int timer,etype; + Event e; + + frametime = 1.0 / 30.0 * 1000; + wings = 3; + spr = 2; ARGBEGIN{ + case 'f': + frametime = 1.0 / atof(EARGF(usage())) * 1000; + break; + case 'r': + spr = 1.0 / (atof(EARGF(usage())) / 60.0); + break; + case 'w': + wings = atoi(EARGF(usage())); + break; default: usage(); } ARGEND - if (initdraw(nil, nil, "spiral") == -1) + if(wings < 1) wings = 1; + wingrads = PI / (double) wings; + + if(initdraw(nil, nil, "spiral") < 0) sysfatal("initdraw: %r"); - drawsrc = allocimagemix(display, DPurpleblue, DPurpleblue); - if (!drawsrc) + fg = allocimage(display, Rect(0,0, 1,1), GREY1, 1, DBlack); + if(!fg) sysfatal("couldn't allocimage!"); - line(screen, Spt(10,10), Spt(50,50), Enddisc, Endsquare, 5, drawsrc, Spt(0,0)); - flushimage(display, 1); - sleep(10*1000); + bg = allocimage(display, Rect(0,0, 1,1), GREY1, 1, DWhite); + if(!bg) + sysfatal("couldn't allocimage!"); + + starttime = nsec(); + + einit(Emouse); + timer = etimer(0, frametime); + + for(;;) + { + etype = event(&e); + + if (etype == timer) + drawframe(ftime()); + } }