Skip to content

Commit 8b69968

Browse files
committed
Add Matrix.Invert()
1 parent ae8c5a0 commit 8b69968

1 file changed

Lines changed: 18 additions & 0 deletions

File tree

geom/matrix.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,24 @@ func (m Matrix) TransformPoint(p Point) Point {
172172
}
173173
}
174174

175+
// Invert returns the inverse of this Matrix. If the Matrix is non-invertible, an identity Matrix is returned.
176+
func (m Matrix) Invert() Matrix {
177+
det := m.ScaleX*m.ScaleY - m.SkewX*m.SkewY
178+
if det == 0 {
179+
// Non-invertible matrix; return identity
180+
return NewIdentityMatrix()
181+
}
182+
invDet := 1 / det
183+
return Matrix{
184+
ScaleX: m.ScaleY * invDet,
185+
SkewX: -m.SkewX * invDet,
186+
TransX: (m.SkewX*m.TransY - m.ScaleY*m.TransX) * invDet,
187+
SkewY: -m.SkewY * invDet,
188+
ScaleY: m.ScaleX * invDet,
189+
TransY: (m.SkewY*m.TransX - m.ScaleX*m.TransY) * invDet,
190+
}
191+
}
192+
175193
// String implements fmt.Stringer.
176194
func (m Matrix) String() string {
177195
return fmt.Sprintf("%#v,%#v,%#v,%#v,%#v,%#v", m.ScaleX, m.SkewX, m.TransX, m.SkewY, m.ScaleY, m.TransY)

0 commit comments

Comments
 (0)