home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
300-399
/
ff321.lzh
/
Ifs
/
source
/
vectors.c
< prev
Wrap
C/C++ Source or Header
|
1990-02-27
|
6KB
|
181 lines
#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);
}