public static (Vector2F position, Vector2F size, float angle, Vector2F center) TransformArea(RectF area, Matrix44F transform) { var pos3 = new Vector3F(area.Position.X, area.Position.Y, 0.0f); var a = new Vector3F(area.Position.X + area.Size.X, area.Position.Y, 0.0f); var b = new Vector3F(area.Position.X, area.Position.Y + area.Size.Y, 0.0f); var pos3t = transform.Transform3D(pos3); var at = transform.Transform3D(a); var bt = transform.Transform3D(b); var aDiff = at - pos3t; var bDiff = bt - pos3t; var position = new Vector2F(pos3t.X, pos3t.Y); var size = new Vector2F(aDiff.Length, bDiff.Length); var angle = MathF.Atan2(aDiff.Y, aDiff.X); var center3 = pos3t + at * 0.5f + bt * 0.5f; return(position, size, angle, new Vector2F(center3.X, center3.Y)); }