Matrix2 class
2D Matrix. Values are stored in column major order.
class Matrix2 {
final Float32List storage = new Float32List(4);
/// Solve [A] * [x] = [b].
static void solve(Matrix2 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;
final double by = b.y;
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);
}
/// Return index in storage for [row], [col] value.
int index(int row, int col) => (col * 2) + 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.
Matrix2(double arg0, double arg1, double arg2, double arg3) {
setValues(arg0, arg1, arg2, arg3);
}
/// Zero matrix.
Matrix2.zero();
/// Identity matrix.
Matrix2.identity() {
setIdentity();
}
/// Copies values from [other].
Matrix2.copy(Matrix2 other) {
setFrom(other);
}
/// Matrix with values from column arguments.
Matrix2.columns(Vector2 arg0, Vector2 arg1) {
setColumns(arg0, arg1);
}
/// Outer product of [u] and [v].
Matrix2.outer(Vector2 u, Vector2 v) {
storage[0] = u.storage[0] * v.storage[0];
storage[1] = u.storage[0] * v.storage[1];
storage[2] = u.storage[1] * v.storage[0];
storage[3] = u.storage[1] * v.storage[1];
}
/// Rotation of [radians_].
Matrix2.rotation(double radians_) {
setRotation(radians_);
}
/// Sets the matrix with specified values.
Matrix2 setValues(double arg0, double arg1, double arg2, double arg3) {
storage[3] = arg3;
storage[2] = arg2;
storage[1] = arg1;
storage[0] = arg0;
return this;
}
/// Sets the entire matrix to the column values.
Matrix2 setColumns(Vector2 arg0, Vector2 arg1) {
storage[0] = arg0.storage[0];
storage[1] = arg0.storage[1];
storage[2] = arg1.storage[0];
storage[3] = arg1.storage[1];
return this;
}
/// Sets the entire matrix to the matrix in [arg].
Matrix2 setFrom(Matrix2 arg) {
storage[3] = arg.storage[3];
storage[2] = arg.storage[2];
storage[1] = arg.storage[1];
storage[0] = arg.storage[0];
return this;
}
/// Sets the diagonal to [arg].
Matrix2 splatDiagonal(double arg) {
storage[0] = arg;
storage[3] = arg;
return this;
}
/// Sets the diagonal of the matrix to be [arg].
Matrix2 setDiagonal(Vector2 arg) {
storage[0] = arg.storage[0];
storage[3] = arg.storage[1];
return this;
}
/// Returns a printable string
String toString() {
String s = '';
s = '$s[0] ${getRow(0)}\n';
s = '$s[1] ${getRow(1)}\n';
return s;
}
/// Dimension of the matrix.
int get dimension => 2;
double operator[](int i) => storage[i];
void operator[]=(int i, double v) { storage[i] = v; }
/// Returns row 0
Vector2 get row0 => getRow(0);
/// Returns row 1
Vector2 get row1 => getRow(1);
/// Sets row 0 to [arg]
set row0(Vector2 arg) => setRow(0, arg);
/// Sets row 1 to [arg]
set row1(Vector2 arg) => setRow(1, arg);
/// Sets [row] of the matrix to values in [arg]
void setRow(int row, Vector2 arg) {
storage[index(row, 0)] = arg.storage[0];
storage[index(row, 1)] = arg.storage[1];
}
/// Gets the [row] of the matrix
Vector2 getRow(int row) {
Vector2 r = new Vector2.zero();
r.storage[0] = storage[index(row, 0)];
r.storage[1] = storage[index(row, 1)];
return r;
}
/// Assigns the [column] of the matrix [arg]
void setColumn(int column, Vector2 arg) {
int entry = column * 2;
storage[entry+1] = arg.storage[1];
storage[entry+0] = arg.storage[0];
}
/// Gets the [column] of the matrix
Vector2 getColumn(int column) {
Vector2 r = new Vector2.zero();
int entry = column * 2;
r.storage[1] = storage[entry+1];
r.storage[0] = storage[entry+0];
return r;
}
Matrix2 clone() {
return new Matrix2.copy(this);
}
Matrix2 copyInto(Matrix2 arg) {
arg.storage[0] = storage[0];
arg.storage[1] = storage[1];
arg.storage[2] = storage[2];
arg.storage[3] = storage[3];
return arg;
}
// TODO: Clean up functions below here.
Matrix2 _mul_scale(double arg) {
Matrix2 r = new Matrix2.zero();
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;
}
Matrix2 _mul_matrix(Matrix2 arg) {
var r = new Matrix2.zero();
r.storage[0] = (storage[0] * arg.storage[0]) +
(storage[2] * arg.storage[1]);
r.storage[2] = (storage[0] * arg.storage[2]) +
(storage[2] * arg.storage[3]);
r.storage[1] = (storage[1] * arg.storage[0]) +
(storage[3] * arg.storage[1]);
r.storage[3] = (storage[1] * arg.storage[2]) +
(storage[3] * arg.storage[3]);
return r;
}
Vector2 _mul_vector(Vector2 arg) {
Vector2 r = new Vector2.zero();
r.storage[1] = (storage[1] * arg.storage[0]) +
(storage[3] * arg.storage[1]);
r.storage[0] = (storage[0] * arg.storage[0]) +
(storage[2] * arg.storage[1]);
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 Vector2) {
return _mul_vector(arg);
}
if (2 == arg.dimension) {
return _mul_matrix(arg);
}
throw new ArgumentError(arg);
}
/// Returns new matrix after component wise [this] + [arg]
Matrix2 operator+(Matrix2 arg) {
Matrix2 r = new Matrix2.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];
return r;
}
/// Returns new matrix after component wise [this] - [arg]
Matrix2 operator-(Matrix2 arg) {
Matrix2 r = new Matrix2.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];
return r;
}
/// Returns new matrix -this
Matrix2 operator-() {
Matrix2 r = new Matrix2.zero();
r[0] = -storage[0];
r[1] = -storage[1];
return r;
}
/// Zeros [this].
Matrix2 setZero() {
storage[0] = 0.0;
storage[1] = 0.0;
storage[2] = 0.0;
storage[3] = 0.0;
return this;
}
/// Makes [this] into the identity matrix.
Matrix2 setIdentity() {
storage[0] = 1.0;
storage[1] = 0.0;
storage[2] = 0.0;
storage[3] = 1.0;
return this;
}
/// Returns the tranpose of this.
Matrix2 transposed() {
Matrix2 r = new Matrix2.zero();
r.storage[0] = storage[0];
r.storage[1] = storage[2];
r.storage[2] = storage[1];
r.storage[3] = storage[3];
return r;
}
Matrix2 transpose() {
double temp;
temp = storage[2];
storage[2] = storage[1];
storage[1] = temp;
return this;
}
/// Returns the component wise absolute value of this.
Matrix2 absolute() {
Matrix2 r = new Matrix2.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();
return r;
}
/// Returns the determinant of this matrix.
double determinant() {
return (storage[0] * storage[3]) - (storage[1]*storage[2]);
}
/// Returns the dot product of row [i] and [v].
double dotRow(int i, Vector2 v) {
return storage[i] * v.storage[0] + storage[2 + i] * v.storage[1];
}
/// Returns the dot product of column [j] and [v].
double dotColumn(int j, Vector2 v) {
return storage[j*2] * v.storage[0] + storage[(j*2)+1] * v.storage[1];
}
/// Trace of the matrix.
double trace() {
double t = 0.0;
t += storage[0];
t += storage[3];
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();
norm = row_norm > norm ? row_norm : norm;
}
{
double row_norm = 0.0;
row_norm += storage[2].abs();
row_norm += storage[3].abs();
norm = row_norm > norm ? row_norm : norm;
}
return norm;
}
/// Returns relative error between [this] and [correct]
double relativeError(Matrix2 correct) {
Matrix2 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(Matrix2 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 temp = storage[0];
storage[0] = storage[3] * invDet;
storage[1] = -storage[1] * invDet;
storage[2] = -storage[2] * invDet;
storage[3] = temp * invDet;
return det;
}
/// Set this matrix to be the inverse of [arg]
double copyInverse(Matrix2 arg) {
double det = arg.determinant();
if (det == 0.0) {
setFrom(arg);
return 0.0;
}
double invDet = 1.0 / det;
storage[0] = arg.storage[3] * invDet;
storage[1] = -arg.storage[1] * invDet;
storage[2] = -arg.storage[2] * invDet;
storage[3] = arg.storage[0] * invDet;
return det;
}
/// Turns the matrix into a rotation of [radians]
void setRotation(double radians) {
double c = Math.cos(radians);
double s = Math.sin(radians);
storage[0] = c;
storage[1] = s;
storage[2] = -s;
storage[3] = c;
}
/// Converts into Adjugate matrix and scales by [scale]
Matrix2 scaleAdjoint(double scale) {
double temp = storage[0];
storage[0] = storage[3] * scale;
storage[2] = - storage[2] * scale;
storage[1] = - storage[1] * scale;
storage[3] = temp * scale;
return this;
}
Matrix2 add(Matrix2 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];
return this;
}
Matrix2 sub(Matrix2 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];
return this;
}
Matrix2 negate() {
storage[0] = -storage[0];
storage[1] = -storage[1];
storage[2] = -storage[2];
storage[3] = -storage[3];
return this;
}
Matrix2 multiply(Matrix2 arg) {
final double m00 = storage[0];
final double m01 = storage[2];
final double m10 = storage[1];
final double m11 = storage[3];
final double n00 = arg.storage[0];
final double n01 = arg.storage[2];
final double n10 = arg.storage[1];
final double n11 = arg.storage[3];
storage[0] = (m00 * n00) + (m01 * n10);
storage[2] = (m00 * n01) + (m01 * n11);
storage[1] = (m10 * n00) + (m11 * n10);
storage[3] = (m10 * n01) + (m11 * n11);
return this;
}
Matrix2 transposeMultiply(Matrix2 arg) {
double m00 = storage[0];
double m01 = storage[1];
double m10 = storage[2];
double m11 = storage[3];
storage[0] = (m00 * arg.storage[0]) + (m01 * arg.storage[1]);
storage[2] = (m00 * arg.storage[2]) + (m01 * arg.storage[3]);
storage[1] = (m10 * arg.storage[0]) + (m11 * arg.storage[1]);
storage[3] = (m10 * arg.storage[2]) + (m11 * arg.storage[3]);
return this;
}
Matrix2 multiplyTranspose(Matrix2 arg) {
double m00 = storage[0];
double m01 = storage[2];
double m10 = storage[1];
double m11 = storage[3];
storage[0] = (m00 * arg.storage[0]) + (m01 * arg.storage[2]);
storage[2] = (m00 * arg.storage[1]) + (m01 * arg.storage[3]);
storage[1] = (m10 * arg.storage[0]) + (m11 * arg.storage[2]);
storage[3] = (m10 * arg.storage[1]) + (m11 * arg.storage[3]);
return this;
}
Vector2 transform(Vector2 arg) {
double x_ = (storage[0] * arg.storage[0]) +
(storage[2] * arg.storage[1]);
double y_ = (storage[1] * arg.storage[0]) +
(storage[3] * arg.storage[1]);
arg.x = x_;
arg.y = y_;
return arg;
}
Vector2 transformed(Vector2 arg, [Vector2 out=null]) {
if (out == null) {
out = new Vector2.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+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[3] = array[i+3];
storage[2] = array[i+2];
storage[1] = array[i+1];
storage[0] = array[i+0];
}
}
Static Methods
void solve(Matrix2 A, Vector2 x, Vector2 b) #
Solve A * x = b.
static void solve(Matrix2 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;
final double by = b.y;
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);
}
Constructors
new Matrix2(double arg0, double arg1, double arg2, double arg3) #
New matrix with specified values.
Matrix2(double arg0, double arg1, double arg2, double arg3) {
setValues(arg0, arg1, arg2, arg3);
}
new Matrix2.columns(Vector2 arg0, Vector2 arg1) #
Matrix with values from column arguments.
Matrix2.columns(Vector2 arg0, Vector2 arg1) {
setColumns(arg0, arg1);
}
new Matrix2.copy(Matrix2 other) #
Copies values from other.
Matrix2.copy(Matrix2 other) {
setFrom(other);
}
new Matrix2.identity() #
Identity matrix.
Matrix2.identity() {
setIdentity();
}
new Matrix2.outer(Vector2 u, Vector2 v) #
Outer product of u and v.
Matrix2.outer(Vector2 u, Vector2 v) {
storage[0] = u.storage[0] * v.storage[0];
storage[1] = u.storage[0] * v.storage[1];
storage[2] = u.storage[1] * v.storage[0];
storage[3] = u.storage[1] * v.storage[1];
}
new Matrix2.rotation(double radians_) #
Rotation of radians_.
Matrix2.rotation(double radians_) {
setRotation(radians_);
}
new Matrix2.zero() #
Zero matrix.
Matrix2.zero();
Properties
final Float32List storage #
final Float32List storage = new Float32List(4)
Operators
Matrix2 operator +(Matrix2 arg) #
Returns new matrix after component wise this +
arg
Matrix2 operator+(Matrix2 arg) {
Matrix2 r = new Matrix2.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];
return r;
}
Matrix2 operator -() #
Returns new matrix -this
Matrix2 operator-() {
Matrix2 r = new Matrix2.zero();
r[0] = -storage[0];
r[1] = -storage[1];
return r;
}
Matrix2 operator -(Matrix2 arg) #
Returns new matrix after component wise this -
arg
Matrix2 operator-(Matrix2 arg) {
Matrix2 r = new Matrix2.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];
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 Vector2) {
return _mul_vector(arg);
}
if (2 == arg.dimension) {
return _mul_matrix(arg);
}
throw new ArgumentError(arg);
}
Methods
Matrix2 absolute() #
Returns the component wise absolute value of this.
Matrix2 absolute() {
Matrix2 r = new Matrix2.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();
return r;
}
double absoluteError(Matrix2 correct) #
Returns absolute error between this and
correct
double absoluteError(Matrix2 correct) {
double this_norm = infinityNorm();
double correct_norm = correct.infinityNorm();
double diff_norm = (this_norm - correct_norm).abs();
return diff_norm;
}
Matrix2 add(Matrix2 o) #
Matrix2 add(Matrix2 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];
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[3] = array[i+3];
storage[2] = array[i+2];
storage[1] = array[i+1];
storage[0] = array[i+0];
}
Matrix2 copyInto(Matrix2 arg) #
Matrix2 copyInto(Matrix2 arg) {
arg.storage[0] = storage[0];
arg.storage[1] = storage[1];
arg.storage[2] = storage[2];
arg.storage[3] = storage[3];
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+3] = storage[3];
array[i+2] = storage[2];
array[i+1] = storage[1];
array[i+0] = storage[0];
}
double copyInverse(Matrix2 arg) #
Set this matrix to be the inverse of arg
double copyInverse(Matrix2 arg) {
double det = arg.determinant();
if (det == 0.0) {
setFrom(arg);
return 0.0;
}
double invDet = 1.0 / det;
storage[0] = arg.storage[3] * invDet;
storage[1] = -arg.storage[1] * invDet;
storage[2] = -arg.storage[2] * invDet;
storage[3] = arg.storage[0] * invDet;
return det;
}
double determinant() #
Returns the determinant of this matrix.
double determinant() {
return (storage[0] * storage[3]) - (storage[1]*storage[2]);
}
double dotColumn(int j, Vector2 v) #
Returns the dot product of column j and v.
double dotColumn(int j, Vector2 v) {
return storage[j*2] * v.storage[0] + storage[(j*2)+1] * v.storage[1];
}
double dotRow(int i, Vector2 v) #
Returns the dot product of row i and v.
double dotRow(int i, Vector2 v) {
return storage[i] * v.storage[0] + storage[2 + i] * v.storage[1];
}
double entry(int row, int col) #
Value at row, col.
double entry(int row, int col) => storage[index(row, col)];
Vector2 getColumn(int column) #
Gets the column of the matrix
Vector2 getColumn(int column) {
Vector2 r = new Vector2.zero();
int entry = column * 2;
r.storage[1] = storage[entry+1];
r.storage[0] = storage[entry+0];
return r;
}
Vector2 getRow(int row) #
Gets the row of the matrix
Vector2 getRow(int row) {
Vector2 r = new Vector2.zero();
r.storage[0] = storage[index(row, 0)];
r.storage[1] = storage[index(row, 1)];
return r;
}
int index(int row, int col) #
Return index in storage for row, col value.
int index(int row, int col) => (col * 2) + 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();
norm = row_norm > norm ? row_norm : norm;
}
{
double row_norm = 0.0;
row_norm += storage[2].abs();
row_norm += storage[3].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 temp = storage[0];
storage[0] = storage[3] * invDet;
storage[1] = -storage[1] * invDet;
storage[2] = -storage[2] * invDet;
storage[3] = temp * invDet;
return det;
}
Matrix2 multiply(Matrix2 arg) #
Matrix2 multiply(Matrix2 arg) {
final double m00 = storage[0];
final double m01 = storage[2];
final double m10 = storage[1];
final double m11 = storage[3];
final double n00 = arg.storage[0];
final double n01 = arg.storage[2];
final double n10 = arg.storage[1];
final double n11 = arg.storage[3];
storage[0] = (m00 * n00) + (m01 * n10);
storage[2] = (m00 * n01) + (m01 * n11);
storage[1] = (m10 * n00) + (m11 * n10);
storage[3] = (m10 * n01) + (m11 * n11);
return this;
}
Matrix2 multiplyTranspose(Matrix2 arg) #
Matrix2 multiplyTranspose(Matrix2 arg) {
double m00 = storage[0];
double m01 = storage[2];
double m10 = storage[1];
double m11 = storage[3];
storage[0] = (m00 * arg.storage[0]) + (m01 * arg.storage[2]);
storage[2] = (m00 * arg.storage[1]) + (m01 * arg.storage[3]);
storage[1] = (m10 * arg.storage[0]) + (m11 * arg.storage[2]);
storage[3] = (m10 * arg.storage[1]) + (m11 * arg.storage[3]);
return this;
}
Matrix2 negate() #
Matrix2 negate() {
storage[0] = -storage[0];
storage[1] = -storage[1];
storage[2] = -storage[2];
storage[3] = -storage[3];
return this;
}
double relativeError(Matrix2 correct) #
Returns relative error between this and
correct
double relativeError(Matrix2 correct) {
Matrix2 diff = correct - this;
double correct_norm = correct.infinityNorm();
double diff_norm = diff.infinityNorm();
return diff_norm/correct_norm;
}
Matrix2 scaleAdjoint(double scale) #
Converts into Adjugate matrix and scales by scale
Matrix2 scaleAdjoint(double scale) {
double temp = storage[0];
storage[0] = storage[3] * scale;
storage[2] = - storage[2] * scale;
storage[1] = - storage[1] * scale;
storage[3] = temp * scale;
return this;
}
void setColumn(int column, Vector2 arg) #
Assigns the column of the matrix arg
void setColumn(int column, Vector2 arg) {
int entry = column * 2;
storage[entry+1] = arg.storage[1];
storage[entry+0] = arg.storage[0];
}
Matrix2 setColumns(Vector2 arg0, Vector2 arg1) #
Sets the entire matrix to the column values.
Matrix2 setColumns(Vector2 arg0, Vector2 arg1) {
storage[0] = arg0.storage[0];
storage[1] = arg0.storage[1];
storage[2] = arg1.storage[0];
storage[3] = arg1.storage[1];
return this;
}
Matrix2 setDiagonal(Vector2 arg) #
Sets the diagonal of the matrix to be arg.
Matrix2 setDiagonal(Vector2 arg) {
storage[0] = arg.storage[0];
storage[3] = arg.storage[1];
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; }
Matrix2 setFrom(Matrix2 arg) #
Sets the entire matrix to the matrix in arg.
Matrix2 setFrom(Matrix2 arg) {
storage[3] = arg.storage[3];
storage[2] = arg.storage[2];
storage[1] = arg.storage[1];
storage[0] = arg.storage[0];
return this;
}
Matrix2 setIdentity() #
Makes this into the identity matrix.
Matrix2 setIdentity() {
storage[0] = 1.0;
storage[1] = 0.0;
storage[2] = 0.0;
storage[3] = 1.0;
return this;
}
void setRotation(double radians) #
Turns the matrix into a rotation of radians
void setRotation(double radians) {
double c = Math.cos(radians);
double s = Math.sin(radians);
storage[0] = c;
storage[1] = s;
storage[2] = -s;
storage[3] = c;
}
void setRow(int row, Vector2 arg) #
Sets row of the matrix to values in arg
void setRow(int row, Vector2 arg) {
storage[index(row, 0)] = arg.storage[0];
storage[index(row, 1)] = arg.storage[1];
}
Matrix2 setValues(double arg0, double arg1, double arg2, double arg3) #
Sets the matrix with specified values.
Matrix2 setValues(double arg0, double arg1, double arg2, double arg3) {
storage[3] = arg3;
storage[2] = arg2;
storage[1] = arg1;
storage[0] = arg0;
return this;
}
Matrix2 setZero() #
Zeros this.
Matrix2 setZero() {
storage[0] = 0.0;
storage[1] = 0.0;
storage[2] = 0.0;
storage[3] = 0.0;
return this;
}
Matrix2 splatDiagonal(double arg) #
Sets the diagonal to arg.
Matrix2 splatDiagonal(double arg) {
storage[0] = arg;
storage[3] = arg;
return this;
}
Matrix2 sub(Matrix2 o) #
Matrix2 sub(Matrix2 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];
return this;
}
String toString() #
Returns a printable string
String toString() {
String s = '';
s = '$s[0] ${getRow(0)}\n';
s = '$s[1] ${getRow(1)}\n';
return s;
}
double trace() #
Trace of the matrix.
double trace() {
double t = 0.0;
t += storage[0];
t += storage[3];
return t;
}
Vector2 transform(Vector2 arg) #
Vector2 transform(Vector2 arg) {
double x_ = (storage[0] * arg.storage[0]) +
(storage[2] * arg.storage[1]);
double y_ = (storage[1] * arg.storage[0]) +
(storage[3] * arg.storage[1]);
arg.x = x_;
arg.y = y_;
return arg;
}
Vector2 transformed(Vector2 arg, [Vector2 out = null]) #
Vector2 transformed(Vector2 arg, [Vector2 out=null]) {
if (out == null) {
out = new Vector2.copy(arg);
} else {
out.setFrom(arg);
}
return transform(out);
}
Matrix2 transpose() #
Matrix2 transpose() {
double temp;
temp = storage[2];
storage[2] = storage[1];
storage[1] = temp;
return this;
}
Matrix2 transposed() #
Returns the tranpose of this.
Matrix2 transposed() {
Matrix2 r = new Matrix2.zero();
r.storage[0] = storage[0];
r.storage[1] = storage[2];
r.storage[2] = storage[1];
r.storage[3] = storage[3];
return r;
}
Matrix2 transposeMultiply(Matrix2 arg) #
Matrix2 transposeMultiply(Matrix2 arg) {
double m00 = storage[0];
double m01 = storage[1];
double m10 = storage[2];
double m11 = storage[3];
storage[0] = (m00 * arg.storage[0]) + (m01 * arg.storage[1]);
storage[2] = (m00 * arg.storage[2]) + (m01 * arg.storage[3]);
storage[1] = (m10 * arg.storage[0]) + (m11 * arg.storage[1]);
storage[3] = (m10 * arg.storage[2]) + (m11 * arg.storage[3]);
return this;
}