main() { char device[10], *p; float x, y, tdir = TRANS; int but, nplanes; int i, n; char buf[10][128]; fprintf(stderr,"Enter output device: "); gets(device); prefposition(50, 50); vinit(device); window(-800.0, 800.0, -800.0, 800.0, -800.0, 800.0); lookat(0.0, 0.0, 1500.0, 0.0, 0.0, 0.0, 0.0); makeobj(1); makepoly(); rect(-CUBE_SIZE, -CUBE_SIZE, CUBE_SIZE, CUBE_SIZE); closepoly(); closeobj(); if ((nplanes = getdepth()) == 1) makecubes(0); makecubes(1); backface(1); if (backbuffer() < 0) { vexit(); fprintf(stderr, "lcube: device doesn't support double buffering.\n"); exit(0); } while((but = slocator(&x, &y)) != 44) { pushmatrix(); rotate(100.0 * x, 'y'); rotate(100.0 * y, 'x'); color(BLACK); clear(); callobj(3); if (nplanes == 1) callobj(2); popmatrix(); swapbuffers(); switch (but = checkkey()) { case 'x': translate(tdir, 0.0, 0.0); break; case 'y': translate(0.0, tdir, 0.0); break; case 'z': translate(0.0, 0.0, tdir); break; case '-': tdir = -tdir; break; case '+': tdir = TRANS; break; case 27: /* ESC */ case 'q': vexit(); exit(0); default: ; } } vexit(); }
/* init_matplot: initialises distmat plotting. The matrix size should * be Row x Col (which is the min. size in pixels). Title is put on the top * of the window by the window manager. Xorig and Yorig specify * the lower left corner position of the window: if either of them * is negative, then the window will be positioned interactively. * Return value: the 'gid' window ID number. */ long init_matplot(unsigned int Row, unsigned int Col, char *Title, long Xorig, long Yorig) { const unsigned int MINSIZE=500; long Gid, Xsize, Ysize, Xmax, Ymax; float Xmagnif, Ymagnif; unsigned int Rs, Cs; if (!Row) Row=MINSIZE; if (!Col) Col=MINSIZE; Xmagnif=(float)Col/MINSIZE; Ymagnif=(float)Row/MINSIZE; Rs=Row; Cs=Col; if (Col<=Row) { if (Xmagnif<1.0) { Cs=MINSIZE; Rs=round_id(Row/Xmagnif); } } else { if (Ymagnif<1.0) { Rs=MINSIZE; Cs=round_id(Col/Ymagnif); } } foreground(); /* enable signal catch etc. */ Xmax=getgdesc(GD_XPMAX); Ymax=getgdesc(GD_YPMAX); keepaspect(Col, Row); /* Xmax,Ymax: the maximal screen coordinates */ Xmax=getgdesc(GD_XPMAX); Ymax=getgdesc(GD_YPMAX); if (Xorig+Cs>Xmax) Xorig=Xmax-Cs; if (Yorig+Rs>Ymax) Yorig=Ymax-Rs; if (Xorig>=0 && Yorig>=0) prefposition(Xorig, Xorig+Cs, Yorig, Yorig+Rs); iconsize(84, 67); Gid=winopen(Title); /* create window */ RGBmode(); /* check if double buffering is available */ if (Dblbuffer=getgdesc(GD_BITS_NORM_DBL_BLUE)) { doublebuffer(); gconfig(); } else fputs("init_matplot: single-buffer mode\n", stderr); /* enable resize */ winconstraints(); keepaspect(Col, Row); winconstraints(); getsize(&Xsize, &Ysize); /* scale drawing into window */ Xmagnif=(float)Xsize/Col; Ymagnif=(float)Ysize/Row; pushmatrix(); scale(Xmagnif, Ymagnif, 1.0); cpack(RGB_BLACK); clear(); /* clears window to black */ if (Dblbuffer) { swapbuffers(); cpack(RGB_BLACK); clear(); } /* queue input events */ qdevice(ESCKEY); qdevice(WINFREEZE); qdevice(WINTHAW); qdevice(REDRAWICONIC); qdevice(WINQUIT); return(Gid); }