ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/gensurf.c
(Generate patch)

Comparing ray/src/gen/gensurf.c (file contents):
Revision 2.2 by greg, Thu Jan 30 14:11:39 1992 UTC vs.
Revision 2.5 by greg, Tue Apr 12 15:16:15 1994 UTC

# Line 165 | Line 165 | int  pointsize;
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));
# Line 196 | Line 198 | int  pointsize;
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);
# Line 218 | Line 223 | char  *nam;
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;
# Line 230 | Line 235 | char  *nam;
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 */
# Line 370 | Line 375 | register POINT  *r0, *r1, *r2;
375   int  siz;
376   {
377          FVECT  v1, v2;
373        register int  i;
378  
379          if (!smooth)                    /* not needed if no smoothing */
380                  return;
# Line 425 | Line 429 | POINT  *p0, *p1, *p2, *p3;
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++)
# Line 441 | Line 445 | POINT  *p0, *p1, *p2, *p3;
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   {
# Line 514 | Line 460 | char  *msg;
460  
461  
462   quit(code)
463 + int  code;
464   {
465          exit(code);
466   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines