Ограничительная коробка вращающегося прямоугольника (2d)

Я вижу, что это было задано по-разному. Я изо всех сил пытаюсь разобраться в этом, поэтому, спрашивая снова.

2d, который перемещается и вращается. Я ищу, чтобы скрыть его в ограничивающей рамке, поскольку, по-видимому, это самый эффективный способ обнаружения столкновения.

У меня не было проблем заставить его работать без вращения, но это просто! Теперь спрайт вращается, я не могу найти правильный способ написания кода.

Чтобы создать ограничивающий прямоугольник для спрайта, я понимаю, что после поворота нужно выработать 4 угла спрайта и использовать их для определения ширины + высоты ограничивающего прямоугольника с правильным размером.

Я использовал статью здесь - http : //msdn.microsoft.com/en-us/library/dd162943 (v = vs.85) .aspx - в частности, формула:

x' = (x * cos A) - (y * sin A) 
y' = (x * sin A) + (y * cos A)

Используемый мной код:

x1 = (positionX * Math.cos(rotation)) - (positionY * Math.sin(rotation));
y1 = (positionX * Math.sin(rotation)) + (positionY * Math.cos(rotation));

x2 = (positionX+width/2 * Math.cos(rotation)) - (positionY+height/2 * Math.sin(rotation));
y2 = (positionX+width/2 * Math.sin(rotation)) + (positionY+height/2 * Math.cos(rotation));

positionX и positionY - текущее положение верхнего левого угла спрайта.

вращение - это радианы, которыми спрайт повернулся (и вращение от центра).

ширина и высота спрайта.

Я подумал, что приведенный выше код даст мне координаты верхних левых и верхних правых углов прямоугольника, повернутых соответственно. Тем не менее, на моем холсте я рисую строку от x1, y1 до x2, y2, и она не следует за спрайтом вообще!

Любые предложения? Извините за длинный пост!

Ура!

4 голоса | спросил Chris Evans 7 WedEurope/Moscow2011-12-07T21:20:29+04:00Europe/Moscow12bEurope/MoscowWed, 07 Dec 2011 21:20:29 +0400 2011, 21:20:29

1 ответ


0

Я столкнулся с подобной проблемой в игре, которую я разрабатываю. Код ниже должен работать для любой матрицы. В основном это занимает верхние левые и нижние правые точки, преобразует их, а затем вычисляет, какая точка - новая верхняя левая, новая ширина, новая высота и сохраняет ее в прямоугольник. Это для C # XNA. Вероятно, это не самый быстрый метод, но он работает для всех матричных преобразований.

    private Rectangle transformRectUsing(Rectangle tileBounds, Matrix m)
    {
        Vector2 x = new Vector2(tileBounds.Left, tileBounds.Top); x = Vector2.Transform(x, m);
        Vector2 y = new Vector2(tileBounds.Right, tileBounds.Bottom); y = Vector2.Transform(y, m);
        Vector2 newTopLeft;
        if (x.X < y.X)
            newTopLeft.X = x.X;
        else
            newTopLeft.X = y.X;
        if (x.Y < y.Y)
            newTopLeft.Y = x.Y;
        else
            newTopLeft.Y = y.Y;

        Rectangle result = new Rectangle(Convert.ToInt32(newTopLeft.X), Convert.ToInt32(newTopLeft.Y), Convert.ToInt32(Math.Abs(x.X - y.X)), Convert.ToInt32(Math.Abs(x.Y - y.Y)));
        return result;
    }
ответил Stephen Tierney 8 ThuEurope/Moscow2011-12-08T05:08:39+04:00Europe/Moscow12bEurope/MoscowThu, 08 Dec 2011 05:08:39 +0400 2011, 05:08:39

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132