WPF: обнаружение столкновений с помощью повернутых квадратов

Что касается этой игры по программированию, которую я сейчас создаю.

Благодаря ответам из этого поста я теперь могу найти координаты xy всех точек прямоугольников (даже при повороте), а обнаружение столкновений со стенами теперь работает почти идеально.

Теперь мне нужно реализовать обнаружение столкновений с самими ботами (потому что, очевидно, на Арене будет более одного бота).

Обнаружение столкновений «квадрат-квадрат» (без поворота) в этом случае не действует, потому что боты будут повернуты под углом (точно так же, как я описал здесь ).

Итак, как лучше всего реализовать эту форму обнаружения столкновений повернутых прямоугольников в WPF?

Я предполагаю, что здесь должна быть какая-то математика, но обычно оказывается, что в WPF есть функции, которые «вычисляют» эти математические данные за вас (как в этом случае )

Ответов (2)

Решение

Решение

Используя метод, который я опубликовал в качестве решения этого предыдущего вопроса, и метод WPF, вызванный IntersectsWith (from Rect ), я смог решить эту проблему обнаружения столкновения повернутых прямоугольников следующим образом:

public Rect GetBounds(FrameworkElement of, FrameworkElement from)
{
        // Might throw an exception if of and from are not in the same visual tree
        GeneralTransform transform = of.TransformToVisual(from);

        return transform.TransformBounds(new Rect(0, 0, of.ActualWidth, of.ActualHeight));
}

Vehicle IsBotCollided(IEnumerable<Vehicle> blist)
{
    //currentBounds is of type Rect, which contains the 4 points of the rectangle (even when rotated)
    var currentBounds = GetBounds(BotBody, BattleArena);

    //Then I check if the current bounds intersect with each of the other Bots` bounds that are also in the Arena
    foreach (Vehicle vehicle in blist)
    {
        if(GetBounds(vehicle.BotBody, BattleArena).IntersectsWith(currentBounds))
        {
            return vehicle;
        }
    }
    return null;
}

Я бы проверил каждую строку на предмет коллизий (так что у вас будет максимум 4 * 4 проверок на коллизию, если две линии сталкиваются, боты тоже, и вы можете остановиться), хотя я уверен, что есть лучшие / более быстрые способы сделать это. Если прямоугольники могут иметь разные размеры, вам также следует проверить, находится ли меньший внутри другого.

Производительность может быть немного увеличена, если вы сначала проверите повернутое значение x / y-min / max прямоугольников (или вы даже можете вычислить два круга вокруг ботов и проверить их, что еще быстрее), чтобы у вас не было чтобы проверить линии, если они далеко друг от друга.