| 165 | 
  | 
        register FLOAT  *dp; | 
| 166 | 
  | 
 | 
| 167 | 
  | 
        datarec.flags = HASBORDER;              /* assume border values */ | 
| 168 | 
< | 
        size = (m+1)*(n+1)*pointsize; | 
| 168 | 
> | 
        datarec.m = m+1; | 
| 169 | 
> | 
        datarec.n = n+1; | 
| 170 | 
> | 
        size = datarec.m*datarec.n*pointsize; | 
| 171 | 
  | 
        if (pointsize == 3) | 
| 172 | 
  | 
                datarec.flags |= TRIPLETS; | 
| 173 | 
  | 
        dp = (FLOAT *)malloc(size*sizeof(FLOAT)); | 
| 198 | 
  | 
                if (dp != NULL) | 
| 199 | 
  | 
                        datarec.data = dp; | 
| 200 | 
  | 
                datarec.flags &= ~HASBORDER; | 
| 201 | 
+ | 
                datarec.m = m; | 
| 202 | 
+ | 
                datarec.n = n; | 
| 203 | 
  | 
                size = 0; | 
| 204 | 
  | 
        } | 
| 205 | 
< | 
        if (size || fgetword(word, sizeof(word), fp) != NULL) { | 
| 205 | 
> | 
        if (datarec.m < 2 || datarec.n < 2 || size != 0 || | 
| 206 | 
> | 
                        fgetword(word, sizeof(word), fp) != NULL) { | 
| 207 | 
  | 
                fputs(file, stderr); | 
| 208 | 
  | 
                fputs(": bad number of data points\n", stderr); | 
| 209 | 
  | 
                exit(1); | 
| 223 | 
  | 
                                                /* compute coordinates */ | 
| 224 | 
  | 
        u = argument(1); v = argument(2); | 
| 225 | 
  | 
        if (datarec.flags & HASBORDER) { | 
| 226 | 
< | 
                i = u *= datarec.m; | 
| 227 | 
< | 
                j = v *= datarec.n; | 
| 226 | 
> | 
                i = u *= datarec.m-1; | 
| 227 | 
> | 
                j = v *= datarec.n-1; | 
| 228 | 
  | 
        } else { | 
| 229 | 
< | 
                i = u = u*(datarec.m+1) - .5; | 
| 230 | 
< | 
                j = v = v*(datarec.n+1) - .5; | 
| 229 | 
> | 
                i = u = u*datarec.m - .5; | 
| 230 | 
> | 
                j = v = v*datarec.n - .5; | 
| 231 | 
  | 
        } | 
| 232 | 
  | 
        if (i < 0) i = 0; | 
| 233 | 
  | 
        else if (i > datarec.m-2) i = datarec.m-2; | 
| 235 | 
  | 
        else if (j > datarec.n-2) j = datarec.n-2; | 
| 236 | 
  | 
                                                /* compute value */ | 
| 237 | 
  | 
        if (datarec.flags & TRIPLETS) { | 
| 238 | 
< | 
                dp = datarec.data + 3*(j*datarec.n + i); | 
| 239 | 
< | 
                if (nam == YNAME) | 
| 235 | 
< | 
                        dp++; | 
| 236 | 
< | 
                else if (nam == ZNAME) | 
| 238 | 
> | 
                dp = datarec.data + 3*(j*datarec.m + i); | 
| 239 | 
> | 
                if (nam == ZNAME) | 
| 240 | 
  | 
                        dp += 2; | 
| 241 | 
+ | 
                else if (nam == YNAME) | 
| 242 | 
+ | 
                        dp++; | 
| 243 | 
  | 
                d00 = dp[0]; d01 = dp[3]; | 
| 244 | 
< | 
                dp += 3*datarec.n; | 
| 244 | 
> | 
                dp += 3*datarec.m; | 
| 245 | 
  | 
                d10 = dp[0]; d11 = dp[3]; | 
| 246 | 
  | 
        } else { | 
| 247 | 
< | 
                dp = datarec.data + j*datarec.n + i; | 
| 247 | 
> | 
                dp = datarec.data + j*datarec.m + i; | 
| 248 | 
  | 
                d00 = dp[0]; d01 = dp[1]; | 
| 249 | 
< | 
                dp += datarec.n; | 
| 249 | 
> | 
                dp += datarec.m; | 
| 250 | 
  | 
                d10 = dp[0]; d11 = dp[1]; | 
| 251 | 
  | 
        } | 
| 252 | 
  | 
                                                /* bilinear interpolation */ | 
| 375 | 
  | 
int  siz; | 
| 376 | 
  | 
{ | 
| 377 | 
  | 
        FVECT  v1, v2; | 
| 373 | 
– | 
        register int  i; | 
| 378 | 
  | 
 | 
| 379 | 
  | 
        if (!smooth)                    /* not needed if no smoothing */ | 
| 380 | 
  | 
                return; | 
| 429 | 
  | 
        eqnmat[3][2] = p3->p[v]; | 
| 430 | 
  | 
        eqnmat[3][3] = 1.0; | 
| 431 | 
  | 
                                        /* invert matrix (solve system) */ | 
| 432 | 
< | 
        if (!invmat(eqnmat, eqnmat)) | 
| 432 | 
> | 
        if (!invmat4(eqnmat, eqnmat)) | 
| 433 | 
  | 
                return(-1);                     /* no solution */ | 
| 434 | 
  | 
                                        /* compute result matrix */ | 
| 435 | 
  | 
        for (j = 0; j < 4; j++) | 
| 445 | 
  | 
} | 
| 446 | 
  | 
 | 
| 447 | 
  | 
 | 
| 444 | 
– | 
/* | 
| 445 | 
– | 
 * invmat - computes the inverse of mat into inverse.  Returns 1 | 
| 446 | 
– | 
 * if there exists an inverse, 0 otherwise.  It uses Gaussian Elimination | 
| 447 | 
– | 
 * method. | 
| 448 | 
– | 
 */ | 
| 449 | 
– | 
 | 
| 450 | 
– | 
invmat(inverse,mat) | 
| 451 | 
– | 
MAT4  inverse, mat; | 
| 452 | 
– | 
{ | 
| 453 | 
– | 
#define SWAP(a,b,t) (t=a,a=b,b=t) | 
| 454 | 
– | 
 | 
| 455 | 
– | 
        MAT4  m4tmp; | 
| 456 | 
– | 
        register int i,j,k; | 
| 457 | 
– | 
        register double temp; | 
| 458 | 
– | 
 | 
| 459 | 
– | 
        copymat4(m4tmp, mat); | 
| 460 | 
– | 
                                        /* set inverse to identity */ | 
| 461 | 
– | 
        for (i = 0; i < 4; i++) | 
| 462 | 
– | 
                for (j = 0; j < 4; j++) | 
| 463 | 
– | 
                        inverse[i][j] = i==j ? 1.0 : 0.0; | 
| 464 | 
– | 
 | 
| 465 | 
– | 
        for(i = 0; i < 4; i++) { | 
| 466 | 
– | 
                /* Look for row with largest pivot and swap rows */ | 
| 467 | 
– | 
                temp = FTINY; j = -1; | 
| 468 | 
– | 
                for(k = i; k < 4; k++) | 
| 469 | 
– | 
                        if(ABS(m4tmp[k][i]) > temp) { | 
| 470 | 
– | 
                                temp = ABS(m4tmp[k][i]); | 
| 471 | 
– | 
                                j = k; | 
| 472 | 
– | 
                                } | 
| 473 | 
– | 
                if(j == -1)     /* No replacing row -> no inverse */ | 
| 474 | 
– | 
                        return(0); | 
| 475 | 
– | 
                if (j != i) | 
| 476 | 
– | 
                        for(k = 0; k < 4; k++) { | 
| 477 | 
– | 
                                SWAP(m4tmp[i][k],m4tmp[j][k],temp); | 
| 478 | 
– | 
                                SWAP(inverse[i][k],inverse[j][k],temp); | 
| 479 | 
– | 
                                } | 
| 480 | 
– | 
 | 
| 481 | 
– | 
                temp = m4tmp[i][i]; | 
| 482 | 
– | 
                for(k = 0; k < 4; k++) { | 
| 483 | 
– | 
                        m4tmp[i][k] /= temp; | 
| 484 | 
– | 
                        inverse[i][k] /= temp; | 
| 485 | 
– | 
                        } | 
| 486 | 
– | 
                for(j = 0; j < 4; j++) { | 
| 487 | 
– | 
                        if(j != i) { | 
| 488 | 
– | 
                                temp = m4tmp[j][i]; | 
| 489 | 
– | 
                                for(k = 0; k < 4; k++) { | 
| 490 | 
– | 
                                        m4tmp[j][k] -= m4tmp[i][k]*temp; | 
| 491 | 
– | 
                                        inverse[j][k] -= inverse[i][k]*temp; | 
| 492 | 
– | 
                                        } | 
| 493 | 
– | 
                                } | 
| 494 | 
– | 
                        } | 
| 495 | 
– | 
                } | 
| 496 | 
– | 
        return(1); | 
| 497 | 
– | 
 | 
| 498 | 
– | 
#undef SWAP | 
| 499 | 
– | 
} | 
| 500 | 
– | 
 | 
| 501 | 
– | 
 | 
| 448 | 
  | 
eputs(msg) | 
| 449 | 
  | 
char  *msg; | 
| 450 | 
  | 
{ | 
| 460 | 
  | 
 | 
| 461 | 
  | 
 | 
| 462 | 
  | 
quit(code) | 
| 463 | 
+ | 
int  code; | 
| 464 | 
  | 
{ | 
| 465 | 
  | 
        exit(code); | 
| 466 | 
  | 
} |