Обнаружение столкновения двух прямоугольников, которые можно вращать - PullRequest
0 голосов
/ 17 декабря 2018

Я делаю 2D-игру, используя c # (движок моногамов).И мне нужна функция, которая будет возвращать true или false в зависимости от того, сталкивается ли повернутый прямоугольник с каким-либо другим прямоугольником, который также может быть повернут.

На данный момент у меня есть функция, которая возвращает true или false в зависимости от того,два прямоугольника сталкиваются.Но без вращения.

Как-то так

public bool Collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2)
{
    if (x1 < x2 + w2 &&
        x1 + w1 > x2 &&
        y1 < y2 + h2 &&
        h1 + y1 > y2)
        return true;
    return false;
}

Но вместо всех этих параметров у меня есть два объекта.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Обнаружение столкновения для повернутых прямоугольников намного сложнее, чем для выровненных по оси прямоугольников, но это не очень сложно:

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

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

Для каждого направления линии создадим еще одну линию, перпендикулярную этому.Затем мы проецируем оба прямоугольника на эту линию.Теперь мы можем проверить, перекрываются ли прямоугольники.

Если они это сделают, мы ничего не знаем, но если нет, мы знаем, что прямоугольники окончательно не пересекаются.

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

Единственная сложная часть - проецирование прямоугольников на линию.Это делается с помощью точечного продукта, но вы, вероятно, найдете лучшие объяснения в других местах.Основная идея состоит в том, чтобы превратить каждый угол прямоугольника в число, представляющее, как далеко он находится вверх по линии.Затем возьмите минимальное и максимальное число для каждого прямоугольника и проверьте, перекрываются ли эти области.

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

Я основал свой ответ на этом (где вы также можете найти фотографии):

https://www.gamedev.net/articles/programming/general-and-gameplay-programming/2d-rotated-rectangle-collision-r2604

0 голосов
/ 17 декабря 2018

Вы можете построить два Прямоугольника объекта и вызвать IntersectsWith()

public bool Collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2)
{
    var rect1 = new System.Drawing.Rectangle(x1,y1,w1,h1);
    var rect2 = new System.Drawing.Rectangle(x2,y2,w2,h2);
    return rect1.IntersectsWith(rect2);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...