Я знаю, что 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

0
zuddsy 22 Мар 2017 в 11:07

2 ответа

Лучший ответ

Извините, что так поздно, но я понял это некоторое время назад и забыл опубликовать ответ.

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

Вот рисунок окончательного результата:

enter image description here

0
zuddsy 26 Мар 2017 в 03:41

(делаю это с макушки головы .. но принцип должен работать)

Создайте матрицу для поворота вокруг центра прямоугольника, то есть для преобразования - (x + width / 2), - (y + height / 2) с последующим поворотом на угол с последующим переводом (x + width / 2), (у + высота / 2)

Используйте Vector2.Transform для преобразования каждый угол исходного прямоугольника

Затем создайте новый прямоугольник с x = min (p1.x, p2.x, p3.x, p4.x) width = max (p1.x, p2.x, p3.x, p4.x) - x

Похоже на тебя

0
The ZMan 23 Мар 2017 в 04:24