karsh@trifolium.esd.sgi.com (Bruce Karsh) (06/01/90)
Here's a fun little graphics program. Run it when you feel that bugs are getting you down. When you've had enough, you can kill it by selecting the plain root from the Windows chest. ------------------------( Cut Here multibug.c )-------------------------------- #include "gl.h" #include "gl/device.h" #include "math.h" #define PI 3.1415926535 #define NBUGS 12 #define MAXBUGS 500 int phase[MAXBUGS]; Coord bugx[MAXBUGS],bugy[MAXBUGS]; Angle bugt[MAXBUGS]; int bugc[MAXBUGS]; int nbugs; main(argc,argv) int argc; char *argv[]; { short dev,data; int i; imakebackground(); winopen("background"); shademodel(FLAT); if(argc == 2) nbugs=atoi(argv[1]); else nbugs=NBUGS; if(nbugs > MAXBUGS)nbugs=MAXBUGS; for(i=0;i<nbugs;i++)bugc[i]=i+1; repaint(); while(1) { if(qtest()) { dev=qread(&data); if(dev == REDRAW) { repaint(); } } else { /* Move the bugs. */ for(i=0;i<nbugs;i++) { bugx[i] += 2*cos(PI/180*bugt[i]/10.0); bugy[i] += 2*sin(PI/180*bugt[i]/10.0); if(bugx[i]>1300)bugx[i] = -35; if(bugx[i]< -35)bugx[i] = 1300; if(bugy[i] > 1050)bugy[i] = -35; if(bugy[i] < -35)bugy[i] = 1050; bugt[i] += rand() % 200 - 100; } newbug(); sginap(2); } } } repaint() { color(14); clear(); newbug(); } newbug() { int i; /* Draw the new bugs. */ for(i=0;i<nbugs;i++) { bug(bugx[i],bugy[i],bugt[i],phase[i],bugc[i]); } } bug(x,y,t,p,c) Coord x,y; Angle t; int p; { float x0,y0; pushmatrix(); translate(x,y,0); rotate(t,'Z'); /* Draw the body. */ color(c); circf(0,0,15); color(BLACK); circ(0,0,15); color(c); /* Draw the head. */ circf(15+6+1,0,6); color(BLACK); circ(15+6+1,0,6); color(c); /* Draw the left foreleg. */ x0=15*cos(60*PI/180.); y0=15*sin(60*PI/180.); color(BLACK); move2(x0,y0); draw2(x0,y0+5); /* Draw the right foreleg. */ move2(x0,-y0); draw2(x0,-y0-5); /* Draw the left middle leg. */ x0=0; y0=15; move2(x0,y0); draw2(x0,y0+5); /* Draw the right middle leg. */ move2(x0,-y0); draw2(x0,-y0-5); /* Draw the left hindleg. */ x0=15*cos(120*PI/180.); y0=15*sin(120*PI/180.); color(BLACK); move2(x0,y0); draw2(x0,y0+5); /* Draw the right hindleg. */ move2(x0,-y0); draw2(x0,-y0-5); popmatrix(); } Bruce Karsh karsh@sgi.com