2

2 つの長方形 r1 と r2 が与えられた場合、2 つが交差するかどうかをテストしようとします。次の 2 つの関数が同じ出力を生成しないのはなぜですか?

機能 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

失敗するテストケースは次のとおりです。

アサート 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)
4

1 に答える 1

3

最初のバージョンを見てください:

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

すべての適切な交差ケースを通過すると仮定すると、これは含むFalseかどうかを返します。r1r2

しかし、2番目のバージョンでは:

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

これは、が含まれていないことを返しますFalseが、そうでないことを返します。r1r2True

したがって、「長方形 1 に長方形 2 が含まれる場合」という正確なケースでは、異なることを行っています。

副次的な質問として、なぜ、包含は包含r1r2は異なる結果を返さなければならないのでしょうか?r2r1

于 2013-04-08T21:41:11.410 に答える