首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用System.Numerics正确计算转换矩形的包围盒

用System.Numerics正确计算转换矩形的包围盒
EN

Stack Overflow用户
提问于 2016-05-31 11:25:15
回答 1查看 535关注 0票数 0

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

代码语言:javascript
复制
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命名空间中已经有一个方法了吗?

旋转矩阵公式

代码语言:javascript
复制
Matrix3x2.CreateRotation(radians, origin)

斜矩阵公式

代码语言:javascript
复制
Matrix3x2.CreateRotation(radiansX, radiansY, origin)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-31 12:24:50

我不清楚您所做的事情到底是什么问题,但它并不代表边界框最健壮的定义,即:

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37544398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档