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.3 by greg, Wed Feb 5 21:05:00 1992 UTC vs.
Revision 2.5 by greg, Tue Apr 12 15:16:15 1994 UTC

# Line 375 | Line 375 | register POINT  *r0, *r1, *r2;
375   int  siz;
376   {
377          FVECT  v1, v2;
378        register int  i;
378  
379          if (!smooth)                    /* not needed if no smoothing */
380                  return;
# Line 430 | 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 446 | Line 445 | POINT  *p0, *p1, *p2, *p3;
445   }
446  
447  
449 /*
450 * invmat - computes the inverse of mat into inverse.  Returns 1
451 * if there exists an inverse, 0 otherwise.  It uses Gaussian Elimination
452 * method.
453 */
454
455 invmat(inverse,mat)
456 MAT4  inverse, mat;
457 {
458 #define SWAP(a,b,t) (t=a,a=b,b=t)
459
460        MAT4  m4tmp;
461        register int i,j,k;
462        register double temp;
463
464        copymat4(m4tmp, mat);
465                                        /* set inverse to identity */
466        for (i = 0; i < 4; i++)
467                for (j = 0; j < 4; j++)
468                        inverse[i][j] = i==j ? 1.0 : 0.0;
469
470        for(i = 0; i < 4; i++) {
471                /* Look for row with largest pivot and swap rows */
472                temp = FTINY; j = -1;
473                for(k = i; k < 4; k++)
474                        if(ABS(m4tmp[k][i]) > temp) {
475                                temp = ABS(m4tmp[k][i]);
476                                j = k;
477                                }
478                if(j == -1)     /* No replacing row -> no inverse */
479                        return(0);
480                if (j != i)
481                        for(k = 0; k < 4; k++) {
482                                SWAP(m4tmp[i][k],m4tmp[j][k],temp);
483                                SWAP(inverse[i][k],inverse[j][k],temp);
484                                }
485
486                temp = m4tmp[i][i];
487                for(k = 0; k < 4; k++) {
488                        m4tmp[i][k] /= temp;
489                        inverse[i][k] /= temp;
490                        }
491                for(j = 0; j < 4; j++) {
492                        if(j != i) {
493                                temp = m4tmp[j][i];
494                                for(k = 0; k < 4; k++) {
495                                        m4tmp[j][k] -= m4tmp[i][k]*temp;
496                                        inverse[j][k] -= inverse[i][k]*temp;
497                                        }
498                                }
499                        }
500                }
501        return(1);
502
503 #undef SWAP
504 }
505
506
448   eputs(msg)
449   char  *msg;
450   {
# Line 519 | 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