# Matrix Class

## Definition

Important

Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.

Encapsulates a 3-by-3 affine matrix that represents a geometric transform. This class cannot be inherited.

`public ref class Matrix sealed : MarshalByRefObject, IDisposable`

`public sealed class Matrix : MarshalByRefObject, IDisposable`

```
type Matrix = class
inherit MarshalByRefObject
interface IDisposable
```

```
Public NotInheritable Class Matrix
Inherits MarshalByRefObject
Implements IDisposable
```

- Inheritance

- Implements

## Remarks

In GDI+ you can store an affine transformation in a Matrix object. Because the third column of a matrix that represents an affine transformation is always (0, 0, 1), you specify only the six numbers in the first two columns when you construct a Matrix object. The statement `Matrix myMatrix = new Matrix(0, 1, -1, 0, 3, 4)`

constructs the matrix shown in the following figure.

Note

In .NET 6 and later versions, the System.Drawing.Common package, which includes this type, is only supported on Windows operating systems. Use of this type in cross-platform apps causes compile-time warnings and run-time exceptions. For more information, see System.Drawing.Common only supported on Windows.

### Composite Transformations

A composite transformation is a sequence of transformations, one followed by the other. Consider the matrices and transformations in the following list:

Matrix A | Rotate 90 degrees |

Matrix B | Scale by a factor of 2 in the x direction |

Matrix C | Translate 3 units in the y direction |

If we start with the point (2, 1) - represented by the matrix [2 1 1] - and multiply by A, then B, then C, the point (2, 1) will undergo the three transformations in the order listed.

[2 1 1]ABC = [-2 5 1]

Rather than store the three parts of the composite transformation in three separate matrices, you can multiply A, B, and C together to get a single 3×3 matrix that stores the entire composite transformation. Suppose ABC = D. Then a point multiplied by D gives the same result as a point multiplied by A, then B, then C.

[2 1 1]D = [-2 5 1]

The following illustration shows the matrices A, B, C, and D.

The fact that the matrix of a composite transformation can be formed by multiplying the individual transformation matrices means that any sequence of affine transformations can be stored in a single Matrix object.

Caution

The order of a composite transformation is important. In general, rotate, then scale, then translate is not the same as scale, then rotate, then translate. Similarly, the order of matrix multiplication is important. In general, ABC is not the same as BAC.

The Matrix class provides several methods for building a composite transformation: Multiply, Rotate, RotateAt, Scale, Shear, and Translate. The following example creates the matrix of a composite transformation that first rotates 30 degrees, then scales by a factor of 2 in the y direction, and then translates 5 units in the x direction:

```
Matrix myMatrix = new Matrix();
myMatrix.Rotate(30);
myMatrix.Scale(1, 2, MatrixOrder.Append);
myMatrix.Translate(5, 0, MatrixOrder.Append);
```

```
Dim myMatrix As New Matrix()
myMatrix.Rotate(30)
myMatrix.Scale(1, 2, MatrixOrder.Append)
myMatrix.Translate(5, 0, MatrixOrder.Append)
```

## Constructors

Matrix() |
Initializes a new instance of the Matrix class as the identity matrix. |

Matrix(Matrix3x2) |
Constructs a Matrix utilizing the specified |

Matrix(Rectangle, Point[]) |
Initializes a new instance of the Matrix class to the geometric transform defined by the specified rectangle and array of points. |

Matrix(RectangleF, PointF[]) |
Initializes a new instance of the Matrix class to the geometric transform defined by the specified rectangle and array of points. |

Matrix(Single, Single, Single, Single, Single, Single) |
Initializes a new instance of the Matrix class with the specified elements. |

## Properties

Elements |
Gets an array of floating-point values that represents the elements of this Matrix. |

IsIdentity |
Gets a value indicating whether this Matrix is the identity matrix. |

IsInvertible |
Gets a value indicating whether this Matrix is invertible. |

MatrixElements |
Gets or sets the elements for the matrix. |

OffsetX |
Gets the x translation value (the dx value, or the element in the third row and first column) of this Matrix. |

OffsetY |
Gets the y translation value (the dy value, or the element in the third row and second column) of this Matrix. |

## Methods

Clone() |
Creates an exact copy of this Matrix. |

CreateObjRef(Type) |
Creates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object. (Inherited from MarshalByRefObject) |

Dispose() |
Releases all resources used by this Matrix. |

Equals(Object) |
Tests whether the specified object is a Matrix and is identical to this Matrix. |

Finalize() |
Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection. |

GetHashCode() |
Returns a hash code. |

GetLifetimeService() |
Obsolete.
Retrieves the current lifetime service object that controls the lifetime policy for this instance. (Inherited from MarshalByRefObject) |

GetType() |
Gets the Type of the current instance. (Inherited from Object) |

InitializeLifetimeService() |
Obsolete.
Obtains a lifetime service object to control the lifetime policy for this instance. (Inherited from MarshalByRefObject) |

Invert() |
Inverts this Matrix, if it is invertible. |

MemberwiseClone() |
Creates a shallow copy of the current Object. (Inherited from Object) |

MemberwiseClone(Boolean) |
Creates a shallow copy of the current MarshalByRefObject object. (Inherited from MarshalByRefObject) |

Multiply(Matrix) |
Multiplies this Matrix by the matrix specified in the |

Multiply(Matrix, MatrixOrder) |
Multiplies this Matrix by the matrix specified in the |

Reset() |
Resets this Matrix to have the elements of the identity matrix. |

Rotate(Single) |
Prepend to this Matrix a clockwise rotation, around the origin and by the specified angle. |

Rotate(Single, MatrixOrder) |
Applies a clockwise rotation of an amount specified in the |

RotateAt(Single, PointF) |
Applies a clockwise rotation to this Matrix around the point specified in the |

RotateAt(Single, PointF, MatrixOrder) |
Applies a clockwise rotation about the specified point to this Matrix in the specified order. |

Scale(Single, Single) |
Applies the specified scale vector to this Matrix by prepending the scale vector. |

Scale(Single, Single, MatrixOrder) |
Applies the specified scale vector ( |

Shear(Single, Single) |
Applies the specified shear vector to this Matrix by prepending the shear transformation. |

Shear(Single, Single, MatrixOrder) |
Applies the specified shear vector to this Matrix in the specified order. |

ToString() |
Returns a string that represents the current object. (Inherited from Object) |

TransformPoints(Point[]) |
Applies the geometric transform represented by this Matrix to a specified array of points. |

TransformPoints(PointF[]) |
Applies the geometric transform represented by this Matrix to a specified array of points. |

TransformVectors(Point[]) |
Applies only the scale and rotate components of this Matrix to the specified array of points. |

TransformVectors(PointF[]) |
Multiplies each vector in an array by the matrix. The translation elements of this matrix (third row) are ignored. |

Translate(Single, Single) |
Applies the specified translation vector ( |

Translate(Single, Single, MatrixOrder) |
Applies the specified translation vector to this Matrix in the specified order. |

VectorTransformPoints(Point[]) |
Multiplies each vector in an array by the matrix. The translation elements of this matrix (third row) are ignored. |