Dart Documentationvector_mathMatrix3

Matrix3 class

3D Matrix. Values are stored in column major order.

class Matrix3 {
 final Float32List storage = new Float32List(9);

 /// Solve [A] * [x] = [b].
 static void solve2(Matrix3 A, Vector2 x, Vector2 b) {
   final double a11 = A.entry(0,0);
   final double a12 = A.entry(0,1);
   final double a21 = A.entry(1,0);
   final double a22 = A.entry(1,1);
   final double bx = b.x - A.storage[6];
   final double by = b.y - A.storage[7];
   double det = a11 * a22 - a12 * a21;

   if (det != 0.0){
     det = 1.0 / det;
   }

   x.x = det * (a22 * bx - a12 * by);
   x.y = det * (a11 * by - a21 * bx);
 }

 /// Solve [A] * [x] = [b].
 static void solve(Matrix3 A, Vector3 x, Vector3 b) {
   final double A0x = A.entry(0, 0);
   final double A0y = A.entry(1, 0);
   final double A0z = A.entry(2, 0);
   final double A1x = A.entry(0, 1);
   final double A1y = A.entry(1, 1);
   final double A1z = A.entry(2, 1);
   final double A2x = A.entry(0, 2);
   final double A2y = A.entry(1, 2);
   final double A2z = A.entry(2, 2);
   double rx, ry, rz;
   double det;

   // Column1 cross Column 2
   rx = A1y * A2z - A1z * A2y;
   ry = A1z * A2x - A1x * A2z;
   rz = A1x * A2y - A1y * A2x;

   // A.getColumn(0).dot(x)
   det = A0x * rx + A0y * ry + A0z * rz;
   if (det != 0.0){
     det = 1.0 / det;
   }

   // b dot [Column1 cross Column 2]
   final double x_ = det * (b.x * rx + b.y * ry + b.z * rz);

   // Column2 cross b
   rx = -(A2y * b.z - A2z * b.y);
   ry = -(A2z * b.x - A2x * b.z);
   rz = -(A2x * b.y - A2y * b.x);
   // Column0 dot -[Column2 cross b (Column3)]
   final double y_ = det * (A0x * rx + A0y * ry + A0z * rz);

   // b cross Column 1
   rx = -(b.y * A1z - b.z * A1y);
   ry = -(b.z * A1x - b.x * A1z);
   rz = -(b.x * A1y - b.y * A1x);
   // Column0 dot -[b cross Column 1]
   final double z_ = det * (A0x * rx + A0y * ry + A0z * rz);

   x.x = x_;
   x.y = y_;
   x.z = z_;
 }

 /// Return index in storage for [row], [col] value.
 int index(int row, int col) => (col * 3) + row;

 /// Value at [row], [col].
 double entry(int row, int col) => storage[index(row, col)];

 /// Set value at [row], [col] to be [v].
 setEntry(int row, int col, double v) { storage[index(row, col)] = v; }

