使用 System.Numerics 正确计算变换矩形的边界框

Correctly calculate bounding box for a transformed rectangle with System.Numerics

我正在使用以下算法计算变换后的矩形的边界框,但它似乎有问题。

public static Rectangle GetBoundingRectangle(Rectangle rectangle, Matrix3x2 matrix)
{
    Vector2 leftTop = Vector2.Transform(new Vector2(rectangle.Left, rectangle.Top), matrix);
    Vector2 rightTop = Vector2.Transform(new Vector2(rectangle.Right, rectangle.Top), matrix);
    Vector2 leftBottom = Vector2.Transform(new Vector2(rectangle.Left, rectangle.Bottom), matrix);
    Vector2 rightBottom = Vector2.Transform(new Vector2(rectangle.Right, rectangle.Bottom), matrix);

    Vector2 min = Vector2.Min(Vector2.Min(leftTop, rightTop), Vector2.Min(leftBottom, rightBottom));
    Vector2 max = Vector2.Max(Vector2.Max(leftTop, rightTop), Vector2.Max(leftBottom, rightBottom));

    return new Rectangle(0, 0, (int)(max.X - min.X), (int)(max.Y - min.Y));
}

它适用于旋转但不适用于倾斜。正如您将从下面的图像中看到的那样,根据公式计算出的矩形太小了。任何人都可以发现问题所在,或者 System.Numerics 命名空间中是否已经存在我可以使用的方法?

旋转-矩阵公式

Matrix3x2.CreateRotation(radians, origin)

偏斜 - 矩阵公式

Matrix3x2.CreateRotation(radiansX, radiansY, origin)

我不确定您所做的到底有什么问题,但它并不代表边界框的最可靠定义,即:

var allCorners = new List<Vector2> { leftTop, rightTop, leftBottom, rightBottom };
var xExtent = allCorners.Select(v => v.X).Max() - allCorners.Select(v => v.X).Min();
var yExtent = allCorners.Select(v => v.Y).Max() - allCorners.Select(v => v.Y).Min();
return new Rectangle(0, 0, xExtent, yExtent);