1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 12:17:44 +00:00

LibGfx: Add AffineTransform::determinant()

This commit is contained in:
MacDue 2023-07-06 19:12:00 +01:00 committed by Andreas Kling
parent 16b487c270
commit 9ecc78db1b
2 changed files with 14 additions and 8 deletions

View file

@ -134,18 +134,23 @@ AffineTransform& AffineTransform::rotate_radians(float radians)
return *this; return *this;
} }
float AffineTransform::determinant() const
{
return a() * d() - b() * c();
}
Optional<AffineTransform> AffineTransform::inverse() const Optional<AffineTransform> AffineTransform::inverse() const
{ {
auto determinant = a() * d() - b() * c(); auto det = determinant();
if (determinant == 0) if (det == 0)
return {}; return {};
return AffineTransform { return AffineTransform {
d() / determinant, d() / det,
-b() / determinant, -b() / det,
-c() / determinant, -c() / det,
a() / determinant, a() / det,
(c() * f() - d() * e()) / determinant, (c() * f() - d() * e()) / det,
(b() * e() - a() * f()) / determinant, (b() * e() - a() * f()) / det,
}; };
} }

View file

@ -68,6 +68,7 @@ public:
AffineTransform& skew_radians(float x_radians, float y_radians); AffineTransform& skew_radians(float x_radians, float y_radians);
AffineTransform& multiply(AffineTransform const&); AffineTransform& multiply(AffineTransform const&);
float determinant() const;
Optional<AffineTransform> inverse() const; Optional<AffineTransform> inverse() const;
private: private: