【问题标题】:Correctly calculate bounding box for a transformed rectangle with System.Numerics使用 System.Numerics 正确计算变换矩形的边界框
【发布时间】:2016-05-31 20:24:50
【问题描述】:

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

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)

【问题讨论】:

    标签: c# vector-graphics bounding-box


    【解决方案1】:

    我不确定你所做的究竟是什么问题,但它并不代表边界框最可靠的定义,即:

    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);
    

    【讨论】:

    • 我认为我们都返回了与 JavaScript 测试匹配的相同结果here 所以我认为这个公式实际上可能是正确的。奇怪的是,它似乎还不够大。
    猜你喜欢
    • 2019-01-05
    • 2021-04-12
    • 2011-01-25
    • 1970-01-01
    • 2010-10-11
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多