给出一个 rects1 = {x, y, w, h}
和另一个 rectss2 = {x, y, w, h}
和一个 vector 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)的正确算法是什么,我在这里有什么样的算法?我知道我从某个地方得到它,但我再也找不到我的来源了。我刚刚添加了额外的运动矢量。