# AffineTransform

Artifact: [androidx.ink:ink-geometry](https://developer.android.com/jetpack/androidx/releases/ink) [View Source](https://cs.android.com/search?q=file:androidx/ink/geometry/AffineTransform.kt+class:androidx.ink.geometry.AffineTransform) Added in [1.0.0](https://developer.android.com/jetpack/androidx/releases/ink#1.0.0)

*** ** * ** ***


```
public abstract class AffineTransform
```

<br />

Known direct subclasses [ImmutableAffineTransform](https://developer.android.com/reference/androidx/ink/geometry/ImmutableAffineTransform), [MutableAffineTransform](https://developer.android.com/reference/androidx/ink/geometry/MutableAffineTransform)

|---|---|
| `https://developer.android.com/reference/androidx/ink/geometry/ImmutableAffineTransform` | An immutable affine transformation in the plane. |
| `https://developer.android.com/reference/androidx/ink/geometry/MutableAffineTransform` | A mutable affine transformation in the plane. |

*** ** * ** ***

An affine transformation in the plane. The transformation can be thought of as a 3x3 matrix:

```
⎡m00  m10  m20⎤
⎢m01  m11  m21⎥
⎣ 0    0    1 ⎦
```

Applying the transformation can be thought of as a matrix multiplication, with the to-be-transformed point represented as a column vector with an extra 1:

```
⎡m00  m10  m20⎤   ⎡x⎤   ⎡m00*x + m10*y + m20⎤
⎢m01  m11  m21⎥ * ⎢y⎥ = ⎢m01*x + m11*y + m21⎥
⎣ 0    0    1 ⎦   ⎣1⎦   ⎣         1         ⎦
```

Transformations are composed via multiplication. Multiplication is not commutative (i.e. A*B != B*A), and the left-hand transformation is composed "after" the right hand transformation. E.g., if you have:

```
val rotate = ImmutableAffineTransform.rotateDegrees(45f)
val translate = ImmutableAffineTransform.translate(Vec(10, 0))
```

then `rotate * translate` first translates 10 units in the positive x-direction, then rotates 45° about the origin.

`https://developer.android.com/reference/androidx/ink/geometry/ImmutableAffineTransform` and `https://developer.android.com/reference/androidx/ink/geometry/MutableAffineTransform` are the two concrete implementations of this.

## Summary

| ### Public fields |
|---|---|
| `static final @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/ImmutableAffineTransform` | `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#IDENTITY()` Constant representing an identity transformation, which maps a point to itself, i.e. it leaves it unchanged. |

| ### Public methods |
|---|---|
| `final @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/ImmutableParallelogram` | `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Box)(@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/Box box)` Returns an `https://developer.android.com/reference/androidx/ink/geometry/ImmutableParallelogram` containing the result of applying the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` to `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Box)`. |
| `final @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/ImmutableParallelogram` | `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Parallelogram)(@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/Parallelogram parallelogram)` Returns an `https://developer.android.com/reference/androidx/ink/geometry/ImmutableParallelogram` containing the result of applying the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` to `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Parallelogram)`. |
| `final @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/ImmutableVec` | `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Vec)(@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/Vec point)` Returns an `https://developer.android.com/reference/androidx/ink/geometry/ImmutableVec` containing the result of applying the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` to `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Vec)`. |
| `final @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/ImmutableSegment` | `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Segment)(@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/Segment segment)` Returns an `https://developer.android.com/reference/androidx/ink/geometry/ImmutableSegment` containing the result of applying the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` to `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Segment)`. |
| `final @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/ImmutableTriangle` | `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Triangle)(@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/Triangle triangle)` Returns an `https://developer.android.com/reference/androidx/ink/geometry/ImmutableTriangle` containing the result of applying the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` to `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Triangle)`. |
| `final @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/MutableParallelogram` | `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Box,androidx.ink.geometry.MutableParallelogram)( @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/Box box, @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/MutableParallelogram outParallelogram )` Apply the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` to the `https://developer.android.com/reference/androidx/ink/geometry/Box` and store the result in the `https://developer.android.com/reference/androidx/ink/geometry/MutableParallelogram`. |
| `final @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/MutableParallelogram` | `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Parallelogram,androidx.ink.geometry.MutableParallelogram)( @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/Parallelogram parallelogram, @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/MutableParallelogram outParallelogram )` Apply the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` to the `https://developer.android.com/reference/androidx/ink/geometry/Parallelogram` and store the result in the `https://developer.android.com/reference/androidx/ink/geometry/MutableParallelogram`. |
| `final @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/MutableVec` | `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Vec,androidx.ink.geometry.MutableVec)(@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/Vec point, @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/MutableVec outVec)` Apply the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` to the `https://developer.android.com/reference/androidx/ink/geometry/Vec` and store the result in the `https://developer.android.com/reference/androidx/ink/geometry/MutableVec`. |
| `final @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/MutableSegment` | `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Segment,androidx.ink.geometry.MutableSegment)( @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/Segment segment, @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/MutableSegment outSegment )` Apply the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` to the `https://developer.android.com/reference/androidx/ink/geometry/Segment` and store the result in the `https://developer.android.com/reference/androidx/ink/geometry/MutableSegment`. |
| `final @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/MutableTriangle` | `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Triangle,androidx.ink.geometry.MutableTriangle)( @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/Triangle triangle, @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/MutableTriangle outTriangle )` Apply the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` to the `https://developer.android.com/reference/androidx/ink/geometry/Triangle` and store the result in the `https://developer.android.com/reference/androidx/ink/geometry/MutableTriangle`. |
| `final @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/ImmutableAffineTransform` | `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#computeInverse()()` Returns the inverse of the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform`. |
| `final @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/MutableAffineTransform` | `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#computeInverse(androidx.ink.geometry.MutableAffineTransform)(@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/MutableAffineTransform outAffineTransform)` Populates `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#computeInverse(androidx.ink.geometry.MutableAffineTransform)` with the inverse of this `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform`. |
| `abstract float` | `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#getM00()()` Value in the first row, first column of the transform matrix. |
| `abstract float` | `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#getM01()()` Value in the second row, first column of the transform matrix. |
| `abstract float` | `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#getM10()()` Value in the first row, second column of the transform matrix. |
| `abstract float` | `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#getM11()()` Value in the second row, second column of the transform matrix. |
| `abstract float` | `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#getM20()()` Value in the first row, third column of the transform matrix. |
| `abstract float` | `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#getM21()()` Value in the second row, third column of the transform matrix. |
| `final @https://developer.android.com/reference/androidx/annotation/Size(min = 6) @https://developer.android.com/reference/androidx/annotation/NonNull float[]` | `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#getValues(kotlin.FloatArray)(@https://developer.android.com/reference/androidx/annotation/Size(min = 6) @https://developer.android.com/reference/androidx/annotation/NonNull float[] outArray)` Populates the first 6 elements of `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#getValues(kotlin.FloatArray)` with the values of this transform, starting with the top left corner of the matrix and proceeding in row-major order. |
| `final boolean` | `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#isAlmostEqual(androidx.ink.geometry.AffineTransform,kotlin.Float)( @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/AffineTransform other, @https://developer.android.com/reference/androidx/annotation/FloatRange(from = 0.0) float tolerance )` Compares this `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` with `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#isAlmostEqual(androidx.ink.geometry.AffineTransform,kotlin.Float)`, and returns true if each component of the transform matrix is within `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#isAlmostEqual(androidx.ink.geometry.AffineTransform,kotlin.Float)` of the corresponding component of `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#isAlmostEqual(androidx.ink.geometry.AffineTransform,kotlin.Float)`. |
| `static final void` | `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#multiply(androidx.ink.geometry.AffineTransform,androidx.ink.geometry.AffineTransform,androidx.ink.geometry.MutableAffineTransform)( @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/AffineTransform lhs, @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/AffineTransform rhs, @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/MutableAffineTransform output )` Multiplies the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform.Companion#multiply(androidx.ink.geometry.AffineTransform,androidx.ink.geometry.AffineTransform,androidx.ink.geometry.MutableAffineTransform)` transform by the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform.Companion#multiply(androidx.ink.geometry.AffineTransform,androidx.ink.geometry.AffineTransform,androidx.ink.geometry.MutableAffineTransform)` transform as matrices, and stores the result in `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform.Companion#multiply(androidx.ink.geometry.AffineTransform,androidx.ink.geometry.AffineTransform,androidx.ink.geometry.MutableAffineTransform)`, which may be the same `https://developer.android.com/reference/androidx/ink/geometry/MutableAffineTransform` instance as `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform.Companion#multiply(androidx.ink.geometry.AffineTransform,androidx.ink.geometry.AffineTransform,androidx.ink.geometry.MutableAffineTransform)` or `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform.Companion#multiply(androidx.ink.geometry.AffineTransform,androidx.ink.geometry.AffineTransform,androidx.ink.geometry.MutableAffineTransform)` to avoid additional allocations. |
| `abstract @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/ImmutableAffineTransform` | `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#toImmutable()()` Returns an immutable equivalent of this object. |

