diff --git a/src/Avalonia.Base/Matrix.cs b/src/Avalonia.Base/Matrix.cs
index a72710ffd4..5f5aab4f47 100644
--- a/src/Avalonia.Base/Matrix.cs
+++ b/src/Avalonia.Base/Matrix.cs
@@ -214,6 +214,21 @@ namespace Avalonia
return new Matrix(cos, sin, -sin, cos, 0, 0);
}
+ ///
+ /// Creates a rotation matrix using the given rotation in radians around center point.
+ ///
+ /// The amount of rotation, in radians.
+ /// The location of center point.
+ ///
+ public static Matrix CreateRotation(double radians, Point center)
+ {
+ var cos = Math.Cos(radians);
+ var sin = Math.Sin(radians);
+ var x = center.X;
+ var y = center.Y;
+ return new Matrix(cos, sin, -sin, cos, x * (1.0 - cos) + y * sin, y * (1.0 - cos) - x * sin);
+ }
+
///
/// Creates a skew matrix from the given axis skew angles in radians.
///
diff --git a/tests/Avalonia.Base.UnitTests/MatrixTests.cs b/tests/Avalonia.Base.UnitTests/MatrixTests.cs
index d111c14258..9fccdf25fc 100644
--- a/tests/Avalonia.Base.UnitTests/MatrixTests.cs
+++ b/tests/Avalonia.Base.UnitTests/MatrixTests.cs
@@ -61,6 +61,20 @@ public class MatrixTests
AssertCoordinatesEqualWithReducedPrecision(expected, actual);
}
+
+ [Fact]
+ public void Transform_Point_Should_Return_Correct_Value_For_Rotate_Matrix_With_Center_Point()
+ {
+ var expected = Vector2.Transform(
+ new Vector2(0, 10),
+ Matrix3x2.CreateRotation((float)Matrix.ToRadians(30), new Vector2(3, 5)));
+
+ var matrix = Matrix.CreateRotation(Matrix.ToRadians(30), new Point(3, 5));
+ var point = new Point(0, 10);
+ var actual = matrix.Transform(point);
+
+ AssertCoordinatesEqualWithReducedPrecision(expected, actual);
+ }
[Fact]
public void Transform_Point_Should_Return_Correct_Value_For_Scaled_Matrix()