2013-04-08 102 views
2

給定兩個矩形r1和r2我嘗試測試兩個相交。 爲什麼以下兩個函數不能產生相同的輸出?與Python相交的矩形

功能1:

def separate_helper(r1, r2): 
    r1_left, r1_top, r1_right, r1_bottom = r1 
    r2_left, r2_top, r2_right, r2_bottom = r2 

    if r1_right < r2_left: 
    separate = True 
    elif r1_left > r2_right: 
    separate = True 
    elif r1_top > r2_bottom: 
    separate = True 
    elif r1_bottom < r2_top: 
    separate = True 
    elif contains(r1, r2): 
    separate = False 
    else: 
    separate = False 
    return separate 

功能2:

def separate_helper2(r1, r2): 
    r1_left, r1_top, r1_right, r1_bottom = r1 
    r2_left, r2_top, r2_right, r2_bottom = r2 

    separate = r1_right < r2_left or \ 
    r1_left > r2_right or \ 
    r1_top > r2_bottom or \ 
    r1_bottom < r2_top or \ 
    not contains(r1, r2) 
    return separate 

功能,以檢查是否矩形1包含矩形2:

def contains(r1, r2): 
    r1_left, r1_top, r1_right, r1_bottom = r1 
    r2_left, r2_top, r2_right, r2_bottom = r2 
    return r1_right >= r2_right and r1_left <= r2_left and r1_top <= r2_top and r1_bottom >= r2_bottom 

這裏的一個測試用例失敗

assert separate_helper([29,35,53,90],[23,47,90,86])== separate_helper2([29,35,53,90],[23,47,90,86] )

它只會在矩形1包含矩形2時失敗,但我無法繞過原因。

編輯:

我使用Python的快速檢查和鼻子來測試功能。下面是我使用的測試代碼:

from qc import forall, lists, integers 
from intersect import separate_helper, separate_helper2 

@forall(tries=100, r1=lists(items=integers(), size=(4, 4)), r2=lists(items=integers(), size=(4, 4))) 
def test_separate(r1, r2): 
    assert separate_helper(r1, r2) == separate_helper2(r1, r2) 
+0

你是什麼意思失敗?崩潰或只是不說他們相交? – DiegoNolan 2013-04-08 21:31:57

+0

@DiegoNolan如果你運行提供的代碼,你會發現最後的等號返回「False」,但不應該。 – askewchan 2013-04-08 21:36:27

+0

@DiegoNolan斷言失敗。有關詳細信息,請參閱最新的問 – mre 2013-04-08 21:37:37

回答

3

看看你的第一個版本:

elif contains(r1, r2): 
    separate = False 
else: 
    separate = False 

假設你通過所有合適的路口的情況下得到的,這將返回r1False是否包含r2或不。

但在你的第二個版本:

... or \ 
not contains(r1, r2) 

這將返回Falser1不含r2,但True否則。

因此,他們正在做不同的事情,恰恰是「當矩形1包含矩形2」時。

作爲一個方面的問題:爲什麼要含r1r2回報從r2不同的結果包含r1

+0

我想他只是想檢查矩形的**邊**是否相交。 – Phoexo 2013-04-08 21:43:52

+0

@Phoexo:我假設你在評論我的問題。如果你是對的,沒有理由檢查'contains'。如果你錯了,他需要檢查兩個方向的「包含」。無論哪種方式,我看不出他爲什麼要檢查一種方式,而不是其他方式。 – abarnert 2013-04-08 22:26:43

+0

感謝您的解釋。完整的代碼包含兩個方向。我故意忽略它,以顯示最小的失敗測試用例。 – mre 2013-04-08 23:26:48