WPF: обнаружение столкновений с повернутыми квадратами - PullRequest
3 голосов
/ 28 февраля 2009

Применительно к этой программируемой игре Я сейчас строю.

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

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

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

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

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

Ответы [ 2 ]

9 голосов
/ 28 февраля 2009

Решение

Используя метод, который я опубликовал в качестве решения этого предыдущего вопроса , и метод WPF под названием IntersectsWith (из 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;
}
0 голосов
/ 28 февраля 2009

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

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

...