| 15 |
|
#include "otypes.h" |
| 16 |
|
|
| 17 |
|
|
| 18 |
+ |
#define INITFILE "rayinit.cal" |
| 19 |
+ |
#define DEFVNAME "FILE_LOADED`" |
| 20 |
+ |
|
| 21 |
|
XF unitxf = { /* identity transform */ |
| 22 |
|
1.0, 0.0, 0.0, 0.0, |
| 23 |
|
0.0, 1.0, 0.0, 0.0, |
| 36 |
|
register RAY *r; |
| 37 |
|
XF *bx; |
| 38 |
|
{ |
| 36 |
– |
extern double l_arg(); |
| 39 |
|
extern long eclock; |
| 40 |
< |
static char *initfile = "rayinit.cal"; |
| 41 |
< |
/* initialize if first call */ |
| 42 |
< |
if (initfile != NULL) { |
| 43 |
< |
loadfunc(initfile); |
| 42 |
< |
scompile("Dx=$1;Dy=$2;Dz=$3;", NULL, 0); |
| 43 |
< |
scompile("Nx=$4;Ny=$5;Nz=$6;", NULL, 0); |
| 44 |
< |
scompile("Px=$7;Py=$8;Pz=$9;", NULL, 0); |
| 45 |
< |
scompile("T=$10;Rdot=$11;", NULL, 0); |
| 46 |
< |
scompile("S=$12;Tx=$13;Ty=$14;Tz=$15;", NULL, 0); |
| 47 |
< |
scompile("Ix=$16;Iy=$17;Iz=$18;", NULL, 0); |
| 48 |
< |
scompile("Jx=$19;Jy=$20;Jz=$21;", NULL, 0); |
| 49 |
< |
scompile("Kx=$22;Ky=$23;Kz=$24;", NULL, 0); |
| 50 |
< |
funset("arg", 1, '=', l_arg); |
| 51 |
< |
setnoisefuncs(); |
| 52 |
< |
initfile = NULL; |
| 53 |
< |
} |
| 40 |
> |
static long lastrno = -1; |
| 41 |
> |
/* check to see if already set */ |
| 42 |
> |
if (m == fobj && r->rno == lastrno) |
| 43 |
> |
return(0); |
| 44 |
|
fobj = m; |
| 45 |
|
fray = r; |
| 46 |
|
if (r->rox != NULL) |
| 51 |
|
copystruct(&funcxf, &r->rox->b); |
| 52 |
|
else |
| 53 |
|
copystruct(&funcxf, bx); |
| 54 |
+ |
lastrno = r->rno; |
| 55 |
|
eclock++; /* notify expression evaluator */ |
| 56 |
+ |
return(1); |
| 57 |
|
} |
| 58 |
|
|
| 59 |
|
|
| 83 |
|
} |
| 84 |
|
m->os = (char *)mxf; |
| 85 |
|
} |
| 86 |
< |
setmap(m, r, mxf); |
| 95 |
< |
return; |
| 86 |
> |
return(setmap(m, r, mxf)); |
| 87 |
|
memerr: |
| 88 |
|
error(SYSTEM, "out of memory in setfunc"); |
| 89 |
|
} |
| 123 |
|
|
| 124 |
|
|
| 125 |
|
double |
| 126 |
+ |
l_erf() /* error function */ |
| 127 |
+ |
{ |
| 128 |
+ |
extern double erf(); |
| 129 |
+ |
|
| 130 |
+ |
return(erf(argument(1))); |
| 131 |
+ |
} |
| 132 |
+ |
|
| 133 |
+ |
|
| 134 |
+ |
double |
| 135 |
+ |
l_erfc() /* cumulative error function */ |
| 136 |
+ |
{ |
| 137 |
+ |
extern double erfc(); |
| 138 |
+ |
|
| 139 |
+ |
return(erfc(argument(1))); |
| 140 |
+ |
} |
| 141 |
+ |
|
| 142 |
+ |
|
| 143 |
+ |
funcfile(fname) /* set context, load file if necessary */ |
| 144 |
+ |
char *fname; |
| 145 |
+ |
{ |
| 146 |
+ |
extern char *setcontext(); |
| 147 |
+ |
static char initfile[] = INITFILE; |
| 148 |
+ |
|
| 149 |
+ |
if (initfile[0]) { /* initialize on first call */ |
| 150 |
+ |
setcontext(""); |
| 151 |
+ |
scompile("Dx=$1;Dy=$2;Dz=$3;", NULL, 0); |
| 152 |
+ |
scompile("Nx=$4;Ny=$5;Nz=$6;", NULL, 0); |
| 153 |
+ |
scompile("Px=$7;Py=$8;Pz=$9;", NULL, 0); |
| 154 |
+ |
scompile("T=$10;Rdot=$11;", NULL, 0); |
| 155 |
+ |
scompile("S=$12;Tx=$13;Ty=$14;Tz=$15;", NULL, 0); |
| 156 |
+ |
scompile("Ix=$16;Iy=$17;Iz=$18;", NULL, 0); |
| 157 |
+ |
scompile("Jx=$19;Jy=$20;Jz=$21;", NULL, 0); |
| 158 |
+ |
scompile("Kx=$22;Ky=$23;Kz=$24;", NULL, 0); |
| 159 |
+ |
funset("arg", 1, '=', l_arg); |
| 160 |
+ |
funset("erf", 1, ':', l_erf); |
| 161 |
+ |
funset("erfc", 1, ':', l_erfc); |
| 162 |
+ |
setnoisefuncs(); |
| 163 |
+ |
loadfunc(initfile); |
| 164 |
+ |
initfile[0] = '\0'; |
| 165 |
+ |
} |
| 166 |
+ |
setcontext(fname); |
| 167 |
+ |
if (!vardefined(DEFVNAME)) { |
| 168 |
+ |
loadfunc(fname); |
| 169 |
+ |
varset(DEFVNAME, ':', 1.0); |
| 170 |
+ |
} |
| 171 |
+ |
} |
| 172 |
+ |
|
| 173 |
+ |
|
| 174 |
+ |
double |
| 175 |
|
chanvalue(n) /* return channel n to calcomp */ |
| 176 |
|
register int n; |
| 177 |
|
{ |
| 210 |
|
return(sum * funcxf.sca); |
| 211 |
|
|
| 212 |
|
} |
| 213 |
< |
if (n == 10) /* dot product */ |
| 214 |
< |
return(fray->rod); |
| 213 |
> |
if (n == 10) /* dot product (range [-1,1]) */ |
| 214 |
> |
return( fray->rod <= -1.0 ? -1.0 : |
| 215 |
> |
fray->rod >= 1.0 ? 1.0 : |
| 216 |
> |
fray->rod ); |
| 217 |
|
|
| 218 |
|
if (n == 11) /* scale */ |
| 219 |
|
return(funcxf.sca); |