| ### Extension functions |
|---|---|
| `final void` | `https://developer.android.com/reference/androidx/ink/geometry/AndroidGraphicsConverter.https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#(androidx.ink.geometry.AffineTransform).populateMatrix(android.graphics.Matrix)( @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/AffineTransform receiver, @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/android/graphics/Matrix.html out )` Writes the values from this `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` to `https://developer.android.com/reference/androidx/ink/geometry/package-summary#(androidx.ink.geometry.AffineTransform).populateMatrix(android.graphics.Matrix)`. |
| `final @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/android/graphics/Matrix.html` | `https://developer.android.com/reference/androidx/ink/geometry/AndroidGraphicsConverter.https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#(androidx.ink.geometry.AffineTransform).toMatrix()(@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/ink/geometry/AffineTransform receiver)` Constructs a `https://developer.android.com/reference/android/graphics/Matrix.html` with the values from the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform`. |

## Public fields

### IDENTITY

```
public static final @NonNull ImmutableAffineTransform IDENTITY
```

Constant representing an identity transformation, which maps a point to itself, i.e. it leaves it unchanged.

## Public methods

### applyTransform

Added in [1.0.0](https://developer.android.com/jetpack/androidx/releases/ink#1.0.0)

```
public final @NonNull ImmutableParallelogram applyTransform(@NonNull Box box)
```

Returns an `https://developer.android.com/reference/androidx/ink/geometry/ImmutableParallelogram` containing the result of applying the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` to `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Box)`.

