# Matrix

An affine transform performs a linear mapping from 2D coordinates to other 2D coordinates that preserves the “straightness” and “parallelness” of lines.

Such a coordinate transformation can be represented by a 3 row by 3 column matrix with an implied last row of `[ 0 0 1 ]`. This matrix transforms source coordinates `(x, y)` into destination coordinates `(x',y')` by considering them to be a column vector and multiplying the coordinate vector by the matrix according to the following process:

    [ x ]   [ a  c  tx ] [ x ]   [ a * x + c * y + tx ]
    [ y ] = [ b  d  ty ] [ y ] = [ b * x + d * y + ty ]
    [ 1 ]   [ 0  0  1  ] [ 1 ]   [         1          ]

Note the locations of b and c.

This class is optimized for speed and minimizes calculations based on its knowledge of the underlying matrix (as opposed to say simply performing matrix multiplication).

## Constructors

`Matrix(a, c, b, d, tx, ty)`

Creates a 2D affine transform.

#### Parameters:

- `a:` `Number` — the a property of the transform
- `c:` `Number` — the c property of the transform
- `b:` `Number` — the b property of the transform
- `d:` `Number` — the d property of the transform
- `tx:` `Number` — the tx property of the transform
- `ty:` `Number` — the ty property of the transform

#### Returns:

- ``Matrix``

## Properties

`concatenate`
`preConcatenate`
`chain`
`a`

The value that affects the transformation along the x axis when scaling or rotating, positioned at (0, 0) in the transformation matrix.

#### Type:

- `Number`

`b`

The value that affects the transformation along the y axis when rotating or skewing, positioned at (1, 0) in the transformation matrix.

#### Type:

- `Number`

`c`

The value that affects the transformation along the x axis when rotating or skewing, positioned at (0, 1) in the transformation matrix.

#### Type:

- `Number`

`d`

The value that affects the transformation along the y axis when scaling or rotating, positioned at (1, 1) in the transformation matrix.

#### Type:

- `Number`

`tx`

The distance by which to translate along the x axis, positioned at (2, 0) in the transformation matrix.

#### Type:

- `Number`

`ty`

The distance by which to translate along the y axis, positioned at (2, 1) in the transformation matrix.

#### Type:

- `Number`

`values`

The transform values as an array, in the same sequence as they are passed to `initialize(a, b, c, d, tx, ty)`.

Read only.

#### Type:

- `Number`

`translation`

The translation of the matrix as a vector.

Read only.

#### Type:

- `Point`

`scaling`

The scaling values of the matrix, if it can be decomposed.

Read only.

#### Type:

- `Point`

#### See also:

- ``decompose`()`

`rotation`

The rotation angle of the matrix, if it can be decomposed.

Read only.

#### Type:

- `Number`

#### See also:

- ``decompose`()`

## Methods

`set(a, b, c, d, tx, ty)`

Sets this transform to the matrix specified by the 6 values.

#### Parameters:

- `a:` `Number` — the a property of the transform
- `b:` `Number` — the b property of the transform
- `c:` `Number` — the c property of the transform
- `d:` `Number` — the d property of the transform
- `tx:` `Number` — the tx property of the transform
- `ty:` `Number` — the ty property of the transform

#### Returns:

- ``Matrix`` — this affine transform

`clone()`

#### Returns:

- ``Matrix`` — a copy of this transform

`equals(matrix)`

Checks whether the two matrices describe the same transformation.

#### Parameters:

- `matrix:` `Matrix` — the matrix to compare this matrix to

#### Returns:

- ``Boolean`` — `true` if the matrices are equal, `false` otherwise

`toString()`

#### Returns:

- ``String`` — a string representation of this transform

`reset()`

Resets the matrix by setting its values to the ones of the identity matrix that results in no transformation.

`apply(recursively)`

Attempts to apply the matrix to the content of item that it belongs to, meaning its transformation is baked into the item’s content or children.

#### Parameters:

- `recursively:` `Boolean` — controls whether to apply transformations recursively on children

#### Returns:

- ``Boolean`` — `true` if the matrix was applied, `false` otherwise

`translate(point)`

Concatenates this transform with a translate transformation.

#### Parameters:

- `point:` `Point` — the vector to translate by

#### Returns:

- ``Matrix`` — this affine transform

`translate(dx, dy)`

Concatenates this transform with a translate transformation.

#### Parameters:

- `dx:` `Number` — the distance to translate in the x direction
- `dy:` `Number` — the distance to translate in the y direction

#### Returns:

- ``Matrix`` — this affine transform

`scale(scale[, center])`

Concatenates this transform with a scaling transformation.

#### Parameters:

- `scale:` `Number` — the scaling factor
- `center:` `Point` — the center for the scaling transformation — optional

#### Returns:

- ``Matrix`` — this affine transform

`scale(hor, ver[, center])`

Concatenates this transform with a scaling transformation.

#### Parameters:

- `hor:` `Number` — the horizontal scaling factor
- `ver:` `Number` — the vertical scaling factor
- `center:` `Point` — the center for the scaling transformation — optional

#### Returns:

- ``Matrix`` — this affine transform

