home *** CD-ROM | disk | FTP | other *** search
- #include "ifs.h"
- #include "standard.h"
-
- #define JAM1 0
- #define JAM2 1
- #define COMPLEMENT 2
- #define INVERDVID 4
-
- void drawonebox();
- void checkswitches();
- void autoadj();
- int closeby();
- void adjust();
- void checkswitches();
-
- void drawvectors(rp, funs, numoffun, currentfun)
- struct RastPort *rp;
- float funs[][6];
- int numoffun, currentfun;
- {
- int i, color;
-
- for (i=0; i<=numoffun; i++) {
- if ((color = (i+2)%MAXCOLORS) < 2)
- color = color+2; /* paint with correct color */
- SetAPen(rp, color);
- drawonebox(rp,funs[i]);
- }
- SetAPen(rp,1);
- drawonebox(rp,funs[currentfun]);
- }
-
- void drawonebox(rp, afun)
- struct RastPort *rp;
- float afun[6];
- {
- short x[10], j;
-
- Move(rp, (int) (WIDTH/2 + DISPSCALE * afun[4] * WIDTH),
- (int) (HEIGHT/2 - DISPSCALE * afun[5] * HEIGHT));
- j=0;
- x[j++] = WIDTH/2 + DISPSCALE * (afun[0] + afun[4]) * WIDTH;
- x[j++] = HEIGHT/2 - DISPSCALE * (afun[2] + afun[5]) * HEIGHT;
- x[j++] = WIDTH/2 + DISPSCALE * (afun[0] + afun[1] + afun[4]) * WIDTH;
- x[j++] = HEIGHT/2 - DISPSCALE * (afun[2] + afun[3] + afun[5]) * HEIGHT;
- x[j++] = WIDTH/2 + DISPSCALE * (afun[1] + afun[4]) * WIDTH;
- x[j++] = HEIGHT/2 - DISPSCALE * (afun[3] + afun[5]) * HEIGHT;
- x[j++] = WIDTH/2 + DISPSCALE * afun[4] * WIDTH;
- x[j++] = HEIGHT/2 - DISPSCALE * afun[5] * HEIGHT;
- PolyDraw(rp, 4, &x[0]);
- Move(rp, (int) (WIDTH/2 + DISPSCALE * (afun[0]/4 + afun[4]) * WIDTH),
- (int) (HEIGHT/2 - DISPSCALE * (afun[2]/4 + afun[5]) * HEIGHT));
- j=0; /* draw little box in right hand corner */
- x[j++] = WIDTH/2 + DISPSCALE * (afun[0]/4 + afun[1]/4 + afun[4]) * WIDTH;
- x[j++] = HEIGHT/2 - DISPSCALE * (afun[2]/4 + afun[3]/4 + afun[5]) * HEIGHT;
- x[j++] = WIDTH/2 + DISPSCALE * (afun[1]/4 + afun[4]) * WIDTH;
- x[j++] = HEIGHT/2 - DISPSCALE * (afun[3]/4 + afun[5]) * HEIGHT;
- PolyDraw(rp, 2, &x[0]);
- /* and slash in adjacent corner */
- Move(rp, (int) (WIDTH/2 + DISPSCALE * (afun[0]*.75 + afun[4]) * WIDTH),
- (int) (HEIGHT/2 - DISPSCALE * (afun[2]*.75 + afun[5]) * HEIGHT));
- Draw(rp, (int) (WIDTH/2 + DISPSCALE * (afun[0]
- + afun[1]/4 + afun[4]) * WIDTH),
- (int) (HEIGHT/2 - DISPSCALE * (afun[2]
- + afun[3]/4 + afun[5]) * HEIGHT));
- }
-
-
- int closeby (funs, currentfun, numoffun, mx, my)
-
- float funs[][6];
- int *currentfun, numoffun;
- USHORT mx, my;
-
- {
- int xc[4], yc[4], i, j, thecorner = 0, hit=FALSE, thefun;
-
- for (j=0;j<=numoffun;j++) {
- xc[0] = WIDTH/2 + DISPSCALE * funs[j][4] * WIDTH;
- yc[0] = HEIGHT/2 - DISPSCALE * funs[j][5] * HEIGHT;
-
- xc[1] = WIDTH/2 + DISPSCALE * (funs[j][0] + funs[j][4]) * WIDTH;
- yc[1] = HEIGHT/2 - DISPSCALE * (funs[j][2] + funs[j][5]) * HEIGHT;
-
- xc[2] = WIDTH/2 + DISPSCALE
- * (funs[j][0] + funs[j][1] + funs[j][4]) * WIDTH;
- yc[2] = HEIGHT/2 - DISPSCALE
- * (funs[j][2] + funs[j][3] + funs[j][5]) * HEIGHT;
- xc[3] = WIDTH/2 + DISPSCALE * (funs[j][1] + funs[j][4]) * WIDTH;
- yc[3] = HEIGHT/2 - DISPSCALE * (funs[j][3] + funs[j][5]) * HEIGHT;
-
- for (i=0;i<4;i++) {
- xc[i] = mx - xc[i];
- yc[i] = my - yc[i];
- if (xc[i] < 0) xc[i] = - xc[i];
- if (yc[i] < 0) yc[i] = - yc[i];
- if (xc[i] < EPSILON && yc[i] < EPSILON)
- if (hit == FALSE) {
- thecorner = i+1; /* is closeby */
- thefun = j;
- hit = TRUE;
- }
- else /* two at same point */
- if (j == *currentfun) { /* select currentfun */
- thecorner = i+1;
- thefun = j;
- }
-
- }
- }
- if (hit == TRUE) *currentfun = thefun;
- return (thecorner);
- } /* end closeby */
-
- void adjust(corner, rp, funs, currentfun, mx, my) /* returns 1 if moved */
- int corner;
- struct RastPort *rp;
- float funs[][6];
- int currentfun;
- USHORT mx, my;
-
- {
- float ta, tb, tc, td, te, tf;
-
- ta = funs[currentfun][0];
- tb = funs[currentfun][1];
- tc = funs[currentfun][2];
- td = funs[currentfun][3];
- te = funs[currentfun][4];
- tf = funs[currentfun][5];
-
- switch (corner) {
- case 1:
- te = (mx - WIDTH/2)/(DISPSCALE * WIDTH);
- tf = (HEIGHT/2 - my)/(DISPSCALE * HEIGHT);
- break;
- case 2:
- ta = (mx - WIDTH/2)/(DISPSCALE * WIDTH) - te;
- tc = (HEIGHT/2 - my)/(DISPSCALE * HEIGHT) - tf;
- break;
- case 3:
- ta = (mx - WIDTH/2)/(DISPSCALE * WIDTH) - te - tb;
- td = (HEIGHT/2 - my)/(DISPSCALE * HEIGHT) - tf - tc;
- break;
- case 4:
- tb = (mx - WIDTH/2)/(DISPSCALE * WIDTH) - te;
- td = (HEIGHT/2 - my)/(DISPSCALE * HEIGHT) - tf;
- break;
- }
- if (ta >= MINCOFF && ta <= MAXCOFF &&
- tb >= MINCOFF && tb <= MAXCOFF &&
- tc >= MINCOFF && tc <= MAXCOFF &&
- td >= MINCOFF && td <= MAXCOFF &&
- te >= MINCOFF && te <= MAXCOFF &&
- tf >= MINCOFF && tf <= MAXCOFF) {
-
- funs[currentfun][0] = ta;
- funs[currentfun][1] = tb;
- funs[currentfun][2] = tc;
- funs[currentfun][3] = td;
- funs[currentfun][4] = te;
- funs[currentfun][5] = tf;
- SetDrMd(rp,COMPLEMENT);
- drawonebox(rp, funs[currentfun]);
- drawonebox(rp, funs[currentfun]);
- SetDrMd(rp,JAM1);
- }
- }
-
- void checkswitches(rp,funs,percent,currentfun,numoffun,vectorsw,displaynumsw)
- struct RastPort *rp;
- float funs[][6], percent[];
- int currentfun, numoffun;
- short vectorsw, displaynumsw;
- {
- if (vectorsw)
- drawvectors(rp, funs, numoffun, currentfun);
- if (displaynumsw)
- displaynums(rp, funs, percent, currentfun, numoffun);
- }
-