我使用下面的算法来计算转换后的矩形的边框,但它似乎有问题。
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)

发布于 2016-05-31 12:24:50
我不清楚您所做的事情到底是什么问题,但它并不代表边界框最健壮的定义,即:
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);https://stackoverflow.com/questions/37544398
复制相似问题