Note that applying an `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` to a `https://developer.android.com/reference/androidx/ink/geometry/Box` results in a `https://developer.android.com/reference/androidx/ink/geometry/Parallelogram`. If you need a `https://developer.android.com/reference/androidx/ink/geometry/Box`, use `https://developer.android.com/reference/androidx/ink/geometry/Parallelogram#computeBoundingBox()` to get the minimum bounding box of the result.

Performance-sensitive code should use the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Box)` overload that takes a pre-allocated `https://developer.android.com/reference/androidx/ink/geometry/MutableParallelogram`, so that instance can be reused across multiple calls.

### applyTransform

Added in [1.0.0](https://developer.android.com/jetpack/androidx/releases/ink#1.0.0)

```
public final @NonNull ImmutableParallelogram applyTransform(@NonNull Parallelogram parallelogram)
```

Returns an `https://developer.android.com/reference/androidx/ink/geometry/ImmutableParallelogram` containing the result of applying the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` to `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Parallelogram)`.

Performance-sensitive code should use the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Parallelogram)` overload that takes a pre-allocated `https://developer.android.com/reference/androidx/ink/geometry/MutableParallelogram`, so that instance can be reused across multiple calls.

### applyTransform

Added in [1.0.0](https://developer.android.com/jetpack/androidx/releases/ink#1.0.0)

```
public final @NonNull ImmutableVec applyTransform(@NonNull Vec point)
```

Returns an `https://developer.android.com/reference/androidx/ink/geometry/ImmutableVec` containing the result of applying the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` to `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Vec)`.

Note that this treats `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Vec)` as a location, not an offset. If you want to transform an offset, you must also transform the origin and subtract that from the result, e.g.:

```
val result = MutableVec()
Vec.subtract(
  transform.applyTransform(vec),
  transform.applyTransform(Vec.ORIGIN),
  result
)
```

Performance-sensitive code should use the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Vec)` overload that takes a pre-allocated `https://developer.android.com/reference/androidx/ink/geometry/MutableVec`, so that instance can be reused across multiple calls.

### applyTransform

Added in [1.0.0](https://developer.android.com/jetpack/androidx/releases/ink#1.0.0)

```
public final @NonNull ImmutableSegment applyTransform(@NonNull Segment segment)
```

Returns an `https://developer.android.com/reference/androidx/ink/geometry/ImmutableSegment` containing the result of applying the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` to `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Segment)`.

Performance-sensitive code should use the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Segment)` overload that takes a pre-allocated `https://developer.android.com/reference/androidx/ink/geometry/MutableSegment`, so that instance can be reused across multiple calls.

