0

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

4

1 回答 1

2

该错误是由一个简单的错字引起的。最后一次比较中的第一个变量应该s1.ys1.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)
于 2017-01-22T16:42:59.517 回答