| 251 |
|
if ((scval = (COLORV *)m->os) == NULL) { |
| 252 |
|
DATARRAY *dp; |
| 253 |
|
COLORV *sinp; |
| 254 |
+ |
int n; |
| 255 |
|
double step; |
| 255 |
– |
int i; |
| 256 |
|
if (m->oargs.nsargs != 1) |
| 257 |
|
objerror(m, USER, "bad # arguments"); |
| 258 |
|
dp = getdata(m->oargs.sarg[0]); |
| 259 |
|
if (dp->nd != 1) |
| 260 |
|
objerror(m, USER, "data file must be 1-dimensional"); |
| 261 |
|
|
| 262 |
< |
sinp = (COLORV *)malloc(sizeof(COLORV)*dp->dim[0].ne); |
| 262 |
> |
n = (dp->dim[0].p == NULL) ? dp->dim[0].ne : 2*dp->dim[0].ne; |
| 263 |
> |
sinp = (COLORV *)malloc(sizeof(COLORV)*n); |
| 264 |
|
scval = (COLORV *)malloc(sizeof(COLORV)*NCSAMP); |
| 265 |
|
if ((sinp == NULL) | (scval == NULL)) |
| 266 |
|
objerror(m, SYSTEM, "out of memory"); |
| 267 |
< |
step = dp->dim[0].siz / (dp->dim[0].ne - 1.0); |
| 268 |
< |
for (i = dp->dim[0].ne; i-- > 0; ) { |
| 269 |
< |
double wl = dp->dim[0].org + i*step; |
| 270 |
< |
sinp[i] = (COLORV)datavalue(dp, &wl); |
| 267 |
> |
step = dp->dim[0].siz / (n - 1.0); |
| 268 |
> |
while (n--) { |
| 269 |
> |
double wl = dp->dim[0].org + n*step; |
| 270 |
> |
sinp[n] = (COLORV)datavalue(dp, &wl); |
| 271 |
|
} |
| 272 |
|
convertscolorcol(scval, sinp, dp->dim[0].ne, |
| 273 |
|
dp->dim[0].org-.5*step, |
| 308 |
|
if ((errno == EDOM) | (errno == ERANGE)) |
| 309 |
|
goto computerr; |
| 310 |
|
} |
| 311 |
< |
step = dp->dim[dp->nd-1].siz / (dp->dim[dp->nd-1].ne - 1.0); |
| 312 |
< |
scdat = (COLORV *)malloc(sizeof(COLORV)*dp->dim[dp->nd-1].ne); |
| 311 |
> |
dp = datavector(dp, pt); /* interpolate spectrum */ |
| 312 |
> |
step = dp->dim[0].siz / (dp->dim[0].ne - 1.0); |
| 313 |
> |
scdat = (COLORV *)malloc(sizeof(COLORV)*dp->dim[0].ne); |
| 314 |
|
if (scdat == NULL) |
| 315 |
|
objerror(m, SYSTEM, "out of memory"); |
| 316 |
< |
for (i = dp->dim[dp->nd-1].ne; i-- > 0; ) { |
| 317 |
< |
double bval[2]; |
| 318 |
< |
pt[dp->nd-1] = dp->dim[dp->nd-1].org + i*step; |
| 317 |
< |
bval[0] = datavalue(dp, pt); |
| 318 |
< |
bval[1] = pt[dp->nd-1]; |
| 316 |
> |
for (i = dp->dim[0].ne; i-- > 0; ) { |
| 317 |
> |
pt[1] = dp->dim[0].org + i*step; |
| 318 |
> |
pt[0] = datavalue(dp, pt+1); |
| 319 |
|
errno = 0; |
| 320 |
< |
scdat[i] = funvalue(m->oargs.sarg[0], 2, bval); |
| 320 |
> |
scdat[i] = funvalue(m->oargs.sarg[0], 2, pt); |
| 321 |
|
if ((errno == EDOM) | (errno == ERANGE)) |
| 322 |
|
goto computerr; |
| 323 |
|
} |
| 324 |
< |
convertscolorcol(scval, scdat, dp->dim[dp->nd-1].ne, |
| 325 |
< |
dp->dim[dp->nd-1].org-.5*step, |
| 326 |
< |
dp->dim[dp->nd-1].org+dp->dim[dp->nd-1].siz+.5*step); |
| 324 |
> |
convertscolorcol(scval, scdat, dp->dim[0].ne, |
| 325 |
> |
dp->dim[0].org-.5*step, |
| 326 |
> |
dp->dim[0].org+dp->dim[0].siz+.5*step); |
| 327 |
|
free(scdat); |
| 328 |
+ |
free(dp); |
| 329 |
|
smultscolor(r->pcol, scval); |
| 330 |
|
return(0); |
| 331 |
|
computerr: |
| 341 |
|
) |
| 342 |
|
{ |
| 343 |
|
SCOLOR scdat, scval; |
| 344 |
< |
double pt[3]; |
| 344 |
> |
double pt[2]; |
| 345 |
|
DATARRAY *dp; |
| 346 |
|
MFUNC *mf; |
| 347 |
|
double step; |
| 356 |
|
pt[0] = evalue(mf->ep[1]); |
| 357 |
|
if ((errno == EDOM) | (errno == ERANGE)) |
| 358 |
|
goto computerr; |
| 359 |
< |
dp = getspec(m->oargs.sarg[1]); |
| 360 |
< |
step = dp->dim[2].siz / (dp->dim[2].ne - 1.0); |
| 361 |
< |
for (i = dp->dim[2].ne; i-- > 0; ) { |
| 362 |
< |
double bval[2]; |
| 363 |
< |
pt[2] = dp->dim[2].org + i*step; |
| 364 |
< |
bval[0] = datavalue(dp, pt); |
| 364 |
< |
bval[1] = pt[2]; |
| 359 |
> |
/* interpolate spectrum */ |
| 360 |
> |
dp = datavector(getspec(m->oargs.sarg[1]), pt); |
| 361 |
> |
step = dp->dim[0].siz / (dp->dim[0].ne - 1.0); |
| 362 |
> |
for (i = dp->dim[0].ne; i-- > 0; ) { |
| 363 |
> |
pt[1] = dp->dim[0].org + i*step; |
| 364 |
> |
pt[0] = dp->arr.d[i]; /* datavalue(dp, pt+1); */ |
| 365 |
|
errno = 0; |
| 366 |
< |
scdat[i] = funvalue(m->oargs.sarg[0], 2, bval); |
| 366 |
> |
scdat[i] = funvalue(m->oargs.sarg[0], 2, pt); |
| 367 |
|
if ((errno == EDOM) | (errno == ERANGE)) |
| 368 |
|
goto computerr; |
| 369 |
|
} |
| 370 |
< |
convertscolorcol(scval, scdat, dp->dim[2].ne, |
| 371 |
< |
dp->dim[2].org-.5*step, |
| 372 |
< |
dp->dim[2].org+dp->dim[2].siz+.5*step); |
| 370 |
> |
convertscolorcol(scval, scdat, dp->dim[0].ne, |
| 371 |
> |
dp->dim[0].org-.5*step, |
| 372 |
> |
dp->dim[0].org+dp->dim[0].siz+.5*step); |
| 373 |
> |
free(dp); |
| 374 |
|
smultscolor(r->pcol, scval); |
| 375 |
|
return(0); |
| 376 |
|
computerr: |