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

Comparing ray/src/common/mat4.c (file contents):
Revision 1.1 by greg, Thu Feb 2 10:34:35 1989 UTC vs.
Revision 1.4 by greg, Thu Jan 18 23:58:56 1990 UTC

# Line 13 | Line 13 | static char SCCSid[] = "$SunId$ LBL";
13  
14   static double  m4tmp[4][4];             /* for efficiency */
15  
16 + #ifdef  BSD
17   #define  copymat4(m4a,m4b)      bcopy((char *)m4b,(char *)m4a,sizeof(m4tmp))
18 + #else
19 + #define  copymat4(m4a,m4b)      (void)memcpy((char *)m4a,(char *)m4b,sizeof(m4tmp))
20 + extern char  *memcpy();
21 + #endif
22  
23  
24   setident4(m4)
# Line 51 | Line 56 | double  v3a[3];
56   register double  v3b[3];
57   register double  m4[4][4];
58   {
59 <        register int  i;
59 >        m4tmp[0][0] = v3b[0]*m4[0][0] + v3b[1]*m4[1][0] + v3b[2]*m4[2][0];
60 >        m4tmp[0][1] = v3b[0]*m4[0][1] + v3b[1]*m4[1][1] + v3b[2]*m4[2][1];
61 >        m4tmp[0][2] = v3b[0]*m4[0][2] + v3b[1]*m4[1][2] + v3b[2]*m4[2][2];
62          
56        for (i = 0; i < 3; i++)
57                m4tmp[0][i] = v3b[0]*m4[0][i] +
58                              v3b[1]*m4[1][i] +
59                              v3b[2]*m4[2][i];
60        
63          v3a[0] = m4tmp[0][0];
64          v3a[1] = m4tmp[0][1];
65          v3a[2] = m4tmp[0][2];
# Line 79 | Line 81 | register double  m4[4][4];
81   #ifdef  INVMAT
82   /*
83   * invmat - computes the inverse of mat into inverse.  Returns 1
84 < * if there exists an inverse, 0 otherwise.  It uses Gause Elimination
85 < * method.
84 > * if there exists an inverse, 0 otherwise.  It uses Gaussian Elimination
85 > * method with partial pivoting.
86   */
87  
88   invmat(inverse,mat)
89   double mat[4][4],inverse[4][4];
90   {
91   #define SWAP(a,b,t) (t=a,a=b,b=t)
92 + #define ABS(x) (x>=0?x:-(x))
93  
94          register int i,j,k;
95          register double temp;
96  
94        setident4(inverse);
97          copymat4(m4tmp, mat);
98 +        setident(inverse);
99  
100          for(i = 0; i < 4; i++) {
101 <                if(m4tmp[i][i] == 0) {    /* Pivot is zero */
102 <                        /* Look for a raw with pivot != 0 and swap raws */
103 <                        for(j = i + 1; j < 4; j++)
104 <                                if(m4tmp[j][i] != 0) {
105 <                                        for( k = 0; k < 4; k++) {
106 <                                                SWAP(m4tmp[i][k],m4tmp[j][k],temp);
107 <                                                SWAP(inverse[i][k],inverse[j][k],temp);
108 <                                                }
109 <                                        break;
110 <                                        }
111 <                        if(j == 4)      /* No replacing raw -> no inverse */
112 <                                return(0);
113 <                        }
101 >                /* Look for row with largest pivot and swap rows */
102 >                temp = 0; j = -1;
103 >                for(k = i; k < 4; k++)
104 >                        if(ABS(m4tmp[k][i]) > temp) {
105 >                                temp = ABS(m4tmp[k][i]);
106 >                                j = k;
107 >                                }
108 >                if(j == -1)     /* No replacing row -> no inverse */
109 >                        return(0);
110 >                if (j != i)
111 >                        for(k = 0; k < 4; k++) {
112 >                                SWAP(m4tmp[i][k],m4tmp[j][k],temp);
113 >                                SWAP(inverse[i][k],inverse[j][k],temp);
114 >                                }
115  
116                  temp = m4tmp[i][i];
117                  for(k = 0; k < 4; k++) {
# Line 125 | Line 129 | double mat[4][4],inverse[4][4];
129                          }
130                  }
131          return(1);
132 +
133 + #undef ABS
134 + #undef SWAP
135   }
136   #endif

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines