determinant method

double determinant()

Implementation

double determinant() {
  var te = elements;

  double n11 = te[0], n12 = te[4], n13 = te[8], n14 = te[12];
  double n21 = te[1], n22 = te[5], n23 = te[9], n24 = te[13];
  double n31 = te[2], n32 = te[6], n33 = te[10], n34 = te[14];
  double n41 = te[3], n42 = te[7], n43 = te[11], n44 = te[15];

  //TODO: make this more efficient
  //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )

  double v1 = n41 *
      (n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34);

  double v2 = n42 *
      (n11 * n23 * n34 - n11 * n24 * n33 + n14 * n21 * n33 - n13 * n21 * n34 + n13 * n24 * n31 - n14 * n23 * n31);

  double v3 = n43 *
      (n11 * n24 * n32 - n11 * n22 * n34 - n14 * n21 * n32 + n12 * n21 * n34 + n14 * n22 * n31 - n12 * n24 * n31);

  double v4 = n44 *
      (-n13 * n22 * n31 - n11 * n23 * n32 + n11 * n22 * n33 + n13 * n21 * n32 - n12 * n21 * n33 + n12 * n23 * n31);

  final result = (v1 + v2 + v3 + v4);

  // print(" v1: ${v1} v2: ${v2} v3: ${v3} v4: ${v4}  result: ${result} ");

  return result;
}