### applyTransform

Added in [1.0.0](https://developer.android.com/jetpack/androidx/releases/ink#1.0.0)

```
public final @NonNull ImmutableTriangle applyTransform(@NonNull Triangle triangle)
```

Returns an `https://developer.android.com/reference/androidx/ink/geometry/ImmutableTriangle` containing the result of applying the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` to `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Triangle)`.

Performance-sensitive code should use the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Triangle)` overload that takes a pre-allocated `https://developer.android.com/reference/androidx/ink/geometry/MutableTriangle`, so that instance can be reused across multiple calls.

### applyTransform

Added in [1.0.0](https://developer.android.com/jetpack/androidx/releases/ink#1.0.0)

```
public final @NonNull MutableParallelogram applyTransform(
    @NonNull Box box,
    @NonNull MutableParallelogram outParallelogram
)
```

Apply the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` to the `https://developer.android.com/reference/androidx/ink/geometry/Box` and store the result in the `https://developer.android.com/reference/androidx/ink/geometry/MutableParallelogram`. This is the only Apply function where the input cannot also be the output, as applying an Affine Transform to a Box makes a Parallelogram.

### applyTransform

Added in [1.0.0](https://developer.android.com/jetpack/androidx/releases/ink#1.0.0)

```
public final @NonNull MutableParallelogram applyTransform(
    @NonNull Parallelogram parallelogram,
    @NonNull MutableParallelogram outParallelogram
)
```

Apply the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` to the `https://developer.android.com/reference/androidx/ink/geometry/Parallelogram` and store the result in the `https://developer.android.com/reference/androidx/ink/geometry/MutableParallelogram`. The same `https://developer.android.com/reference/androidx/ink/geometry/MutableParallelogram` can be used as both the input and output to avoid additional allocations.

### applyTransform

Added in [1.0.0](https://developer.android.com/jetpack/androidx/releases/ink#1.0.0)

```
public final @NonNull MutableVec applyTransform(@NonNull Vec point, @NonNull MutableVec outVec)
```

Apply the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` to the `https://developer.android.com/reference/androidx/ink/geometry/Vec` and store the result in the `https://developer.android.com/reference/androidx/ink/geometry/MutableVec`. The same `https://developer.android.com/reference/androidx/ink/geometry/MutableVec` can be used as both the input and output to avoid additional allocations. Returns `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Vec,androidx.ink.geometry.MutableVec)`.

Note that this treats `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Vec,androidx.ink.geometry.MutableVec)` as a location, not an offset. If you want to transform an offset, you must also transform the origin and subtract that from the result, e.g.:

```
Vec.subtract(
  transform.applyTransform(vec, scratchPoint1),
  transform.applyTransform(Vec.ORIGIN, scratchPoint2),
  result
)
```

### applyTransform

Added in [1.0.0](https://developer.android.com/jetpack/androidx/releases/ink#1.0.0)

```
public final @NonNull MutableSegment applyTransform(
    @NonNull Segment segment,
    @NonNull MutableSegment outSegment
)
```

Apply the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` to the `https://developer.android.com/reference/androidx/ink/geometry/Segment` and store the result in the `https://developer.android.com/reference/androidx/ink/geometry/MutableSegment`. The same `https://developer.android.com/reference/androidx/ink/geometry/MutableSegment` can be used as both the input and output to avoid additional allocations. Returns `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Segment,androidx.ink.geometry.MutableSegment)`.

### applyTransform

Added in [1.0.0](https://developer.android.com/jetpack/androidx/releases/ink#1.0.0)

```
public final @NonNull MutableTriangle applyTransform(
    @NonNull Triangle triangle,
    @NonNull MutableTriangle outTriangle
)
```

Apply the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` to the `https://developer.android.com/reference/androidx/ink/geometry/Triangle` and store the result in the `https://developer.android.com/reference/androidx/ink/geometry/MutableTriangle`. The same `https://developer.android.com/reference/androidx/ink/geometry/MutableTriangle` can be used as both the input and output to avoid additional allocations. Returns `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Triangle,androidx.ink.geometry.MutableTriangle)`.

### computeInverse

Added in [1.0.0](https://developer.android.com/jetpack/androidx/releases/ink#1.0.0)

```
public final @NonNull ImmutableAffineTransform computeInverse()
```

Returns the inverse of the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform`.

Performance-sensitive code should use the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#computeInverse()` overload that takes a pre-allocated `https://developer.android.com/reference/androidx/ink/geometry/MutableAffineTransform`, so that instance can be reused across multiple calls.

| Throws |
|---|---|
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-illegal-argument-exception/index.html` | if the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` cannot be inverted. |

### computeInverse

Added in [1.0.0](https://developer.android.com/jetpack/androidx/releases/ink#1.0.0)

```
public final @NonNull MutableAffineTransform computeInverse(@NonNull MutableAffineTransform outAffineTransform)
```

Populates `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#computeInverse(androidx.ink.geometry.MutableAffineTransform)` with the inverse of this `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform`. The same `https://developer.android.com/reference/androidx/ink/geometry/MutableAffineTransform` instance can be used as the output to avoid additional allocations. Returns `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#computeInverse(androidx.ink.geometry.MutableAffineTransform)`.

| Throws |
|---|---|
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-illegal-argument-exception/index.html` | if the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` cannot be inverted. . |

### getM00

Added in [1.1.0-alpha11](https://developer.android.com/jetpack/androidx/releases/ink#1.1.0-alpha11)

```
public abstract float getM00()
```

Value in the first row, first column of the transform matrix.

### getM01

Added in [1.1.0-alpha11](https://developer.android.com/jetpack/androidx/releases/ink#1.1.0-alpha11)

```
public abstract float getM01()
```

Value in the second row, first column of the transform matrix.

### getM10

Added in [1.1.0-alpha11](https://developer.android.com/jetpack/androidx/releases/ink#1.1.0-alpha11)

```
public abstract float getM10()
```

Value in the first row, second column of the transform matrix.

### getM11

Added in [1.1.0-alpha11](https://developer.android.com/jetpack/androidx/releases/ink#1.1.0-alpha11)

```
public abstract float getM11()
```

Value in the second row, second column of the transform matrix.

### getM20

Added in [1.1.0-alpha11](https://developer.android.com/jetpack/androidx/releases/ink#1.1.0-alpha11)

```
public abstract float getM20()
```

Value in the first row, third column of the transform matrix.

### getM21

Added in [1.1.0-alpha11](https://developer.android.com/jetpack/androidx/releases/ink#1.1.0-alpha11)

```
public abstract float getM21()
```

Value in the second row, third column of the transform matrix.

### getValues

Added in [1.0.0](https://developer.android.com/jetpack/androidx/releases/ink#1.0.0)

```
public final @Size(min = 6) @NonNull float[] getValues(@Size(min = 6) @NonNull float[] outArray)
```

Populates the first 6 elements of `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#getValues(kotlin.FloatArray)` with the values of this transform, starting with the top left corner of the matrix and proceeding in row-major order.

In performance-sensitive code, prefer to pass in an array that has already been allocated and is being reused, rather than relying on the default behavior of allocating a new instance for each call.

Prefer to apply this transform to an object, such as with `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#applyTransform(androidx.ink.geometry.Vec)`, rather than accessing the actual numeric values of this transform. This function is useful for when the values are needed in bulk but not to apply a transform, for example for serialization.

To set these values on a transform in the same order that they are retrieved here, use the `https://developer.android.com/reference/androidx/ink/geometry/ImmutableAffineTransform` constructor or use `https://developer.android.com/reference/androidx/ink/geometry/MutableAffineTransform#setValues(kotlin.Float,kotlin.Float,kotlin.Float,kotlin.Float,kotlin.Float,kotlin.Float)`.

### isAlmostEqual

Added in [1.0.0](https://developer.android.com/jetpack/androidx/releases/ink#1.0.0)

```
public final boolean isAlmostEqual(
    @NonNull AffineTransform other,
    @FloatRange(from = 0.0) float tolerance
)
```

Compares this `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` with `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#isAlmostEqual(androidx.ink.geometry.AffineTransform,kotlin.Float)`, and returns true if each component of the transform matrix is within `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#isAlmostEqual(androidx.ink.geometry.AffineTransform,kotlin.Float)` of the corresponding component of `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform#isAlmostEqual(androidx.ink.geometry.AffineTransform,kotlin.Float)`.

### multiply

Added in [1.0.0](https://developer.android.com/jetpack/androidx/releases/ink#1.0.0)

```
public static final void multiply(
    @NonNull AffineTransform lhs,
    @NonNull AffineTransform rhs,
    @NonNull MutableAffineTransform output
)
```

Multiplies the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform.Companion#multiply(androidx.ink.geometry.AffineTransform,androidx.ink.geometry.AffineTransform,androidx.ink.geometry.MutableAffineTransform)` transform by the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform.Companion#multiply(androidx.ink.geometry.AffineTransform,androidx.ink.geometry.AffineTransform,androidx.ink.geometry.MutableAffineTransform)` transform as matrices, and stores the result in `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform.Companion#multiply(androidx.ink.geometry.AffineTransform,androidx.ink.geometry.AffineTransform,androidx.ink.geometry.MutableAffineTransform)`, which may be the same `https://developer.android.com/reference/androidx/ink/geometry/MutableAffineTransform` instance as `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform.Companion#multiply(androidx.ink.geometry.AffineTransform,androidx.ink.geometry.AffineTransform,androidx.ink.geometry.MutableAffineTransform)` or `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform.Companion#multiply(androidx.ink.geometry.AffineTransform,androidx.ink.geometry.AffineTransform,androidx.ink.geometry.MutableAffineTransform)` to avoid additional allocations.

Note that, when performing matrix multiplication, the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform.Companion#multiply(androidx.ink.geometry.AffineTransform,androidx.ink.geometry.AffineTransform,androidx.ink.geometry.MutableAffineTransform)` transform is applied after the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform.Companion#multiply(androidx.ink.geometry.AffineTransform,androidx.ink.geometry.AffineTransform,androidx.ink.geometry.MutableAffineTransform)` transform; i.e., after calling this method, `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform.Companion#multiply(androidx.ink.geometry.AffineTransform,androidx.ink.geometry.AffineTransform,androidx.ink.geometry.MutableAffineTransform)` contains a transform equivalent to applying `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform.Companion#multiply(androidx.ink.geometry.AffineTransform,androidx.ink.geometry.AffineTransform,androidx.ink.geometry.MutableAffineTransform)`, then `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform.Companion#multiply(androidx.ink.geometry.AffineTransform,androidx.ink.geometry.AffineTransform,androidx.ink.geometry.MutableAffineTransform)`.

### toImmutable

Added in [1.1.0-alpha11](https://developer.android.com/jetpack/androidx/releases/ink#1.1.0-alpha11)

```
public abstract @NonNull ImmutableAffineTransform toImmutable()
```

Returns an immutable equivalent of this object. This will return itself if called on an immutable instance.

## Extension functions

### AndroidGraphicsConverter.populateMatrix

Artifact: [androidx.ink:ink-geometry](https://developer.android.com/jetpack/androidx/releases/ink) [View Source](https://cs.android.com/search?q=file:androidx/ink/geometry/AndroidGraphicsConversionExtensions.android.kt+function:populateMatrix)

```
public final void AndroidGraphicsConverter.populateMatrix(
    @NonNull AffineTransform receiver,
    @NonNull Matrix out
)
```

Writes the values from this `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform` to `https://developer.android.com/reference/androidx/ink/geometry/package-summary#(androidx.ink.geometry.AffineTransform).populateMatrix(android.graphics.Matrix)`.

Returns the modified `https://developer.android.com/reference/android/graphics/Matrix.html` to allow chaining calls.

| Returns |
|---|---|
| `void` | `https://developer.android.com/reference/androidx/ink/geometry/package-summary#(androidx.ink.geometry.AffineTransform).populateMatrix(android.graphics.Matrix)` |

### AndroidGraphicsConverter.toMatrix

Artifact: [androidx.ink:ink-geometry](https://developer.android.com/jetpack/androidx/releases/ink) [View Source](https://cs.android.com/search?q=file:androidx/ink/geometry/AndroidGraphicsConversionExtensions.android.kt+function:toMatrix)

```
public final @NonNull Matrix AndroidGraphicsConverter.toMatrix(@NonNull AffineTransform receiver)
```

Constructs a `https://developer.android.com/reference/android/graphics/Matrix.html` with the values from the `https://developer.android.com/reference/androidx/ink/geometry/AffineTransform`.

Performance-sensitive code should use the `https://developer.android.com/reference/androidx/ink/geometry/package-summary#(androidx.ink.geometry.AffineTransform).populateMatrix(android.graphics.Matrix)` overload that takes a pre-allocated `https://developer.android.com/reference/android/graphics/Matrix.html`, so that the instance can be reused across multiple calls.