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.3 by greg, Fri Dec 22 09:24:07 1989 UTC

# Line 51 | Line 51 | double  v3a[3];
51   register double  v3b[3];
52   register double  m4[4][4];
53   {
54 <        register int  i;
54 >        m4tmp[0][0] = v3b[0]*m4[0][0] + v3b[1]*m4[1][0] + v3b[2]*m4[2][0];
55 >        m4tmp[0][1] = v3b[0]*m4[0][1] + v3b[1]*m4[1][1] + v3b[2]*m4[2][1];
56 >        m4tmp[0][2] = v3b[0]*m4[0][2] + v3b[1]*m4[1][2] + v3b[2]*m4[2][2];
57          
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        
58          v3a[0] = m4tmp[0][0];
59          v3a[1] = m4tmp[0][1];
60          v3a[2] = m4tmp[0][2];
# Line 79 | Line 76 | register double  m4[4][4];
76   #ifdef  INVMAT
77   /*
78   * invmat - computes the inverse of mat into inverse.  Returns 1
79 < * if there exists an inverse, 0 otherwise.  It uses Gause Elimination
80 < * method.
79 > * if there exists an inverse, 0 otherwise.  It uses Gaussian Elimination
80 > * method with partial pivoting.
81   */
82  
83   invmat(inverse,mat)
84   double mat[4][4],inverse[4][4];
85   {
86   #define SWAP(a,b,t) (t=a,a=b,b=t)
87 + #define ABS(x) (x>=0?x:-(x))
88  
89          register int i,j,k;
90          register double temp;
91  
94        setident4(inverse);
92          copymat4(m4tmp, mat);
93 +        setident(inverse);
94  
95          for(i = 0; i < 4; i++) {
96 <                if(m4tmp[i][i] == 0) {    /* Pivot is zero */
97 <                        /* Look for a raw with pivot != 0 and swap raws */
98 <                        for(j = i + 1; j < 4; j++)
99 <                                if(m4tmp[j][i] != 0) {
100 <                                        for( k = 0; k < 4; k++) {
101 <                                                SWAP(m4tmp[i][k],m4tmp[j][k],temp);
102 <                                                SWAP(inverse[i][k],inverse[j][k],temp);
103 <                                                }
104 <                                        break;
105 <                                        }
106 <                        if(j == 4)      /* No replacing raw -> no inverse */
107 <                                return(0);
108 <                        }
96 >                /* Look for row with largest pivot and swap rows */
97 >                temp = 0; j = -1;
98 >                for(k = i; k < 4; k++)
99 >                        if(ABS(m4tmp[k][i]) > temp) {
100 >                                temp = ABS(m4tmp[k][i]);
101 >                                j = k;
102 >                                }
103 >                if(j == -1)     /* No replacing row -> no inverse */
104 >                        return(0);
105 >                if (j != i)
106 >                        for(k = 0; k < 4; k++) {
107 >                                SWAP(m4tmp[i][k],m4tmp[j][k],temp);
108 >                                SWAP(inverse[i][k],inverse[j][k],temp);
109 >                                }
110  
111                  temp = m4tmp[i][i];
112                  for(k = 0; k < 4; k++) {
# Line 125 | Line 124 | double mat[4][4],inverse[4][4];
124                          }
125                  }
126          return(1);
127 +
128 + #undef ABS
129 + #undef SWAP
130   }
131   #endif

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines