У меня неправильный алгоритм тестирования перекрывающихся ректов (?)
Дать прямоугольник 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)