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_); }
Properties
final Vector3 forward #
Vector3 get forward { double x = storage[6]; double y = storage[7]; double z = storage[8]; return new Vector3(x, y, z); }
final Vector3 right #
Vector3 get right { double x = storage[0]; double y = storage[1]; double z = storage[2]; return new Vector3(x, y, z); }
final Float32List storage #
final Float32List storage = new Float32List(9)
Operators
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; }
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; }