 /// New matrix with specified values.
 Matrix3(double arg0, double arg1, double arg2,
         double arg3, double arg4, double arg5,
         double arg6, double arg7, double arg8) {
   setValues(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
 }

 /// Constructs a new [Matrix3] filled with zeros.
 Matrix3.zero();

 /// Identity matrix.
 Matrix3.identity() {
   setIdentity();
 }

 /// Copes values from [other].
 Matrix3.copy(Matrix3 other) {
   setFrom(other);
 }

 /// Constructs a new mat3 from columns.
 Matrix3.columns(Vector3 arg0, Vector3 arg1, Vector3 arg2) {
   setColumns(arg0, arg1, arg2);
 }

 /// Outer product of [u] and [v].
 Matrix3.outer(Vector3 u, Vector3 v) {
   storage[0] = u.storage[0] * v.storage[0];
   storage[1] = u.storage[0] * v.storage[1];
   storage[2] = u.storage[0] * v.storage[2];
   storage[3] = u.storage[1] * v.storage[0];
   storage[4] = u.storage[1] * v.storage[1];
   storage[5] = u.storage[1] * v.storage[2];
   storage[6] = u.storage[2] * v.storage[0];
   storage[7] = u.storage[2] * v.storage[1];
   storage[8] = u.storage[2] * v.storage[2];
 }

 //// Rotation of [radians_] around X axis.
 Matrix3.rotationX(double radians_) {
   setRotationX(radians_);
 }

 //// Rotation of [radians_] around Y axis.
 Matrix3.rotationY(double radians_) {
   setRotationY(radians_);
 }

 //// Rotation of [radians_] around Z axis.
 Matrix3.rotationZ(double radians_) {
   setRotationZ(radians_);
 }

 /// Sets the matrix with specified values.
 Matrix3 setValues(double arg0, double arg1, double arg2,
                   double arg3, double arg4, double arg5,
                   double arg6, double arg7, double arg8) {
   storage[8] = arg8;
   storage[7] = arg7;
   storage[6] = arg6;
   storage[5] = arg5;
   storage[4] = arg4;
   storage[3] = arg3;
   storage[2] = arg2;
   storage[1] = arg1;
   storage[0] = arg0;
   return this;
 }

 /// Sets the entire matrix to the column values.
 Matrix3 setColumns(Vector3 arg0, Vector3 arg1, Vector3 arg2) {
   storage[0] = arg0.storage[0];
   storage[1] = arg0.storage[1];
   storage[2] = arg0.storage[2];
   storage[3] = arg1.storage[0];
   storage[4] = arg1.storage[1];
   storage[5] = arg1.storage[2];
   storage[6] = arg2.storage[0];
   storage[7] = arg2.storage[1];
   storage[8] = arg2.storage[2];
   return this;
 }

 /// Sets the entire matrix to the matrix in [arg].
 Matrix3 setFrom(Matrix3 arg) {
   storage[8] = arg.storage[8];
   storage[7] = arg.storage[7];
   storage[6] = arg.storage[6];
   storage[5] = arg.storage[5];
   storage[4] = arg.storage[4];
   storage[3] = arg.storage[3];
   storage[2] = arg.storage[2];
   storage[1] = arg.storage[1];
   storage[0] = arg.storage[0];
   return this;
 }

 /// Set the diagonal of the matrix.
 Matrix3 splatDiagonal(double arg) {
   storage[0] = arg;
   storage[4] = arg;
   storage[8] = arg;
   return this;
 }

 /// Set the diagonal of the matrix.
 Matrix3 setDiagonal(Vector3 arg) {
   storage[0] = arg.storage[0];
   storage[4] = arg.storage[1];
   storage[8] = arg.storage[2];
   return this;
 }

 /// Sets the upper 2x2 of the matrix to be [arg].
 Matrix3 setUpper2x2(Matrix2 arg) {
   storage[0] = storage[0];
   storage[1] = storage[1];
   storage[3] = storage[2];
   storage[4] = storage[3];
   return this;
 }

 /// Returns a printable string
 String toString() {
   String s = '';
   s = '$s[0] ${getRow(0)}\n';
   s = '$s[1] ${getRow(1)}\n';
   s = '$s[2] ${getRow(2)}\n';
   return s;
 }
 /// Dimension of the matrix.
 int get dimension => 3;

 double operator[](int i) => storage[i];

 void operator[]=(int i, double v) { storage[i] = v; }

 /// Returns row 0
 Vector3 get row0 => getRow(0);

 /// Returns row 1
 Vector3 get row1 => getRow(1);

 /// Returns row 2
 Vector3 get row2 => getRow(2);

 /// Sets row 0 to [arg]
 set row0(Vector3 arg) => setRow(0, arg);

 /// Sets row 1 to [arg]
 set row1(Vector3 arg) => setRow(1, arg);

 /// Sets row 2 to [arg]
 set row2(Vector3 arg) => setRow(2, arg);

 /// Assigns the [row] of to [arg].
 void setRow(int row, Vector3 arg) {
   storage[index(row, 0)] = arg.storage[0];
   storage[index(row, 1)] = arg.storage[1];
   storage[index(row, 2)] = arg.storage[2];
 }

 /// Gets the [row] of the matrix
 Vector3 getRow(int row) {
   Vector3 r = new Vector3.zero();
   r.storage[0] = storage[index(row, 0)];
   r.storage[1] = storage[index(row, 1)];
   r.storage[2] = storage[index(row, 2)];
   return r;
 }

 /// Assigns the [column] of the matrix [arg]
 void setColumn(int column, Vector3 arg) {
   int entry = column * 3;
   storage[entry+2] = arg.storage[2];
   storage[entry+1] = arg.storage[1];
   storage[entry+0] = arg.storage[0];
 }

 /// Gets the [column] of the matrix
 Vector3 getColumn(int column) {
   Vector3 r = new Vector3.zero();
   int entry = column * 3;
   r.storage[2] = storage[entry+2];
   r.storage[1] = storage[entry+1];
   r.storage[0] = storage[entry+0];
   return r;
 }

 /// Clone of [this].
 Matrix3 clone() {
   return new Matrix3.copy(this);
 }

 /// Copy [this] into [arg].
 Matrix3 copyInto(Matrix3 arg) {
   arg.storage[0] = storage[0];
   arg.storage[1] = storage[1];
   arg.storage[2] = storage[2];
   arg.storage[3] = storage[3];
   arg.storage[4] = storage[4];
   arg.storage[5] = storage[5];
   arg.storage[6] = storage[6];
   arg.storage[7] = storage[7];
   arg.storage[8] = storage[8];
   return arg;
 }

 // TODO: Clean up functions below here.

 Matrix3 _mul_scale(double arg) {
   Matrix3 r = new Matrix3.zero();
   r.storage[8] = storage[8] * arg;
   r.storage[7] = storage[7] * arg;
   r.storage[6] = storage[6] * arg;
   r.storage[5] = storage[5] * arg;
   r.storage[4] = storage[4] * arg;
   r.storage[3] = storage[3] * arg;
   r.storage[2] = storage[2] * arg;
   r.storage[1] = storage[1] * arg;
   r.storage[0] = storage[0] * arg;
   return r;
 }

 Matrix3 _mul_matrix(Matrix3 arg) {
   var r = new Matrix3.zero();
   r.storage[0] = (storage[0] * arg.storage[0]) +
                  (storage[3] * arg.storage[1]) +
                  (storage[6] * arg.storage[2]);
   r.storage[3] = (storage[0] * arg.storage[3]) +
                  (storage[3] * arg.storage[4]) +
                  (storage[6] * arg.storage[5]);
   r.storage[6] = (storage[0] * arg.storage[6]) +
                  (storage[3] * arg.storage[7]) +
                  (storage[6] * arg.storage[8]);
   r.storage[1] = (storage[1] * arg.storage[0]) +
                  (storage[4] * arg.storage[1]) +
                  (storage[7] * arg.storage[2]);
   r.storage[4] = (storage[1] * arg.storage[3]) +
                  (storage[4] * arg.storage[4]) +
                  (storage[7] * arg.storage[5]);
   r.storage[7] = (storage[1] * arg.storage[6]) +
                  (storage[4] * arg.storage[7]) +
                  (storage[7] * arg.storage[8]);
   r.storage[2] = (storage[2] * arg.storage[0]) +
                  (storage[5] * arg.storage[1]) +
                  (storage[8] * arg.storage[2]);
   r.storage[5] = (storage[2] * arg.storage[3]) +
                  (storage[5] * arg.storage[4]) +
                  (storage[8] * arg.storage[5]);
   r.storage[8] = (storage[2] * arg.storage[6]) +
                  (storage[5] * arg.storage[7]) +
                  (storage[8] * arg.storage[8]);
   return r;
 }

 Vector3 _mul_vector(Vector3 arg) {
   Vector3 r = new Vector3.zero();
   r.storage[2] = (storage[2] * arg.storage[0]) +
                  (storage[5] * arg.storage[1]) +
                  (storage[8] * arg.storage[2]);
   r.storage[1] = (storage[1] * arg.storage[0]) +
                  (storage[4] * arg.storage[1]) +
                  (storage[7] * arg.storage[2]);
   r.storage[0] = (storage[0] * arg.storage[0]) +
                  (storage[3] * arg.storage[1]) +
                  (storage[6] * arg.storage[2]);
   return r;
 }
 /// Returns a new vector or matrix by multiplying [this] with [arg].
 dynamic operator*(dynamic arg) {
   if (arg is double) {
     return _mul_scale(arg);
   }
   if (arg is Vector3) {
     return _mul_vector(arg);
   }
   if (3 == arg.dimension) {
     return _mul_matrix(arg);
   }
   throw new ArgumentError(arg);
 }

 /// Returns new matrix after component wise [this] + [arg]
 Matrix3 operator+(Matrix3 arg) {
   Matrix3 r = new Matrix3.zero();
   r.storage[0] = storage[0] + arg.storage[0];
   r.storage[1] = storage[1] + arg.storage[1];
   r.storage[2] = storage[2] + arg.storage[2];
   r.storage[3] = storage[3] + arg.storage[3];
   r.storage[4] = storage[4] + arg.storage[4];
   r.storage[5] = storage[5] + arg.storage[5];
   r.storage[6] = storage[6] + arg.storage[6];
   r.storage[7] = storage[7] + arg.storage[7];
   r.storage[8] = storage[8] + arg.storage[8];
   return r;
 }

 /// Returns new matrix after component wise [this] - [arg]
 Matrix3 operator-(Matrix3 arg) {
   Matrix3 r = new Matrix3.zero();
   r.storage[0] = storage[0] - arg.storage[0];
   r.storage[1] = storage[1] - arg.storage[1];
   r.storage[2] = storage[2] - arg.storage[2];
   r.storage[3] = storage[3] - arg.storage[3];
   r.storage[4] = storage[4] - arg.storage[4];
   r.storage[5] = storage[5] - arg.storage[5];
   r.storage[6] = storage[6] - arg.storage[6];
   r.storage[7] = storage[7] - arg.storage[7];
   r.storage[8] = storage[8] - arg.storage[8];
   return r;
 }

 /// Returns new matrix -this
 Matrix3 operator-() {
   Matrix3 r = new Matrix3.zero();
   r[0] = -storage[0];
   r[1] = -storage[1];
   r[2] = -storage[2];
   return r;
 }

 /// Zeros [this].
 Matrix3 setZero() {
   storage[0] = 0.0;
   storage[1] = 0.0;
   storage[2] = 0.0;
   storage[3] = 0.0;
   storage[4] = 0.0;
   storage[5] = 0.0;
   storage[6] = 0.0;
   storage[7] = 0.0;
   storage[8] = 0.0;
   return this;
 }

 /// Makes [this] into the identity matrix.
 Matrix3 setIdentity() {
   storage[0] = 1.0;
   storage[1] = 0.0;
   storage[2] = 0.0;
   storage[3] = 0.0;
   storage[4] = 1.0;
   storage[5] = 0.0;
   storage[6] = 0.0;
   storage[7] = 0.0;
   storage[8] = 1.0;
   return this;
 }

 /// Returns the tranpose of this.
 Matrix3 transposed() {
   Matrix3 r = new Matrix3.zero();
   r.storage[0] = storage[0];
   r.storage[1] = storage[3];
   r.storage[2] = storage[6];
   r.storage[3] = storage[1];
   r.storage[4] = storage[4];
   r.storage[5] = storage[7];
   r.storage[6] = storage[2];
   r.storage[7] = storage[5];
   r.storage[8] = storage[8];
   return r;
 }

 Matrix3 transpose() {
   double temp;
   temp = storage[3];
   storage[3] = storage[1];
   storage[1] = temp;
   temp = storage[6];
   storage[6] = storage[2];
   storage[2] = temp;
   temp = storage[7];
   storage[7] = storage[5];
   storage[5] = temp;
   return this;
 }

 /// Returns the component wise absolute value of this.
 Matrix3 absolute() {
   Matrix3 r = new Matrix3.zero();
   r.storage[0] = storage[0].abs();
   r.storage[1] = storage[1].abs();
   r.storage[2] = storage[2].abs();
   r.storage[3] = storage[3].abs();
   r.storage[4] = storage[4].abs();
   r.storage[5] = storage[5].abs();
   r.storage[6] = storage[6].abs();
   r.storage[7] = storage[7].abs();
   r.storage[8] = storage[8].abs();
   return r;
 }

 /// Returns the determinant of this matrix.
 double determinant() {
   double x = storage[0] *
              ((storage[4] * storage[8]) - (storage[5] * storage[7]));
   double y = storage[1] *
              ((storage[3] * storage[8]) - (storage[5] * storage[6]));
   double z = storage[2] *
              ((storage[3] * storage[7]) - (storage[4] * storage[6]));
   return x - y + z;
 }

 /// Returns the dot product of row [i] and [v].
 double dotRow(int i, Vector3 v) {
   return storage[i] * v.storage[0]
        + storage[3+i] * v.storage[1]
        + storage[6+i] * v.storage[2];
 }

 /// Returns the dot product of column [j] and [v].
 double dotColumn(int j, Vector3 v) {
   return storage[j*3] * v.storage[0]
        + storage[j*3+1] * v.storage[1]
        + storage[j*3+2] * v.storage[2];
 }

 /// Returns the trace of the matrix. The trace of a matrix is the sum of
 /// the diagonal entries.
 double trace() {
   double t = 0.0;
   t += storage[0];
   t += storage[4];
   t += storage[8];
   return t;
 }

 /// Returns infinity norm of the matrix. Used for numerical analysis.
 double infinityNorm() {
   double norm = 0.0;
   {
     double row_norm = 0.0;
     row_norm += storage[0].abs();
     row_norm += storage[1].abs();
     row_norm += storage[2].abs();
     norm = row_norm > norm ? row_norm : norm;
   }
   {
     double row_norm = 0.0;
     row_norm += storage[3].abs();
     row_norm += storage[4].abs();
     row_norm += storage[5].abs();
     norm = row_norm > norm ? row_norm : norm;
   }
   {
     double row_norm = 0.0;
     row_norm += storage[6].abs();
     row_norm += storage[7].abs();
     row_norm += storage[8].abs();
     norm = row_norm > norm ? row_norm : norm;
   }
   return norm;
 }

 /// Returns relative error between [this] and [correct]
 double relativeError(Matrix3 correct) {
   Matrix3 diff = correct - this;
   double correct_norm = correct.infinityNorm();
   double diff_norm = diff.infinityNorm();
   return diff_norm/correct_norm;
 }

 /// Returns absolute error between [this] and [correct]
 double absoluteError(Matrix3 correct) {
   double this_norm = infinityNorm();
   double correct_norm = correct.infinityNorm();
   double diff_norm = (this_norm - correct_norm).abs();
   return diff_norm;
 }

 /// Invert the matrix. Returns the determinant.
 double invert() {
   double det = determinant();
   if (det == 0.0) {
     return 0.0;
   }
   double invDet = 1.0 / det;
   double ix = invDet * (storage[4] * storage[8] - storage[5] * storage[7]);
   double iy = invDet * (storage[2] * storage[7] - storage[1] * storage[8]);
   double iz = invDet * (storage[1] * storage[5] - storage[2] * storage[4]);
   double jx = invDet * (storage[5] * storage[6] - storage[3] * storage[8]);
   double jy = invDet * (storage[0] * storage[8] - storage[2] * storage[6]);
   double jz = invDet * (storage[2] * storage[3] - storage[0] * storage[5]);
   double kx = invDet * (storage[3] * storage[7] - storage[4] * storage[6]);
   double ky = invDet * (storage[1] * storage[6] - storage[0] * storage[7]);
   double kz = invDet * (storage[0] * storage[4] - storage[1] * storage[3]);
   storage[0] = ix;
   storage[1] = iy;
   storage[2] = iz;
   storage[3] = jx;
   storage[4] = jy;
   storage[5] = jz;
   storage[6] = kx;
   storage[7] = ky;
   storage[8] = kz;
   return det;
 }

 /// Set this matrix to be the inverse of [arg]
 double copyInverse(Matrix3 arg) {
   double det = arg.determinant();
   if (det == 0.0) {
     setFrom(arg);
     return 0.0;
   }
   double invDet = 1.0 / det;
   double ix = invDet * (arg.storage[4] * arg.storage[8]
                       - arg.storage[5] * arg.storage[7]);
   double iy = invDet * (arg.storage[2] * arg.storage[7]
                       - arg.storage[1] * arg.storage[8]);
   double iz = invDet * (arg.storage[1] * arg.storage[5]
                       - arg.storage[2] * arg.storage[4]);
   double jx = invDet * (arg.storage[5] * arg.storage[6]
                       - arg.storage[3] * arg.storage[8]);
   double jy = invDet * (arg.storage[0] * arg.storage[8]
                       - arg.storage[2] * arg.storage[6]);
   double jz = invDet * (arg.storage[2] * arg.storage[3]
                       - arg.storage[0] * arg.storage[5]);
   double kx = invDet * (arg.storage[3] * arg.storage[7]
                       - arg.storage[4] * arg.storage[6]);
   double ky = invDet * (arg.storage[1] * arg.storage[6]
                       - arg.storage[0] * arg.storage[7]);
   double kz = invDet * (arg.storage[0] * arg.storage[4]
                       - arg.storage[1] * arg.storage[3]);
   storage[0] = ix;
   storage[1] = iy;
   storage[2] = iz;
   storage[3] = jx;
   storage[4] = jy;
   storage[5] = jz;
   storage[6] = kx;
   storage[7] = ky;
   storage[8] = kz;
   return det;
 }

 /// Turns the matrix into a rotation of [radians] around X
 void setRotationX(double radians) {
   double c = Math.cos(radians);
   double s = Math.sin(radians);
   storage[0] = 1.0;
   storage[1] = 0.0;
   storage[2] = 0.0;
   storage[3] = 0.0;
   storage[4] = c;
   storage[5] = s;
   storage[6] = 0.0;
   storage[7] = -s;
   storage[8] = c;
 }

 /// Turns the matrix into a rotation of [radians] around Y
 void setRotationY(double radians) {
   double c = Math.cos(radians);
   double s = Math.sin(radians);
   storage[0] = c;
   storage[1] = 0.0;
   storage[2] = s;
   storage[3] = 0.0;
   storage[4] = 1.0;
   storage[5] = 0.0;
   storage[6] = -s;
   storage[7] = 0.0;
   storage[8] = c;
 }

 /// Turns the matrix into a rotation of [radians] around Z
 void setRotationZ(double radians) {
   double c = Math.cos(radians);
   double s = Math.sin(radians);
   storage[0] = c;
   storage[1] = s;
   storage[2] = 0.0;
   storage[3] = -s;
   storage[4] = c;
   storage[5] = 0.0;
   storage[6] = 0.0;
   storage[7] = 0.0;
   storage[8] = 1.0;
 }

 /// Converts into Adjugate matrix and scales by [scale]
 Matrix3 scaleAdjoint(double scale) {
   double m00 = storage[0];
   double m01 = storage[3];
   double m02 = storage[6];
   double m10 = storage[1];
   double m11 = storage[4];
   double m12 = storage[7];
   double m20 = storage[2];
   double m21 = storage[5];
   double m22 = storage[8];
   storage[0] = (m11 * m22 - m12 * m21) * scale;
   storage[1] = (m12 * m20 - m10 * m22) * scale;
   storage[2] = (m10 * m21 - m11 * m20) * scale;
   storage[3] = (m02 * m21 - m01 * m22) * scale;
   storage[4] = (m00 * m22 - m02 * m20) * scale;
   storage[5] = (m01 * m20 - m00 * m21) * scale;
   storage[6] = (m01 * m12 - m02 * m11) * scale;
   storage[7] = (m02 * m10 - m00 * m12) * scale;
   storage[8] = (m00 * m11 - m01 * m10) * scale;
   return this;
 }

 /// Rotates [arg] by the absolute rotation of [this]
 /// Returns [arg].
 /// Primarily used by AABB transformation code.
 Vector3 absoluteRotate(Vector3 arg) {
   double m00 = storage[0].abs();
   double m01 = storage[3].abs();
   double m02 = storage[6].abs();
   double m10 = storage[1].abs();
   double m11 = storage[4].abs();
   double m12 = storage[7].abs();
   double m20 = storage[2].abs();
   double m21 = storage[5].abs();
   double m22 = storage[8].abs();
   double x = arg.x;
   double y = arg.y;
   double z = arg.z;
   arg.x = x * m00 + y * m01 + z * m02;
   arg.y = x * m10 + y * m11 + z * m12;
   arg.z = x * m20 + y * m21 + z * m22;
   return arg;
 }

 /// Rotates [arg] by the absolute rotation of [this]
 /// Returns [arg].
 /// Primarily used by AABB transformation code.
 Vector2 absoluteRotate2(Vector2 arg) {
   double m00 = storage[0].abs();
   double m01 = storage[3].abs();
   double m10 = storage[1].abs();
   double m11 = storage[4].abs();
   double x = arg.x;
   double y = arg.y;
   arg.x = x * m00 + y * m01;
   arg.y = x * m10 + y * m11;
   return arg;
 }

 /// Transforms [arg] with [this].
 Vector2 transform2(Vector2 arg) {
   double x_ =  (storage[0] * arg.storage[0]) + (storage[3] * arg.storage[1]) + storage[6];
   double y_ =  (storage[1] * arg.storage[0]) + (storage[4] * arg.storage[1]) + storage[7];
   arg.x = x_;
   arg.y = y_;
   return arg;
 }

 Matrix3 add(Matrix3 o) {
   storage[0] = storage[0] + o.storage[0];
   storage[1] = storage[1] + o.storage[1];
   storage[2] = storage[2] + o.storage[2];
   storage[3] = storage[3] + o.storage[3];
   storage[4] = storage[4] + o.storage[4];
   storage[5] = storage[5] + o.storage[5];
   storage[6] = storage[6] + o.storage[6];
   storage[7] = storage[7] + o.storage[7];
   storage[8] = storage[8] + o.storage[8];
   return this;
 }

 Matrix3 sub(Matrix3 o) {
   storage[0] = storage[0] - o.storage[0];
   storage[1] = storage[1] - o.storage[1];
   storage[2] = storage[2] - o.storage[2];
   storage[3] = storage[3] - o.storage[3];
   storage[4] = storage[4] - o.storage[4];
   storage[5] = storage[5] - o.storage[5];
   storage[6] = storage[6] - o.storage[6];
   storage[7] = storage[7] - o.storage[7];
   storage[8] = storage[8] - o.storage[8];
   return this;
 }

 Matrix3 negate() {
   storage[0] = -storage[0];
   storage[1] = -storage[1];
   storage[2] = -storage[2];
   storage[3] = -storage[3];
   storage[4] = -storage[4];
   storage[5] = -storage[5];
   storage[6] = -storage[6];
   storage[7] = -storage[7];
   storage[8] = -storage[8];
   return this;
 }

 Matrix3 multiply(Matrix3 arg) {
   final double m00 = storage[0];
   final double m01 = storage[3];
   final double m02 = storage[6];
   final double m10 = storage[1];
   final double m11 = storage[4];
   final double m12 = storage[7];
   final double m20 = storage[2];
   final double m21 = storage[5];
   final double m22 = storage[8];
   final double n00 = arg.storage[0];
   final double n01 = arg.storage[3];
   final double n02 = arg.storage[6];
   final double n10 = arg.storage[1];
   final double n11 = arg.storage[4];
   final double n12 = arg.storage[7];
   final double n20 = arg.storage[2];
   final double n21 = arg.storage[5];
   final double n22 = arg.storage[8];
   storage[0] =  (m00 * n00) + (m01 * n10) + (m02 * n20);
   storage[3] =  (m00 * n01) + (m01 * n11) + (m02 * n21);
   storage[6] =  (m00 * n02) + (m01 * n12) + (m02 * n22);
   storage[1] =  (m10 * n00) + (m11 * n10) + (m12 * n20);
   storage[4] =  (m10 * n01) + (m11 * n11) + (m12 * n21);
   storage[7] =  (m10 * n02) + (m11 * n12) + (m12 * n22);
   storage[2] =  (m20 * n00) + (m21 * n10) + (m22 * n20);
   storage[5] =  (m20 * n01) + (m21 * n11) + (m22 * n21);
   storage[8] =  (m20 * n02) + (m21 * n12) + (m22 * n22);
   return this;
 }

 Matrix3 transposeMultiply(Matrix3 arg) {
   double m00 = storage[0];
   double m01 = storage[1];
   double m02 = storage[2];
   double m10 = storage[3];
   double m11 = storage[4];
   double m12 = storage[5];
   double m20 = storage[6];
   double m21 = storage[7];
   double m22 = storage[8];
   storage[0] = (m00 * arg.storage[0]) + (m01 * arg.storage[1]) +
                (m02 * arg.storage[2]);
   storage[3] = (m00 * arg.storage[3]) + (m01 * arg.storage[4]) +
                (m02 * arg.storage[5]);
   storage[6] = (m00 * arg.storage[6]) + (m01 * arg.storage[7]) +
                (m02 * arg.storage[8]);
   storage[1] = (m10 * arg.storage[0]) + (m11 * arg.storage[1]) +
                (m12 * arg.storage[2]);
   storage[4] = (m10 * arg.storage[3]) + (m11 * arg.storage[4]) +
                (m12 * arg.storage[5]);
   storage[7] = (m10 * arg.storage[6]) + (m11 * arg.storage[7]) +
                (m12 * arg.storage[8]);
   storage[2] = (m20 * arg.storage[0]) + (m21 * arg.storage[1]) +
                (m22 * arg.storage[2]);
   storage[5] = (m20 * arg.storage[3]) + (m21 * arg.storage[4]) +
                (m22 * arg.storage[5]);
   storage[8] = (m20 * arg.storage[6]) + (m21 * arg.storage[7]) +
                (m22 * arg.storage[8]);
   return this;
 }

 Matrix3 multiplyTranspose(Matrix3 arg) {
   double m00 = storage[0];
   double m01 = storage[3];
   double m02 = storage[6];
   double m10 = storage[1];
   double m11 = storage[4];
   double m12 = storage[7];
   double m20 = storage[2];
   double m21 = storage[5];
   double m22 = storage[8];
   storage[0] = (m00 * arg.storage[0]) + (m01 * arg.storage[3]) +
                (m02 * arg.storage[6]);
   storage[3] = (m00 * arg.storage[1]) + (m01 * arg.storage[4]) +
                (m02 * arg.storage[7]);
   storage[6] = (m00 * arg.storage[2]) + (m01 * arg.storage[5]) +
                (m02 * arg.storage[8]);
   storage[1] = (m10 * arg.storage[0]) + (m11 * arg.storage[3]) +
                (m12 * arg.storage[6]);
   storage[4] = (m10 * arg.storage[1]) + (m11 * arg.storage[4]) +
                (m12 * arg.storage[7]);
   storage[7] = (m10 * arg.storage[2]) + (m11 * arg.storage[5]) +
                (m12 * arg.storage[8]);
   storage[2] = (m20 * arg.storage[0]) + (m21 * arg.storage[3]) +
                (m22 * arg.storage[6]);
   storage[5] = (m20 * arg.storage[1]) + (m21 * arg.storage[4]) +
                (m22 * arg.storage[7]);
   storage[8] = (m20 * arg.storage[2]) + (m21 * arg.storage[5]) +
                (m22 * arg.storage[8]);
   return this;
 }

 Vector3 transform(Vector3 arg) {
   double x_ = (storage[0] * arg.storage[0]) +
               (storage[3] * arg.storage[1]) +
               (storage[6] * arg.storage[2]);
   double y_ = (storage[1] * arg.storage[0]) +
               (storage[4] * arg.storage[1]) +
               (storage[7] * arg.storage[2]);
   double z_ = (storage[2] * arg.storage[0]) +
               (storage[5] * arg.storage[1]) +
               (storage[8] * arg.storage[2]);
   arg.x = x_;
   arg.y = y_;
   arg.z = z_;
   return arg;
 }
 Vector3 transformed(Vector3 arg, [Vector3 out=null]) {
   if (out == null) {
     out = new Vector3.copy(arg);
   } else {
     out.setFrom(arg);
   }
   return transform(out);
 }

 /// Copies [this] into [array] starting at [offset].
 void copyIntoArray(List<num> array, [int offset=0]) {
   int i = offset;
   array[i+8] = storage[8];
   array[i+7] = storage[7];
   array[i+6] = storage[6];
   array[i+5] = storage[5];
   array[i+4] = storage[4];
   array[i+3] = storage[3];
   array[i+2] = storage[2];
   array[i+1] = storage[1];
   array[i+0] = storage[0];
 }

 /// Copies elements from [array] into [this] starting at [offset].
 void copyFromArray(List<double> array, [int offset=0]) {
   int i = offset;
   storage[8] = array[i+8];
   storage[7] = array[i+7];
   storage[6] = array[i+6];
   storage[5] = array[i+5];
   storage[4] = array[i+4];
   storage[3] = array[i+3];
   storage[2] = array[i+2];
   storage[1] = array[i+1];
   storage[0] = array[i+0];
 }

 Vector3 get right {
   double x = storage[0];
   double y = storage[1];
   double z = storage[2];
   return new Vector3(x, y, z);
 }

 Vector3 get up {
   double x = storage[3];
   double y = storage[4];
   double z = storage[5];
   return new Vector3(x, y, z);
 }

 Vector3 get forward {
   double x = storage[6];
   double y = storage[7];
   double z = storage[8];
   return new Vector3(x, y, z);
 }
}

Static Methods

void solve2(Matrix3 A, Vector2 x, Vector2 b) #

Solve A * x = b.

static void solve2(Matrix3 A, Vector2 x, Vector2 b) {
 final double a11 = A.entry(0,0);
 final double a12 = A.entry(0,1);
 final double a21 = A.entry(1,0);
 final double a22 = A.entry(1,1);
 final double bx = b.x - A.storage[6];
 final double by = b.y - A.storage[7];
 double det = a11 * a22 - a12 * a21;

 if (det != 0.0){
   det = 1.0 / det;
 }

 x.x = det * (a22 * bx - a12 * by);
 x.y = det * (a11 * by - a21 * bx);
}

void solve(Matrix3 A, Vector3 x, Vector3 b) #

Solve A * x = b.

static void solve(Matrix3 A, Vector3 x, Vector3 b) {
 final double A0x = A.entry(0, 0);
 final double A0y = A.entry(1, 0);
 final double A0z = A.entry(2, 0);
 final double A1x = A.entry(0, 1);
 final double A1y = A.entry(1, 1);
 final double A1z = A.entry(2, 1);
 final double A2x = A.entry(0, 2);
 final double A2y = A.entry(1, 2);
 final double A2z = A.entry(2, 2);
 double rx, ry, rz;
 double det;

 // Column1 cross Column 2
 rx = A1y * A2z - A1z * A2y;
 ry = A1z * A2x - A1x * A2z;
 rz = A1x * A2y - A1y * A2x;

 // A.getColumn(0).dot(x)
 det = A0x * rx + A0y * ry + A0z * rz;
 if (det != 0.0){
   det = 1.0 / det;
 }

 // b dot [Column1 cross Column 2]
 final double x_ = det * (b.x * rx + b.y * ry + b.z * rz);

 // Column2 cross b
 rx = -(A2y * b.z - A2z * b.y);
 ry = -(A2z * b.x - A2x * b.z);
 rz = -(A2x * b.y - A2y * b.x);
 // Column0 dot -[Column2 cross b (Column3)]
 final double y_ = det * (A0x * rx + A0y * ry + A0z * rz);

 // b cross Column 1
 rx = -(b.y * A1z - b.z * A1y);
 ry = -(b.z * A1x - b.x * A1z);
 rz = -(b.x * A1y - b.y * A1x);
 // Column0 dot -[b cross Column 1]
 final double z_ = det * (A0x * rx + A0y * ry + A0z * rz);

 x.x = x_;
 x.y = y_;
 x.z = z_;
}

Constructors

new Matrix3(double arg0, double arg1, double arg2, double arg3, double arg4, double arg5, double arg6, double arg7, double arg8) #

New matrix with specified values.

Matrix3(double arg0, double arg1, double arg2,
       double arg3, double arg4, double arg5,
       double arg6, double arg7, double arg8) {
 setValues(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
}

new Matrix3.columns(Vector3 arg0, Vector3 arg1, Vector3 arg2) #

Constructs a new mat3 from columns.

Matrix3.columns(Vector3 arg0, Vector3 arg1, Vector3 arg2) {
 setColumns(arg0, arg1, arg2);
}

new Matrix3.copy(Matrix3 other) #

Copes values from other.

Matrix3.copy(Matrix3 other) {
 setFrom(other);
}

new Matrix3.identity() #

Identity matrix.

Matrix3.identity() {
 setIdentity();
}

new Matrix3.outer(Vector3 u, Vector3 v) #

Outer product of u and v.

Matrix3.outer(Vector3 u, Vector3 v) {
 storage[0] = u.storage[0] * v.storage[0];
 storage[1] = u.storage[0] * v.storage[1];
 storage[2] = u.storage[0] * v.storage[2];
 storage[3] = u.storage[1] * v.storage[0];
 storage[4] = u.storage[1] * v.storage[1];
 storage[5] = u.storage[1] * v.storage[2];
 storage[6] = u.storage[2] * v.storage[0];
 storage[7] = u.storage[2] * v.storage[1];
 storage[8] = u.storage[2] * v.storage[2];
}

new Matrix3.rotationX(double radians_) #

/ Rotation of radians_ around X axis.

Matrix3.rotationX(double radians_) {
 setRotationX(radians_);
}

new Matrix3.rotationY(double radians_) #

/ Rotation of radians_ around Y axis.

Matrix3.rotationY(double radians_) {
 setRotationY(radians_);
}

new Matrix3.rotationZ(double radians_) #

/ Rotation of radians_ around Z axis.

Matrix3.rotationZ(double radians_) {
 setRotationZ(radians_);
}

new Matrix3.zero() #

Constructs a new Matrix3 filled with zeros.

Matrix3.zero();

Properties

final int dimension #

Dimension of the matrix.

int get dimension => 3;

final Vector3 forward #

Vector3 get forward {
 double x = storage[6];
 double y = storage[7];
 double z = storage[8];
 return new Vector3(x, y, z);
}
Vector3 get right {
 double x = storage[0];
 double y = storage[1];
 double z = storage[2];
 return new Vector3(x, y, z);
}

Vector3 get row0 #

Returns row 0

Vector3 get row0 => getRow(0);

dynamic set row0(Vector3 arg) #

Sets row 0 to arg

set row0(Vector3 arg) => setRow(0, arg);

Vector3 get row1 #

Returns row 1

Vector3 get row1 => getRow(1);

dynamic set row1(Vector3 arg) #

Sets row 1 to arg

set row1(Vector3 arg) => setRow(1, arg);

Vector3 get row2 #

Returns row 2

Vector3 get row2 => getRow(2);

dynamic set row2(Vector3 arg) #

Sets row 2 to arg

set row2(Vector3 arg) => setRow(2, arg);

final Float32List storage #

final Float32List storage = new Float32List(9)

final Vector3 up #

Vector3 get up {
 double x = storage[3];
 double y = storage[4];
 double z = storage[5];
 return new Vector3(x, y, z);
}

Operators

double operator [](int i) #

double operator[](int i) => storage[i];

void operator []=(int i, double v) #

void operator[]=(int i, double v) { storage[i] = v; }

Matrix3 operator +(Matrix3 arg) #

Returns new matrix after component wise this + arg

Matrix3 operator+(Matrix3 arg) {
 Matrix3 r = new Matrix3.zero();
 r.storage[0] = storage[0] + arg.storage[0];
 r.storage[1] = storage[1] + arg.storage[1];
 r.storage[2] = storage[2] + arg.storage[2];
 r.storage[3] = storage[3] + arg.storage[3];
 r.storage[4] = storage[4] + arg.storage[4];
 r.storage[5] = storage[5] + arg.storage[5];
 r.storage[6] = storage[6] + arg.storage[6];
 r.storage[7] = storage[7] + arg.storage[7];
 r.storage[8] = storage[8] + arg.storage[8];
 return r;
}

Matrix3 operator -() #

Returns new matrix -this

Matrix3 operator-() {
 Matrix3 r = new Matrix3.zero();
 r[0] = -storage[0];
 r[1] = -storage[1];
 r[2] = -storage[2];
 return r;
}

Matrix3 operator -(Matrix3 arg) #

Returns new matrix after component wise this - arg

Matrix3 operator-(Matrix3 arg) {
 Matrix3 r = new Matrix3.zero();
 r.storage[0] = storage[0] - arg.storage[0];
 r.storage[1] = storage[1] - arg.storage[1];
 r.storage[2] = storage[2] - arg.storage[2];
 r.storage[3] = storage[3] - arg.storage[3];
 r.storage[4] = storage[4] - arg.storage[4];
 r.storage[5] = storage[5] - arg.storage[5];
 r.storage[6] = storage[6] - arg.storage[6];
 r.storage[7] = storage[7] - arg.storage[7];
 r.storage[8] = storage[8] - arg.storage[8];
 return r;
}

dynamic operator *(arg) #

Returns a new vector or matrix by multiplying this with arg.

dynamic operator*(dynamic arg) {
 if (arg is double) {
   return _mul_scale(arg);
 }
 if (arg is Vector3) {
   return _mul_vector(arg);
 }
 if (3 == arg.dimension) {
   return _mul_matrix(arg);
 }
 throw new ArgumentError(arg);
}

Methods

Matrix3 absolute() #

Returns the component wise absolute value of this.

Matrix3 absolute() {
 Matrix3 r = new Matrix3.zero();
 r.storage[0] = storage[0].abs();
 r.storage[1] = storage[1].abs();
 r.storage[2] = storage[2].abs();
 r.storage[3] = storage[3].abs();
 r.storage[4] = storage[4].abs();
 r.storage[5] = storage[5].abs();
 r.storage[6] = storage[6].abs();
 r.storage[7] = storage[7].abs();
 r.storage[8] = storage[8].abs();
 return r;
}

double absoluteError(Matrix3 correct) #

Returns absolute error between this and correct

double absoluteError(Matrix3 correct) {
 double this_norm = infinityNorm();
 double correct_norm = correct.infinityNorm();
 double diff_norm = (this_norm - correct_norm).abs();
 return diff_norm;
}

Vector3 absoluteRotate(Vector3 arg) #

Rotates arg by the absolute rotation of this Returns arg. Primarily used by AABB transformation code.

Vector3 absoluteRotate(Vector3 arg) {
 double m00 = storage[0].abs();
 double m01 = storage[3].abs();
 double m02 = storage[6].abs();
 double m10 = storage[1].abs();
 double m11 = storage[4].abs();
 double m12 = storage[7].abs();
 double m20 = storage[2].abs();
 double m21 = storage[5].abs();
 double m22 = storage[8].abs();
 double x = arg.x;
 double y = arg.y;
 double z = arg.z;
 arg.x = x * m00 + y * m01 + z * m02;
 arg.y = x * m10 + y * m11 + z * m12;
 arg.z = x * m20 + y * m21 + z * m22;
 return arg;
}

Vector2 absoluteRotate2(Vector2 arg) #

Rotates arg by the absolute rotation of this Returns arg. Primarily used by AABB transformation code.

Vector2 absoluteRotate2(Vector2 arg) {
 double m00 = storage[0].abs();
 double m01 = storage[3].abs();
 double m10 = storage[1].abs();
 double m11 = storage[4].abs();
 double x = arg.x;
 double y = arg.y;
 arg.x = x * m00 + y * m01;
 arg.y = x * m10 + y * m11;
 return arg;
}

Matrix3 add(Matrix3 o) #

Matrix3 add(Matrix3 o) {
 storage[0] = storage[0] + o.storage[0];
 storage[1] = storage[1] + o.storage[1];
 storage[2] = storage[2] + o.storage[2];
 storage[3] = storage[3] + o.storage[3];
 storage[4] = storage[4] + o.storage[4];
 storage[5] = storage[5] + o.storage[5];
 storage[6] = storage[6] + o.storage[6];
 storage[7] = storage[7] + o.storage[7];
 storage[8] = storage[8] + o.storage[8];
 return this;
}

Matrix3 clone() #

Clone of this.

Matrix3 clone() {
 return new Matrix3.copy(this);
}

void copyFromArray(List<double> array, [int offset = 0]) #

Copies elements from array into this starting at offset.

void copyFromArray(List<double> array, [int offset=0]) {
 int i = offset;
 storage[8] = array[i+8];
 storage[7] = array[i+7];
 storage[6] = array[i+6];
 storage[5] = array[i+5];
 storage[4] = array[i+4];
 storage[3] = array[i+3];
 storage[2] = array[i+2];
 storage[1] = array[i+1];
 storage[0] = array[i+0];
}

Matrix3 copyInto(Matrix3 arg) #

Copy this into arg.

Matrix3 copyInto(Matrix3 arg) {
 arg.storage[0] = storage[0];
 arg.storage[1] = storage[1];
 arg.storage[2] = storage[2];
 arg.storage[3] = storage[3];
 arg.storage[4] = storage[4];
 arg.storage[5] = storage[5];
 arg.storage[6] = storage[6];
 arg.storage[7] = storage[7];
 arg.storage[8] = storage[8];
 return arg;
}

void copyIntoArray(List<num> array, [int offset = 0]) #

Copies this into array starting at offset.

void copyIntoArray(List<num> array, [int offset=0]) {
 int i = offset;
 array[i+8] = storage[8];
 array[i+7] = storage[7];
 array[i+6] = storage[6];
 array[i+5] = storage[5];
 array[i+4] = storage[4];
 array[i+3] = storage[3];
 array[i+2] = storage[2];
 array[i+1] = storage[1];
 array[i+0] = storage[0];
}

double copyInverse(Matrix3 arg) #

Set this matrix to be the inverse of arg

double copyInverse(Matrix3 arg) {
 double det = arg.determinant();
 if (det == 0.0) {
   setFrom(arg);
   return 0.0;
 }
 double invDet = 1.0 / det;
 double ix = invDet * (arg.storage[4] * arg.storage[8]
                     - arg.storage[5] * arg.storage[7]);
 double iy = invDet * (arg.storage[2] * arg.storage[7]
                     - arg.storage[1] * arg.storage[8]);
 double iz = invDet * (arg.storage[1] * arg.storage[5]
                     - arg.storage[2] * arg.storage[4]);
 double jx = invDet * (arg.storage[5] * arg.storage[6]
                     - arg.storage[3] * arg.storage[8]);
 double jy = invDet * (arg.storage[0] * arg.storage[8]
                     - arg.storage[2] * arg.storage[6]);
 double jz = invDet * (arg.storage[2] * arg.storage[3]
                     - arg.storage[0] * arg.storage[5]);
 double kx = invDet * (arg.storage[3] * arg.storage[7]
                     - arg.storage[4] * arg.storage[6]);
 double ky = invDet * (arg.storage[1] * arg.storage[6]
                     - arg.storage[0] * arg.storage[7]);
 double kz = invDet * (arg.storage[0] * arg.storage[4]
                     - arg.storage[1] * arg.storage[3]);
 storage[0] = ix;
 storage[1] = iy;
 storage[2] = iz;
 storage[3] = jx;
 storage[4] = jy;
 storage[5] = jz;
 storage[6] = kx;
 storage[7] = ky;
 storage[8] = kz;
 return det;
}

double determinant() #

Returns the determinant of this matrix.

double determinant() {
 double x = storage[0] *
            ((storage[4] * storage[8]) - (storage[5] * storage[7]));
 double y = storage[1] *
            ((storage[3] * storage[8]) - (storage[5] * storage[6]));
 double z = storage[2] *
            ((storage[3] * storage[7]) - (storage[4] * storage[6]));
 return x - y + z;
}

double dotColumn(int j, Vector3 v) #

Returns the dot product of column j and v.

double dotColumn(int j, Vector3 v) {
 return storage[j*3] * v.storage[0]
      + storage[j*3+1] * v.storage[1]
      + storage[j*3+2] * v.storage[2];
}

double dotRow(int i, Vector3 v) #

Returns the dot product of row i and v.

double dotRow(int i, Vector3 v) {
 return storage[i] * v.storage[0]
      + storage[3+i] * v.storage[1]
      + storage[6+i] * v.storage[2];
}

double entry(int row, int col) #

Value at row, col.

double entry(int row, int col) => storage[index(row, col)];

Vector3 getColumn(int column) #

Gets the column of the matrix

Vector3 getColumn(int column) {
 Vector3 r = new Vector3.zero();
 int entry = column * 3;
 r.storage[2] = storage[entry+2];
 r.storage[1] = storage[entry+1];
 r.storage[0] = storage[entry+0];
 return r;
}

Vector3 getRow(int row) #

Gets the row of the matrix

Vector3 getRow(int row) {
 Vector3 r = new Vector3.zero();
 r.storage[0] = storage[index(row, 0)];
 r.storage[1] = storage[index(row, 1)];
 r.storage[2] = storage[index(row, 2)];
 return r;
}

int index(int row, int col) #

Return index in storage for row, col value.

int index(int row, int col) => (col * 3) + row;

double infinityNorm() #

Returns infinity norm of the matrix. Used for numerical analysis.

double infinityNorm() {
 double norm = 0.0;
 {
   double row_norm = 0.0;
   row_norm += storage[0].abs();
   row_norm += storage[1].abs();
   row_norm += storage[2].abs();
   norm = row_norm > norm ? row_norm : norm;
 }
 {
   double row_norm = 0.0;
   row_norm += storage[3].abs();
   row_norm += storage[4].abs();
   row_norm += storage[5].abs();
   norm = row_norm > norm ? row_norm : norm;
 }
 {
   double row_norm = 0.0;
   row_norm += storage[6].abs();
   row_norm += storage[7].abs();
   row_norm += storage[8].abs();
   norm = row_norm > norm ? row_norm : norm;
 }
 return norm;
}

double invert() #

Invert the matrix. Returns the determinant.

double invert() {
 double det = determinant();
 if (det == 0.0) {
   return 0.0;
 }
 double invDet = 1.0 / det;
 double ix = invDet * (storage[4] * storage[8] - storage[5] * storage[7]);
 double iy = invDet * (storage[2] * storage[7] - storage[1] * storage[8]);
 double iz = invDet * (storage[1] * storage[5] - storage[2] * storage[4]);
 double jx = invDet * (storage[5] * storage[6] - storage[3] * storage[8]);
 double jy = invDet * (storage[0] * storage[8] - storage[2] * storage[6]);
 double jz = invDet * (storage[2] * storage[3] - storage[0] * storage[5]);
 double kx = invDet * (storage[3] * storage[7] - storage[4] * storage[6]);
 double ky = invDet * (storage[1] * storage[6] - storage[0] * storage[7]);
 double kz = invDet * (storage[0] * storage[4] - storage[1] * storage[3]);
 storage[0] = ix;
 storage[1] = iy;
 storage[2] = iz;
 storage[3] = jx;
 storage[4] = jy;
 storage[5] = jz;
 storage[6] = kx;
 storage[7] = ky;
 storage[8] = kz;
 return det;
}

Matrix3 multiply(Matrix3 arg) #

Matrix3 multiply(Matrix3 arg) {
 final double m00 = storage[0];
 final double m01 = storage[3];
 final double m02 = storage[6];
 final double m10 = storage[1];
 final double m11 = storage[4];
 final double m12 = storage[7];
 final double m20 = storage[2];
 final double m21 = storage[5];
 final double m22 = storage[8];
 final double n00 = arg.storage[0];
 final double n01 = arg.storage[3];
 final double n02 = arg.storage[6];
 final double n10 = arg.storage[1];
 final double n11 = arg.storage[4];
 final double n12 = arg.storage[7];
 final double n20 = arg.storage[2];
 final double n21 = arg.storage[5];
 final double n22 = arg.storage[8];
 storage[0] =  (m00 * n00) + (m01 * n10) + (m02 * n20);
 storage[3] =  (m00 * n01) + (m01 * n11) + (m02 * n21);
 storage[6] =  (m00 * n02) + (m01 * n12) + (m02 * n22);
 storage[1] =  (m10 * n00) + (m11 * n10) + (m12 * n20);
 storage[4] =  (m10 * n01) + (m11 * n11) + (m12 * n21);
 storage[7] =  (m10 * n02) + (m11 * n12) + (m12 * n22);
 storage[2] =  (m20 * n00) + (m21 * n10) + (m22 * n20);
 storage[5] =  (m20 * n01) + (m21 * n11) + (m22 * n21);
 storage[8] =  (m20 * n02) + (m21 * n12) + (m22 * n22);
 return this;
}

Matrix3 multiplyTranspose(Matrix3 arg) #

Matrix3 multiplyTranspose(Matrix3 arg) {
 double m00 = storage[0];
 double m01 = storage[3];
 double m02 = storage[6];
 double m10 = storage[1];
 double m11 = storage[4];
 double m12 = storage[7];
 double m20 = storage[2];
 double m21 = storage[5];
 double m22 = storage[8];
 storage[0] = (m00 * arg.storage[0]) + (m01 * arg.storage[3]) +
              (m02 * arg.storage[6]);
 storage[3] = (m00 * arg.storage[1]) + (m01 * arg.storage[4]) +
              (m02 * arg.storage[7]);
 storage[6] = (m00 * arg.storage[2]) + (m01 * arg.storage[5]) +
              (m02 * arg.storage[8]);
 storage[1] = (m10 * arg.storage[0]) + (m11 * arg.storage[3]) +
              (m12 * arg.storage[6]);
 storage[4] = (m10 * arg.storage[1]) + (m11 * arg.storage[4]) +
              (m12 * arg.storage[7]);
 storage[7] = (m10 * arg.storage[2]) + (m11 * arg.storage[5]) +
              (m12 * arg.storage[8]);
 storage[2] = (m20 * arg.storage[0]) + (m21 * arg.storage[3]) +
              (m22 * arg.storage[6]);
 storage[5] = (m20 * arg.storage[1]) + (m21 * arg.storage[4]) +
              (m22 * arg.storage[7]);
 storage[8] = (m20 * arg.storage[2]) + (m21 * arg.storage[5]) +
              (m22 * arg.storage[8]);
 return this;
}

Matrix3 negate() #

Matrix3 negate() {
 storage[0] = -storage[0];
 storage[1] = -storage[1];
 storage[2] = -storage[2];
 storage[3] = -storage[3];
 storage[4] = -storage[4];
 storage[5] = -storage[5];
 storage[6] = -storage[6];
 storage[7] = -storage[7];
 storage[8] = -storage[8];
 return this;
}

double relativeError(Matrix3 correct) #

Returns relative error between this and correct

double relativeError(Matrix3 correct) {
 Matrix3 diff = correct - this;
 double correct_norm = correct.infinityNorm();
 double diff_norm = diff.infinityNorm();
 return diff_norm/correct_norm;
}

Matrix3 scaleAdjoint(double scale) #

Converts into Adjugate matrix and scales by scale

Matrix3 scaleAdjoint(double scale) {
 double m00 = storage[0];
 double m01 = storage[3];
 double m02 = storage[6];
 double m10 = storage[1];
 double m11 = storage[4];
 double m12 = storage[7];
 double m20 = storage[2];
 double m21 = storage[5];
 double m22 = storage[8];
 storage[0] = (m11 * m22 - m12 * m21) * scale;
 storage[1] = (m12 * m20 - m10 * m22) * scale;
 storage[2] = (m10 * m21 - m11 * m20) * scale;
 storage[3] = (m02 * m21 - m01 * m22) * scale;
 storage[4] = (m00 * m22 - m02 * m20) * scale;
 storage[5] = (m01 * m20 - m00 * m21) * scale;
 storage[6] = (m01 * m12 - m02 * m11) * scale;
 storage[7] = (m02 * m10 - m00 * m12) * scale;
 storage[8] = (m00 * m11 - m01 * m10) * scale;
 return this;
}

void setColumn(int column, Vector3 arg) #

Assigns the column of the matrix arg

void setColumn(int column, Vector3 arg) {
 int entry = column * 3;
 storage[entry+2] = arg.storage[2];
 storage[entry+1] = arg.storage[1];
 storage[entry+0] = arg.storage[0];
}

Matrix3 setColumns(Vector3 arg0, Vector3 arg1, Vector3 arg2) #

Sets the entire matrix to the column values.

Matrix3 setColumns(Vector3 arg0, Vector3 arg1, Vector3 arg2) {
 storage[0] = arg0.storage[0];
 storage[1] = arg0.storage[1];
 storage[2] = arg0.storage[2];
 storage[3] = arg1.storage[0];
 storage[4] = arg1.storage[1];
 storage[5] = arg1.storage[2];
 storage[6] = arg2.storage[0];
 storage[7] = arg2.storage[1];
 storage[8] = arg2.storage[2];
 return this;
}

Matrix3 setDiagonal(Vector3 arg) #

Set the diagonal of the matrix.

Matrix3 setDiagonal(Vector3 arg) {
 storage[0] = arg.storage[0];
 storage[4] = arg.storage[1];
 storage[8] = arg.storage[2];
 return this;
}

dynamic setEntry(int row, int col, double v) #

Set value at row, col to be v.

setEntry(int row, int col, double v) { storage[index(row, col)] = v; }

Matrix3 setFrom(Matrix3 arg) #

Sets the entire matrix to the matrix in arg.

Matrix3 setFrom(Matrix3 arg) {
 storage[8] = arg.storage[8];
 storage[7] = arg.storage[7];
 storage[6] = arg.storage[6];
 storage[5] = arg.storage[5];
 storage[4] = arg.storage[4];
 storage[3] = arg.storage[3];
 storage[2] = arg.storage[2];
 storage[1] = arg.storage[1];
 storage[0] = arg.storage[0];
 return this;
}

Matrix3 setIdentity() #

Makes this into the identity matrix.

Matrix3 setIdentity() {
 storage[0] = 1.0;
 storage[1] = 0.0;
 storage[2] = 0.0;
 storage[3] = 0.0;
 storage[4] = 1.0;
 storage[5] = 0.0;
 storage[6] = 0.0;
 storage[7] = 0.0;
 storage[8] = 1.0;
 return this;
}

void setRotationX(double radians) #

Turns the matrix into a rotation of radians around X

void setRotationX(double radians) {
 double c = Math.cos(radians);
 double s = Math.sin(radians);
 storage[0] = 1.0;
 storage[1] = 0.0;
 storage[2] = 0.0;
 storage[3] = 0.0;
 storage[4] = c;
 storage[5] = s;
 storage[6] = 0.0;
 storage[7] = -s;
 storage[8] = c;
}

void setRotationY(double radians) #

Turns the matrix into a rotation of radians around Y

void setRotationY(double radians) {
 double c = Math.cos(radians);
 double s = Math.sin(radians);
 storage[0] = c;
 storage[1] = 0.0;
 storage[2] = s;
 storage[3] = 0.0;
 storage[4] = 1.0;
 storage[5] = 0.0;
 storage[6] = -s;
 storage[7] = 0.0;
 storage[8] = c;
}

void setRotationZ(double radians) #

Turns the matrix into a rotation of radians around Z

void setRotationZ(double radians) {
 double c = Math.cos(radians);
 double s = Math.sin(radians);
 storage[0] = c;
 storage[1] = s;
 storage[2] = 0.0;
 storage[3] = -s;
 storage[4] = c;
 storage[5] = 0.0;
 storage[6] = 0.0;
 storage[7] = 0.0;
 storage[8] = 1.0;
}

void setRow(int row, Vector3 arg) #

Assigns the row of to arg.

void setRow(int row, Vector3 arg) {
 storage[index(row, 0)] = arg.storage[0];
 storage[index(row, 1)] = arg.storage[1];
 storage[index(row, 2)] = arg.storage[2];
}

Matrix3 setUpper2x2(Matrix2 arg) #

Sets the upper 2x2 of the matrix to be arg.

Matrix3 setUpper2x2(Matrix2 arg) {
 storage[0] = storage[0];
 storage[1] = storage[1];
 storage[3] = storage[2];
 storage[4] = storage[3];
 return this;
}

Matrix3 setValues(double arg0, double arg1, double arg2, double arg3, double arg4, double arg5, double arg6, double arg7, double arg8) #

Sets the matrix with specified values.

Matrix3 setValues(double arg0, double arg1, double arg2,
                 double arg3, double arg4, double arg5,
                 double arg6, double arg7, double arg8) {
 storage[8] = arg8;
 storage[7] = arg7;
 storage[6] = arg6;
 storage[5] = arg5;
 storage[4] = arg4;
 storage[3] = arg3;
 storage[2] = arg2;
 storage[1] = arg1;
 storage[0] = arg0;
 return this;
}

Matrix3 setZero() #

Zeros this.

Matrix3 setZero() {
 storage[0] = 0.0;
 storage[1] = 0.0;
 storage[2] = 0.0;
 storage[3] = 0.0;
 storage[4] = 0.0;
 storage[5] = 0.0;
 storage[6] = 0.0;
 storage[7] = 0.0;
 storage[8] = 0.0;
 return this;
}

Matrix3 splatDiagonal(double arg) #

Set the diagonal of the matrix.

Matrix3 splatDiagonal(double arg) {
 storage[0] = arg;
 storage[4] = arg;
 storage[8] = arg;
 return this;
}

Matrix3 sub(Matrix3 o) #

Matrix3 sub(Matrix3 o) {
 storage[0] = storage[0] - o.storage[0];
 storage[1] = storage[1] - o.storage[1];
 storage[2] = storage[2] - o.storage[2];
 storage[3] = storage[3] - o.storage[3];
 storage[4] = storage[4] - o.storage[4];
 storage[5] = storage[5] - o.storage[5];
 storage[6] = storage[6] - o.storage[6];
 storage[7] = storage[7] - o.storage[7];
 storage[8] = storage[8] - o.storage[8];
 return this;
}

String toString() #

Returns a printable string

String toString() {
 String s = '';
 s = '$s[0] ${getRow(0)}\n';
 s = '$s[1] ${getRow(1)}\n';
 s = '$s[2] ${getRow(2)}\n';
 return s;
}

double trace() #

Returns the trace of the matrix. The trace of a matrix is the sum of the diagonal entries.

double trace() {
 double t = 0.0;
 t += storage[0];
 t += storage[4];
 t += storage[8];
 return t;
}

Vector3 transform(Vector3 arg) #

Vector3 transform(Vector3 arg) {
 double x_ = (storage[0] * arg.storage[0]) +
             (storage[3] * arg.storage[1]) +
             (storage[6] * arg.storage[2]);
 double y_ = (storage[1] * arg.storage[0]) +
             (storage[4] * arg.storage[1]) +
             (storage[7] * arg.storage[2]);
 double z_ = (storage[2] * arg.storage[0]) +
             (storage[5] * arg.storage[1]) +
             (storage[8] * arg.storage[2]);
 arg.x = x_;
 arg.y = y_;
 arg.z = z_;
 return arg;
}

Vector2 transform2(Vector2 arg) #

Transforms arg with this.

Vector2 transform2(Vector2 arg) {
 double x_ =  (storage[0] * arg.storage[0]) + (storage[3] * arg.storage[1]) + storage[6];
 double y_ =  (storage[1] * arg.storage[0]) + (storage[4] * arg.storage[1]) + storage[7];
 arg.x = x_;
 arg.y = y_;
 return arg;
}

Vector3 transformed(Vector3 arg, [Vector3 out = null]) #

Vector3 transformed(Vector3 arg, [Vector3 out=null]) {
 if (out == null) {
   out = new Vector3.copy(arg);
 } else {
   out.setFrom(arg);
 }
 return transform(out);
}

Matrix3 transpose() #

Matrix3 transpose() {
 double temp;
 temp = storage[3];
 storage[3] = storage[1];
 storage[1] = temp;
 temp = storage[6];
 storage[6] = storage[2];
 storage[2] = temp;
 temp = storage[7];
 storage[7] = storage[5];
 storage[5] = temp;
 return this;
}

Matrix3 transposed() #

Returns the tranpose of this.

Matrix3 transposed() {
 Matrix3 r = new Matrix3.zero();
 r.storage[0] = storage[0];
 r.storage[1] = storage[3];
 r.storage[2] = storage[6];
 r.storage[3] = storage[1];
 r.storage[4] = storage[4];
 r.storage[5] = storage[7];
 r.storage[6] = storage[2];
 r.storage[7] = storage[5];
 r.storage[8] = storage[8];
 return r;
}

Matrix3 transposeMultiply(Matrix3 arg) #

Matrix3 transposeMultiply(Matrix3 arg) {
 double m00 = storage[0];
 double m01 = storage[1];
 double m02 = storage[2];
 double m10 = storage[3];
 double m11 = storage[4];
 double m12 = storage[5];
 double m20 = storage[6];
 double m21 = storage[7];
 double m22 = storage[8];
 storage[0] = (m00 * arg.storage[0]) + (m01 * arg.storage[1]) +
              (m02 * arg.storage[2]);
 storage[3] = (m00 * arg.storage[3]) + (m01 * arg.storage[4]) +
              (m02 * arg.storage[5]);
 storage[6] = (m00 * arg.storage[6]) + (m01 * arg.storage[7]) +
              (m02 * arg.storage[8]);
 storage[1] = (m10 * arg.storage[0]) + (m11 * arg.storage[1]) +
              (m12 * arg.storage[2]);
 storage[4] = (m10 * arg.storage[3]) + (m11 * arg.storage[4]) +
              (m12 * arg.storage[5]);
 storage[7] = (m10 * arg.storage[6]) + (m11 * arg.storage[7]) +
              (m12 * arg.storage[8]);
 storage[2] = (m20 * arg.storage[0]) + (m21 * arg.storage[1]) +
              (m22 * arg.storage[2]);
 storage[5] = (m20 * arg.storage[3]) + (m21 * arg.storage[4]) +
              (m22 * arg.storage[5]);
 storage[8] = (m20 * arg.storage[6]) + (m21 * arg.storage[7]) +
              (m22 * arg.storage[8]);
 return this;
}