У меня неправильный алгоритм тестирования перекрывающихся ректов (?)

Дать прямоугольник s1 = {x, y, w, h} и еще один рект s2 = {x, y, w, h} и вектор v = {x, y}, И при условии, что s1 переехал в соответствии с vЯ хочу проверить, не перекрывается ли оно.

У меня есть этот алгоритм:

isOverlapping = not (s1.x + s1.w + v.x < s2.x
or s1.x + v.x > s2.x + s2.w
or s1.y + s1.h + v.y < s2.y
or s1.h + v.y > s2.y + s2.h)

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

isOverlapping = not (right_edge_of_s1_plus_move < left_edge_of_s2
or left_edge_of_s1_plus_move > right_edge_of_s2
or top_edge_of_s1_plus_move < bottom_edge_of_s2
or bottom_edge_of_s1_plus_move > top_edge_of_s2)

isOverlapping = not (s1_overlaps_s2_on_left_edge
or s1_overlaps_s2_on_right_edge
or s1_overlaps_s2_on_bottom_edge
or s1_overlaps_s2_on_top_edge)

Это означает, что они не перекрываются, как только s1 перекрывает s2 на одном ребре... Что?

Странно то, что в моей программе это не работает, когда s1 пытается перейти под s2. Все остальное работает.

Итак, мой вопрос: каков правильный алгоритм тестирования, если два движущихся блока перекрывают друг друга (AABB), и какой у меня здесь алгоритм? Я знаю, что получил его откуда-то, но больше не могу найти свой источник. Я просто добавил дополнительный вектор движения.

1 ответ

Решение

Ошибка вызвана простой опечаткой. Первая переменная в последнем сравнении должна быть s1.y вместо s1.h:

isOverlapping = 
    not (s1.x + s1.w + v.x < s2.x
      or s1.x + v.x > s2.x + s2.w
      or s1.y + s1.h + v.y < s2.y
      or s1.y + v.y > s2.y + s2.h)
Другие вопросы по тегам