LCOV - code coverage report
Current view: top level - algs/Qslim - Mat4.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 41 81 50.6 %
Date: 2020-07-01 15:24:36 Functions: 3 13 23.1 %
Branches: 72 190 37.9 %

           Branch data     Line data    Source code
       1                 :            : #include "std.h"
       2                 :            : #include "Mat4.h"
       3                 :            : 
       4 [ +  - ][ +  - ]:        468 : Mat4 Mat4::identity(Vec4(1,0,0,0),Vec4(0,1,0,0),Vec4(0,0,1,0),Vec4(0,0,0,1));
         [ +  - ][ +  - ]
       5 [ +  - ][ +  - ]:        468 : Mat4 Mat4::zero(Vec4(0,0,0,0),Vec4(0,0,0,0),Vec4(0,0,0,0),Vec4(0,0,0,0));
         [ +  - ][ +  - ]
       6 [ +  - ][ +  - ]:        468 : Mat4 Mat4::unit(Vec4(1,1,1,1),Vec4(1,1,1,1),Vec4(1,1,1,1),Vec4(1,1,1,1));
         [ +  - ][ +  - ]
       7                 :            : 
       8                 :          0 : Mat4 Mat4::trans(double x, double y, double z)
       9                 :            : {
      10                 :            :     return Mat4(Vec4(1,0,0,x),
      11                 :            :                 Vec4(0,1,0,y),
      12                 :            :                 Vec4(0,0,1,z),
      13 [ #  # ][ #  # ]:          0 :                 Vec4(0,0,0,1));
         [ #  # ][ #  # ]
      14                 :            : }
      15                 :            : 
      16                 :          0 : Mat4 Mat4::scale(double x, double y, double z)
      17                 :            : {
      18                 :            :     return Mat4(Vec4(x,0,0,0),
      19                 :            :                 Vec4(0,y,0,0),
      20                 :            :                 Vec4(0,0,z,0),
      21 [ #  # ][ #  # ]:          0 :                 Vec4(0,0,0,1));
         [ #  # ][ #  # ]
      22                 :            : }
      23                 :            : 
      24                 :          0 : Mat4 Mat4::xrot(double a)
      25                 :            : {
      26                 :          0 :     double c = cos(a);
      27                 :          0 :     double s = sin(a);
      28                 :            : 
      29                 :            :     return Mat4(Vec4(1, 0, 0, 0),
      30                 :            :                 Vec4(0, c,-s, 0),
      31                 :            :                 Vec4(0, s, c, 0),
      32 [ #  # ][ #  # ]:          0 :                 Vec4(0, 0, 0, 1));
         [ #  # ][ #  # ]
      33                 :            : }
      34                 :            : 
      35                 :          0 : Mat4 Mat4::yrot(double a)
      36                 :            : {
      37                 :          0 :     double c = cos(a);
      38                 :          0 :     double s = sin(a);
      39                 :            : 
      40                 :            :     return Mat4(Vec4(c, 0, s, 0),
      41                 :            :                 Vec4(0, 1, 0, 0),
      42                 :            :                 Vec4(-s,0, c, 0),
      43 [ #  # ][ #  # ]:          0 :                 Vec4(0, 0, 0, 1));
         [ #  # ][ #  # ]
      44                 :            : }
      45                 :            : 
      46                 :          0 : Mat4 Mat4::zrot(double a)
      47                 :            : {
      48                 :          0 :     double c = cos(a);
      49                 :          0 :     double s = sin(a);
      50                 :            : 
      51                 :            :     return Mat4(Vec4(c,-s, 0, 0),
      52                 :            :                 Vec4(s, c, 0, 0),
      53                 :            :                 Vec4(0, 0, 1, 0),
      54 [ #  # ][ #  # ]:          0 :                 Vec4(0, 0, 0, 1));
         [ #  # ][ #  # ]
      55                 :            : }
      56                 :            : 
      57                 :          0 : Mat4 Mat4::operator*(const Mat4& m) const
      58                 :            : {
      59                 :          0 :     Mat4 A;
      60                 :            :     int i,j;
      61                 :            : 
      62         [ #  # ]:          0 :     for(i=0;i<4;i++)
      63         [ #  # ]:          0 :         for(j=0;j<4;j++)
      64         [ #  # ]:          0 :             A(i,j) = row[i]*m.col(j);
      65                 :            : 
      66                 :          0 :     return A;
      67                 :            : }
      68                 :            : 
      69                 :          0 : double Mat4::det() const
      70                 :            : {
      71         [ #  # ]:          0 :     return row[0] * cross(row[1], row[2], row[3]);
      72                 :            : }
      73                 :            : 
      74                 :          0 : Mat4 Mat4::transpose() const
      75                 :            : {
      76 [ #  # ][ #  # ]:          0 :     return Mat4(col(0), col(1), col(2), col(3));
         [ #  # ][ #  # ]
      77                 :            : }
      78                 :            : 
      79                 :          0 : Mat4 Mat4::adjoint() const
      80                 :            : {
      81                 :          0 :     Mat4 A;
      82                 :            : 
      83         [ #  # ]:          0 :     A.row[0] = cross( row[1], row[2], row[3]);
      84 [ #  # ][ #  # ]:          0 :     A.row[1] = cross(-row[0], row[2], row[3]);
      85         [ #  # ]:          0 :     A.row[2] = cross( row[0], row[1], row[3]);
      86 [ #  # ][ #  # ]:          0 :     A.row[3] = cross(-row[0], row[1], row[2]);
      87                 :            :         
      88                 :          0 :     return A;
      89                 :            : }
      90                 :            : 
      91                 :          0 : double Mat4::cramerInverse(Mat4& inv) const
      92                 :            : {
      93         [ #  # ]:          0 :     Mat4 A = adjoint();
      94         [ #  # ]:          0 :     double d = A.row[0] * row[0];
      95                 :            : 
      96         [ #  # ]:          0 :     if( d==0.0 )
      97                 :          0 :         return 0.0;
      98                 :            : 
      99 [ #  # ][ #  # ]:          0 :     inv = A.transpose() / d;
                 [ #  # ]
     100                 :          0 :     return d;
     101                 :            : }
     102                 :            : 
     103                 :            : 
     104                 :            : 
     105                 :            : // Matrix inversion code for 4x4 matrices.
     106                 :            : // Originally ripped off and degeneralized from Paul's matrix library
     107                 :            : // for the view synthesis (Chen) software.
     108                 :            : //
     109                 :            : // Returns determinant of a, and b=a inverse.
     110                 :            : // If matrix is singular, returns 0 and leaves trash in b.
     111                 :            : //
     112                 :            : // Uses Gaussian elimination with partial pivoting.
     113                 :            : 
     114                 :            : #define SWAP(a, b, t)   {t = a; a = b; b = t;}
     115                 :     363696 : double Mat4::inverse(Mat4& B) const
     116                 :            : {
     117         [ +  - ]:     363696 :     Mat4 A(*this);
     118                 :            : 
     119                 :            :     int i, j, k;
     120                 :            :     double max, t, det, pivot;
     121                 :            : 
     122                 :            :     /*---------- forward elimination ----------*/
     123                 :            : 
     124         [ +  + ]:    1818480 :     for (i=0; i<4; i++)                 /* put identity matrix in B */
     125         [ +  + ]:    7273920 :         for (j=0; j<4; j++)
     126 [ +  - ][ +  + ]:    5819136 :             B(i, j) = (double)(i==j);
     127                 :            : 
     128                 :     363696 :     det = 1.0;
     129         [ +  + ]:    1818480 :     for (i=0; i<4; i++) {               /* eliminate in column i, below diag */
     130                 :    1454784 :         max = -1.;
     131         [ +  + ]:    5091744 :         for (k=i; k<4; k++)             /* find pivot for column i */
     132 [ +  - ][ +  + ]:    3636960 :             if (fabs(A(k, i)) > max) {
     133         [ +  - ]:    2141184 :                 max = fabs(A(k, i));
     134                 :    2141184 :                 j = k;
     135                 :            :             }
     136         [ -  + ]:    1454784 :         if (max<=0.) return 0.;         /* if no nonzero pivot, PUNT */
     137         [ +  + ]:    1454784 :         if (j!=i) {                     /* swap rows i and j */
     138         [ +  + ]:    2569752 :             for (k=i; k<4; k++)
     139 [ +  - ][ +  - ]:    2011968 :                 SWAP(A(i, k), A(j, k), t);
         [ +  - ][ +  - ]
     140         [ +  + ]:    2788920 :             for (k=0; k<4; k++)
     141 [ +  - ][ +  - ]:    2231136 :                 SWAP(B(i, k), B(j, k), t);
         [ +  - ][ +  - ]
     142                 :     557784 :             det = -det;
     143                 :            :         }
     144         [ +  - ]:    1454784 :         pivot = A(i, i);
     145                 :    1454784 :         det *= pivot;
     146         [ +  + ]:    3636960 :         for (k=i+1; k<4; k++)           /* only do elems to right of pivot */
     147         [ +  - ]:    2182176 :             A(i, k) /= pivot;
     148         [ +  + ]:    7273920 :         for (k=0; k<4; k++)
     149         [ +  - ]:    5819136 :             B(i, k) /= pivot;
     150                 :            :         /* we know that A(i, i) will be set to 1, so don't bother to do it */
     151                 :            : 
     152         [ +  + ]:    3636960 :         for (j=i+1; j<4; j++) {         /* eliminate in rows below i */
     153         [ +  - ]:    2182176 :             t = A(j, i);                /* we're gonna zero this guy */
     154         [ +  + ]:    7273920 :             for (k=i+1; k<4; k++)       /* subtract scaled row i from row j */
     155 [ +  - ][ +  - ]:    5091744 :                 A(j, k) -= A(i, k)*t;   /* (ignore k<=i, we know they're 0) */
     156         [ +  + ]:   10910880 :             for (k=0; k<4; k++)
     157 [ +  - ][ +  - ]:    8728704 :                 B(j, k) -= B(i, k)*t;
     158                 :            :         }
     159                 :            :     }
     160                 :            : 
     161                 :            :     /*---------- backward elimination ----------*/
     162                 :            : 
     163         [ +  + ]:    1454784 :     for (i=4-1; i>0; i--) {             /* eliminate in column i, above diag */
     164         [ +  + ]:    3273264 :         for (j=0; j<i; j++) {           /* eliminate in rows above i */
     165         [ +  - ]:    2182176 :             t = A(j, i);                /* we're gonna zero this guy */
     166         [ +  + ]:   10910880 :             for (k=0; k<4; k++)         /* subtract scaled row i from row j */
     167 [ +  - ][ +  - ]:    8728704 :                 B(j, k) -= B(i, k)*t;
     168                 :            :         }
     169                 :            :     }
     170                 :            : 
     171                 :     363696 :     return det;
     172 [ +  - ][ +  - ]:       1872 : }

Generated by: LCOV version 1.11