2017-01-22 41 views
0

給出rect s1 = {x, y, w, h}和另一個rects s2 = {x, y, w, h}和一個向量v = {x, y}。並假設s1已根據v移動,我想檢查它是否重疊。我有錯誤的算法測試重疊rects(?)

我有這樣的算法:

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)和我有什麼樣的算法在這裏?我知道我從某個地方得到了它,但我找不到我的來源了。我只是添加了額外的運動矢量。

+2

使用本:http://gamedev.stackexchange.com/a/587 –

+0

好吧,這工作得很好,但我仍然有興趣在爲什麼另一種算法是錯誤的/我在那裏計算的天哪。因爲它的工作部分。 – hgiesel

+0

順便說一句,如果你的AABB沒有改變它的大小,那麼你只需要檢查位移矢量的x/y是否小於矩形的寬度/高度。 I.e .:'isOverlapping = abs(v.x)

回答

2

錯誤是由簡單的錯字造成的。在過去比較的第一個變量應該是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)