/// <summary> /// Calculates the inverse of the specified matrix. /// </summary> /// <param name="matrix">The matrix whose inverse is to be calculated.</param> /// <param name="determinant">When the method completes, contains the determinant of the matrix.</param> public static Matrix3x3f Invert(Matrix3x3f matrix, out float determinant) { var cofactor00 = Determinant(new Matrix2x2f(matrix.M22, matrix.M32, matrix.M23, matrix.M33)); var cofactor10 = -Determinant(new Matrix2x2f(matrix.M21, matrix.M31, matrix.M23, matrix.M33)); var cofactor20 = Determinant(new Matrix2x2f(matrix.M21, matrix.M31, matrix.M22, matrix.M32)); var cofactor01 = -Determinant(new Matrix2x2f(matrix.M12, matrix.M32, matrix.M13, matrix.M33)); var cofactor11 = Determinant(new Matrix2x2f(matrix.M11, matrix.M31, matrix.M13, matrix.M33)); var cofactor21 = -Determinant(new Matrix2x2f(matrix.M11, matrix.M31, matrix.M12, matrix.M32)); var cofactor02 = Determinant(new Matrix2x2f(matrix.M12, matrix.M22, matrix.M13, matrix.M23)); var cofactor12 = -Determinant(new Matrix2x2f(matrix.M11, matrix.M21, matrix.M13, matrix.M23)); var cofactor22 = Determinant(new Matrix2x2f(matrix.M11, matrix.M21, matrix.M12, matrix.M22)); determinant = matrix.M11 * cofactor00 + matrix.M21 * cofactor10 + matrix.M31 * cofactor20; return(new Matrix3x3f(cofactor00, cofactor01, cofactor02, cofactor10, cofactor11, cofactor12, cofactor20, cofactor21, cofactor22) / determinant); }
/// <summary> /// Returns the specified submatrix of the given matrix. /// </summary> /// <param name="matrix">The matrix whose submatrix is to returned.</param> /// <param name="row">The row to be removed.</param> /// <param name="column">The column to be removed.</param> public static Matrix2x2f Submatrix(Matrix3x3f matrix, int row, int column) { if (row < 0 || row > 2) { throw new ArgumentOutOfRangeException("row", "Rows for Matrix3x3f run from 0 to 2, inclusive."); } if (column < 0 || column > 2) { throw new ArgumentOutOfRangeException("column", "Columns for Matrix3x3f run from 0 to 2, inclusive."); } if (row == 0 && column == 0) { return(new Matrix2x2f(matrix.M22, matrix.M32, matrix.M23, matrix.M33)); } else if (row == 0 && column == 1) { return(new Matrix2x2f(matrix.M21, matrix.M31, matrix.M23, matrix.M33)); } else if (row == 0 && column == 2) { return(new Matrix2x2f(matrix.M21, matrix.M31, matrix.M22, matrix.M32)); } else if (row == 1 && column == 0) { return(new Matrix2x2f(matrix.M12, matrix.M32, matrix.M13, matrix.M33)); } else if (row == 1 && column == 1) { return(new Matrix2x2f(matrix.M11, matrix.M31, matrix.M13, matrix.M33)); } else if (row == 1 && column == 2) { return(new Matrix2x2f(matrix.M11, matrix.M31, matrix.M12, matrix.M32)); } else if (row == 2 && column == 0) { return(new Matrix2x2f(matrix.M12, matrix.M22, matrix.M13, matrix.M23)); } else if (row == 2 && column == 1) { return(new Matrix2x2f(matrix.M11, matrix.M21, matrix.M13, matrix.M23)); } else { return(new Matrix2x2f(matrix.M11, matrix.M21, matrix.M12, matrix.M22)); } }
/// <summary> /// Returns a matrix where each element is rounded to the nearest integral value. /// </summary> /// <param name="value">A matrix.</param> /// <returns>The result of rounding value.</returns> public static Matrix3x3f Round(Matrix3x3f value) { return(new Matrix3x3f(Functions.Round(value.M11), Functions.Round(value.M21), Functions.Round(value.M31), Functions.Round(value.M12), Functions.Round(value.M22), Functions.Round(value.M32), Functions.Round(value.M13), Functions.Round(value.M23), Functions.Round(value.M33))); }
/// <summary> /// Returns a matrix where each element is the fractional part of the specified element. /// </summary> /// <param name="value">A matrix.</param> /// <returns>The fractional of value.</returns> public static Matrix3x3f Fractional(Matrix3x3f value) { return(new Matrix3x3f(Functions.Fractional(value.M11), Functions.Fractional(value.M21), Functions.Fractional(value.M31), Functions.Fractional(value.M12), Functions.Fractional(value.M22), Functions.Fractional(value.M32), Functions.Fractional(value.M13), Functions.Fractional(value.M23), Functions.Fractional(value.M33))); }
/// <summary> /// Returns a matrix where each element is the integral part of the specified element. /// </summary> /// <param name="value">A matrix.</param> /// <returns>The integral of value.</returns> public static Matrix3x3f Truncate(Matrix3x3f value) { return(new Matrix3x3f(Functions.Truncate(value.M11), Functions.Truncate(value.M21), Functions.Truncate(value.M31), Functions.Truncate(value.M12), Functions.Truncate(value.M22), Functions.Truncate(value.M32), Functions.Truncate(value.M13), Functions.Truncate(value.M23), Functions.Truncate(value.M33))); }
public static Matrix3x3f Add(Matrix3x3f left, Matrix3x3f right) { return(new Matrix3x3f(left.M11 + right.M11, left.M21 + right.M21, left.M31 + right.M31, left.M12 + right.M12, left.M22 + right.M22, left.M32 + right.M32, left.M13 + right.M13, left.M23 + right.M23, left.M33 + right.M33)); }
/// <summary> /// Calculates the transpose of the specified matrix. /// </summary> /// <param name="matrix">The matrix whose transpose is to be calculated.</param> /// <returns>The transpose of the specified matrix.</returns> public static Matrix3x3f Transpose(Matrix3x3f matrix) { return(new Matrix3x3f(matrix.M11, matrix.M12, matrix.M13, matrix.M21, matrix.M22, matrix.M23, matrix.M31, matrix.M32, matrix.M33)); }
/// <summary> /// Calculates the reciprocal of each element in the matrix. /// </summary> /// <param name="value">A matrix.</param> /// <returns>A matrix with the reciprocal of each of values elements.</returns> public static Matrix3x3f Reciprocal(Matrix3x3f value) { return(new Matrix3x3f(1 / value.M11, 1 / value.M21, 1 / value.M31, 1 / value.M12, 1 / value.M22, 1 / value.M32, 1 / value.M13, 1 / value.M23, 1 / value.M33)); }
/// <summary> /// Maps the elements of a matrix and returns the result. /// </summary> /// <param name="value">The matrix to map.</param> /// <param name="mapping">A mapping function to apply to each element.</param> /// <returns>The result of mapping each element of value.</returns> public static Matrix3x3f Map(Matrix3x3f value, Func <float, float> mapping) { return(new Matrix3x3f(mapping(value.M11), mapping(value.M21), mapping(value.M31), mapping(value.M12), mapping(value.M22), mapping(value.M32), mapping(value.M13), mapping(value.M23), mapping(value.M33))); }
/// <summary> /// Determines whether any elements of a matrix satisfy a condition. /// </summary> /// <param name="value">A vector.</param> /// <param name="predicate">A function to test each element for a condition.</param> /// <returns>true if any element of the matrix passes the test in the specified /// predicate; otherwise, false.</returns> public static bool Any(Matrix3x3f value, Predicate <float> predicate) { return(predicate(value.M11) || predicate(value.M21) || predicate(value.M31) || predicate(value.M12) || predicate(value.M22) || predicate(value.M32) || predicate(value.M13) || predicate(value.M23) || predicate(value.M33)); }
/// <summary> /// Determines whether any element of a matrix is non-zero. /// </summary> /// <param name="value">A vector.</param> /// <returns>true if any elements are non-zero; false otherwise.</returns> public static bool Any(Matrix3x3f value) { return(value.M11 != 0 || value.M21 != 0 || value.M31 != 0 || value.M12 != 0 || value.M22 != 0 || value.M32 != 0 || value.M13 != 0 || value.M23 != 0 || value.M33 != 0); }
public static Matrix3x3f Divide(Matrix3x3f matrix, float scalar) { return(new Matrix3x3f(matrix.M11 / scalar, matrix.M21 / scalar, matrix.M31 / scalar, matrix.M12 / scalar, matrix.M22 / scalar, matrix.M32 / scalar, matrix.M13 / scalar, matrix.M23 / scalar, matrix.M33 / scalar)); }
public static Matrix3x3f Multiply(Matrix3x3f matrix, float scalar) { return(new Matrix3x3f(matrix.M11 * scalar, matrix.M21 * scalar, matrix.M31 * scalar, matrix.M12 * scalar, matrix.M22 * scalar, matrix.M32 * scalar, matrix.M13 * scalar, matrix.M23 * scalar, matrix.M33 * scalar)); }
public static Matrix3x4f Multiply(Matrix3x3f left, Matrix3x4f right) { return(new Matrix3x4f(left.M11 * right.M11 + left.M12 * right.M21 + left.M13 * right.M31, left.M21 * right.M11 + left.M22 * right.M21 + left.M23 * right.M31, left.M31 * right.M11 + left.M32 * right.M21 + left.M33 * right.M31, left.M11 * right.M12 + left.M12 * right.M22 + left.M13 * right.M32, left.M21 * right.M12 + left.M22 * right.M22 + left.M23 * right.M32, left.M31 * right.M12 + left.M32 * right.M22 + left.M33 * right.M32, left.M11 * right.M13 + left.M12 * right.M23 + left.M13 * right.M33, left.M21 * right.M13 + left.M22 * right.M23 + left.M23 * right.M33, left.M31 * right.M13 + left.M32 * right.M23 + left.M33 * right.M33, left.M11 * right.M14 + left.M12 * right.M24 + left.M13 * right.M34, left.M21 * right.M14 + left.M22 * right.M24 + left.M23 * right.M34, left.M31 * right.M14 + left.M32 * right.M24 + left.M33 * right.M34)); }
public static Matrix3x3f Subtract(Matrix3x3f left, Matrix3x3f right) { return(new Matrix3x3f(left.M11 - right.M11, left.M21 - right.M21, left.M31 - right.M31, left.M12 - right.M12, left.M22 - right.M22, left.M32 - right.M32, left.M13 - right.M13, left.M23 - right.M23, left.M33 - right.M33)); }
/// <summary> /// Returns a matrix where each element is rounded to the nearest integral value. /// </summary> /// <param name="value">A matrix.</param> /// <param name="digits">The number of fractional digits in the return value.</param> /// <returns>The result of rounding value.</returns> public static Matrix3x3f Round(Matrix3x3f value, int digits) { return(new Matrix3x3f(Functions.Round(value.M11, digits), Functions.Round(value.M21, digits), Functions.Round(value.M31, digits), Functions.Round(value.M12, digits), Functions.Round(value.M22, digits), Functions.Round(value.M32, digits), Functions.Round(value.M13, digits), Functions.Round(value.M23, digits), Functions.Round(value.M33, digits))); }
/// <summary> /// Returns a matrix where each element is rounded to the nearest integral value. /// </summary> /// <param name="value">A matrix.</param> /// <param name="digits">The number of fractional digits in the return value.</param> /// <param name="mode">Specification for how to round value if it is midway between two other numbers.</param> /// <returns>The result of rounding value.</returns> public static Matrix3x3f Round(Matrix3x3f value, int digits, MidpointRounding mode) { return(new Matrix3x3f(Functions.Round(value.M11, digits, mode), Functions.Round(value.M21, digits, mode), Functions.Round(value.M31, digits, mode), Functions.Round(value.M12, digits, mode), Functions.Round(value.M22, digits, mode), Functions.Round(value.M32, digits, mode), Functions.Round(value.M13, digits, mode), Functions.Round(value.M23, digits, mode), Functions.Round(value.M33, digits, mode))); }
/// <summary> /// Multiplys the elements of two matrices and returns the result. /// </summary> /// <param name="left">The first matrix to modulate.</param> /// <param name="right">The second matrix to modulate.</param> /// <returns>The result of multiplying each element of left by the matching element in right.</returns> public static Matrix3x3f Modulate(Matrix3x3f left, Matrix3x3f right) { return(new Matrix3x3f(left.M11 * right.M11, left.M21 * right.M21, left.M31 * right.M31, left.M12 * right.M12, left.M22 * right.M22, left.M32 * right.M32, left.M13 * right.M13, left.M23 * right.M23, left.M33 * right.M33)); }
/// <summary> /// Returns a matrix that contains the highest value from each pair of elements. /// </summary> /// <param name="value1">The first matrix.</param> /// <param name="value2">The second matrix.</param> /// <returns>The highest of each element in left and the matching element in right.</returns> public static Matrix3x3f Max(Matrix3x3f value1, Matrix3x3f value2) { return(new Matrix3x3f(Functions.Max(value1.M11, value2.M11), Functions.Max(value1.M21, value2.M21), Functions.Max(value1.M31, value2.M31), Functions.Max(value1.M12, value2.M12), Functions.Max(value1.M22, value2.M22), Functions.Max(value1.M32, value2.M32), Functions.Max(value1.M13, value2.M13), Functions.Max(value1.M23, value2.M23), Functions.Max(value1.M33, value2.M33))); }
/// <summary> /// Constrains each element to a given range. /// </summary> /// <param name="value">A matrix to constrain.</param> /// <param name="min">The minimum values for each element.</param> /// <param name="max">The maximum values for each element.</param> /// <returns>A matrix with each element constrained to the given range.</returns> public static Matrix3x3f Clamp(Matrix3x3f value, Matrix3x3f min, Matrix3x3f max) { return(new Matrix3x3f(Functions.Clamp(value.M11, min.M11, max.M11), Functions.Clamp(value.M21, min.M21, max.M21), Functions.Clamp(value.M31, min.M31, max.M31), Functions.Clamp(value.M12, min.M12, max.M12), Functions.Clamp(value.M22, min.M22, max.M22), Functions.Clamp(value.M32, min.M32, max.M32), Functions.Clamp(value.M13, min.M13, max.M13), Functions.Clamp(value.M23, min.M23, max.M23), Functions.Clamp(value.M33, min.M33, max.M33))); }
/// <summary> /// Calculates the inverse of the specified matrix. /// </summary> /// <param name="matrix">The matrix whose inverse is to be calculated.</param> /// <param name="determinant">When the method completes, contains the determinant of the matrix.</param> public static Matrix3x3f Invert(Matrix3x3f matrix) { float determinant; return(Invert(matrix, out determinant)); }
/// <summary> /// Returns a matrix where each element is the smallest integral value that /// is greater than or equal to the specified element. /// </summary> /// <param name="value">A matrix.</param> /// <returns>The ceiling of value.</returns> public static Matrix3x3f Ceiling(Matrix3x3f value) { return(new Matrix3x3f(Functions.Ceiling(value.M11), Functions.Ceiling(value.M21), Functions.Ceiling(value.M31), Functions.Ceiling(value.M12), Functions.Ceiling(value.M22), Functions.Ceiling(value.M32), Functions.Ceiling(value.M13), Functions.Ceiling(value.M23), Functions.Ceiling(value.M33))); }
public static Matrix2x3f Multiply(Matrix2x3f left, Matrix3x3f right) { return(new Matrix2x3f(left.M11 * right.M11 + left.M12 * right.M21 + left.M13 * right.M31, left.M21 * right.M11 + left.M22 * right.M21 + left.M23 * right.M31, left.M11 * right.M12 + left.M12 * right.M22 + left.M13 * right.M32, left.M21 * right.M12 + left.M22 * right.M22 + left.M23 * right.M32, left.M11 * right.M13 + left.M12 * right.M23 + left.M13 * right.M33, left.M21 * right.M13 + left.M22 * right.M23 + left.M23 * right.M33)); }
public static Matrix3x3f Negate(Matrix3x3f value) { return(new Matrix3x3f(-value.M11, -value.M21, -value.M31, -value.M12, -value.M22, -value.M32, -value.M13, -value.M23, -value.M33)); }