`rotate(angle, center)`

Concatenates this transform with a rotation transformation around an anchor point.

#### Parameters:

- `angle:` `Number` — the angle of rotation measured in degrees
- `center:` `Point` — the anchor point to rotate around

#### Returns:

- ``Matrix`` — this affine transform

`rotate(angle, x, y)`

Concatenates this transform with a rotation transformation around an anchor point.

#### Parameters:

- `angle:` `Number` — the angle of rotation measured in degrees
- `x:` `Number` — the x coordinate of the anchor point
- `y:` `Number` — the y coordinate of the anchor point

#### Returns:

- ``Matrix`` — this affine transform

`shear(shear[, center])`

Concatenates this transform with a shear transformation.

#### Parameters:

- `shear:` `Point` — the shear factor in x and y direction
- `center:` `Point` — the center for the shear transformation — optional

#### Returns:

- ``Matrix`` — this affine transform

`shear(hor, ver[, center])`

Concatenates this transform with a shear transformation.

#### Parameters:

- `hor:` `Number` — the horizontal shear factor
- `ver:` `Number` — the vertical shear factor
- `center:` `Point` — the center for the shear transformation — optional

#### Returns:

- ``Matrix`` — this affine transform

`skew(skew[, center])`

Concatenates this transform with a skew transformation.

#### Parameters:

- `skew:` `Point` — the skew angles in x and y direction in degrees
- `center:` `Point` — the center for the skew transformation — optional

#### Returns:

- ``Matrix`` — this affine transform

`skew(hor, ver[, center])`

Concatenates this transform with a skew transformation.

#### Parameters:

- `hor:` `Number` — the horizontal skew angle in degrees
- `ver:` `Number` — the vertical skew angle in degrees
- `center:` `Point` — the center for the skew transformation — optional

#### Returns:

- ``Matrix`` — this affine transform

`append(matrix)`

Appends the specified matrix to this matrix. This is the equivalent of multiplying `(this matrix) * (specified matrix)`.

#### Parameters:

- `matrix:` `Matrix` — the matrix to append

#### Returns:

- ``Matrix`` — this matrix, modified

`prepend(matrix)`

Prepends the specified matrix to this matrix. This is the equivalent of multiplying `(specified matrix) * (this matrix)`.

#### Parameters:

- `matrix:` `Matrix` — the matrix to prepend

#### Returns:

- ``Matrix`` — this matrix, modified

`appended(matrix)`

Returns a new matrix as the result of appending the specified matrix to this matrix. This is the equivalent of multiplying `(this matrix) * (specified matrix)`.

#### Parameters:

- `matrix:` `Matrix` — the matrix to append

#### Returns:

- ``Matrix`` — the newly created matrix

`prepended(matrix)`

Returns a new matrix as the result of prepending the specified matrix to this matrix. This is the equivalent of multiplying `(specified matrix) s* (this matrix)`.

#### Parameters:

- `matrix:` `Matrix` — the matrix to prepend

#### Returns:

- ``Matrix`` — the newly created matrix

`invert()`

Inverts the matrix, causing it to perform the opposite transformation. If the matrix is not invertible (in which case `isSingular`() returns true), `null` is returned.

#### Returns:

- ``Matrix`` — this matrix, or `null`, if the matrix is singular.

`inverted()`

Creates a new matrix that is the inversion of this matrix, causing it to perform the opposite transformation. If the matrix is not invertible (in which case `isSingular`() returns true), `null` is returned.

#### Returns:

- ``Matrix`` — this matrix, or `null`, if the matrix is singular.

`isIdentity()`

#### Returns:

- ``Boolean`` — whether this transform is the identity transform

`isInvertible()`

Returns whether the transform is invertible. A transform is not invertible if the determinant is 0 or any value is non-finite or NaN.

#### Returns:

- ``Boolean`` — whether the transform is invertible

`isSingular()`

Checks whether the matrix is singular or not. Singular matrices cannot be inverted.

#### Returns:

- ``Boolean`` — whether the matrix is singular

`transform(point)`

Transforms a point and returns the result.

#### Parameters:

- `point:` `Point` — the point to be transformed

#### Returns:

- ``Point`` — the transformed point

`transform(src, dst, count)`

Transforms an array of coordinates by this matrix and stores the results into the destination array, which is also returned.

#### Parameters:

- `src:` `Number` — the array containing the source points as x, y value pairs
- `dst:` `Number` — the array into which to store the transformed point pairs
- `count:` `Number` — the number of points to transform

#### Returns:

- ``Number`` — the dst array, containing the transformed coordinates

`inverseTransform(point)`

Inverse transforms a point and returns the result.

#### Parameters:

- `point:` `Point` — the point to be transformed

`decompose()`

Attempts to decompose the affine transformation described by this matrix into `scaling`, `rotation` and `shearing`, and returns an object with these properties if it succeeded, `null` otherwise.

#### Returns:

- ``Object`` — the decomposed matrix, or `null` if decomposition is not possible

`applyToContext(ctx)`

Applies this matrix to the specified Canvas Context.

#### Parameters:

- `ctx:` `CanvasRenderingContext2D`