XNA / Monogame在纹理周围创建矩形而不管旋转?

时间:2017-03-22 08:07:02

标签: rotation xna trigonometry monogame rectangles

我知道Rectangle是轴对齐的,这很好,我只是无法弄清楚如何创建一个矩形,因此无论旋转如何,它总是包含整个精灵。我一直在寻找答案,但我无法在任何地方找到答案。

例如:

enter image description here

enter image description here

假设原点位于纹理的中间,我该怎么办呢?

修改

稍稍摆弄它,我已经走到了这一步:

public Rectangle BoundingBox
{
    get
    {

        var cos = Math.Cos(SpriteAngle);
        var sin = Math.Cos(SpriteAngle);

        var t1_opp = Width * cos;
        var t1_adj = Math.Sqrt(Math.Pow(Width, 2) - Math.Pow(t1_opp, 2));

        var t2_opp = Height * sin;
        var t2_adj = Math.Sqrt(Math.Pow(Height, 2) - Math.Pow(t2_opp, 2));

        int w = Math.Abs((int)(t1_opp + t2_opp));
        int h = Math.Abs((int)(t1_adj + t2_adj));

        int x = Math.Abs((int)(Position.X) - (w / 2));
        int y = Math.Abs((int)(Position.Y) - (h / 2));

        return new Rectangle(x, y, w, h);

    }
}

enter image description here

2 个答案:

答案 0 :(得分:0)

(做到这一点离我头顶......但原则应该有效)

创建一个围绕矩形中心旋转的矩阵 - 即 - (x +宽度/ 2), - (y +高度/ 2)的平移 然后旋转角度 然后是(x +宽度/ 2),(y +高度/ 2)

的平移

使用Vector2.Transform转换原始矩形的每个角落

然后用一个新的矩形 x = min(p1.x,p2.x,p3.x,p4.x) width = max(p1.x,p2.x,p3.x,p4.x) - x

类似于y

答案 1 :(得分:0)

对不起,这件事来得太晚了,但我刚才想出来了,忘了发一个答案。

public virtual Rectangle BoundingBox
{
    get
    {
        int x, y, w, h;
        if (Angle != 0)
        {
            var cos = Math.Abs(Math.Cos(Angle));
            var sin = Math.Abs(Math.Sin(Angle));
            var t1_opp = Width * cos;
            var t1_adj = Math.Sqrt(Math.Pow(Width, 2) - Math.Pow(t1_opp, 2));
            var t2_opp = Height * sin;
            var t2_adj = Math.Sqrt(Math.Pow(Height, 2) - Math.Pow(t2_opp, 2));

            w = (int)(t1_opp + t2_opp);
            h = (int)(t1_adj + t2_adj);
            x = (int)(Position.X - (w / 2));
            y = (int)(Position.Y - (h / 2));
        }
        else
        {
            x = (int)Position.X;
            y = (int)Position.Y;
            w = Width;
            h = Height;
        }
        return new Rectangle(x, y, w, h);
    }
}

就在这里。在我编辑的工作中,我偶然在Math.Cos变量中sin,但没有帮助。

所以它只是基本的三角学。如果纹理角度不是零,则计算由宽度和高度形成的两个三角形的边,并使用边作为宽度和高度的值,然后将矩形围绕纹理居中。如果这是有道理的。

这是帮助解释的图片:

Solve

这是最终结果的GIF:

enter image description here