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

Что касается этой игры по программированию Я сейчас занимаюсь строительством.

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

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

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

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

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


person Andreas Grech    schedule 28.02.2009    source источник


Ответы (2)


Решение

Используя метод, который я опубликовал в качестве решения этого предыдущего вопроса и метод 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;
}
person Andreas Grech    schedule 28.02.2009
comment
Кажется, что GetBounds возвращает не структуру Rect, а структуру RectangleF (msdn.microsoft.com/de-de/library/system.drawing.rectanglef.aspx), который содержит все четыре точки прямоугольника, а также имеет метод IntersectsWith. Приятно иметь, приятно знать! - person schnaader; 28.02.2009
comment
Ссылка на английском языке: msdn.microsoft.com/en-us/library /system.drawing.rectanglef.aspx - person Andreas Grech; 28.02.2009
comment
Этот ответ мне очень помог! Спасибо :) - person Jobi Joy; 04.10.2009
comment
.InterSects с очень медленным - person TimothyP; 25.01.2010

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

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

person schnaader    schedule 28.02.2009