【问题标题】:Check if rectangles coords intersect with python检查矩形坐标是否与python相交
【发布时间】:2014-02-26 23:32:26
【问题描述】:

我正在与一个网站进行培训,该网站要求我制作一个程序,该程序将询问两个矩形的坐标并检查矩形是否相交。然后,当我发送程序时,网站会对其进行几次测试。它要求 A 矩形的 x min、x max、y min 和 y max,然后是 B 矩形。

这是我的工作:

xmin_a = int(input())
xmax_a = int(input())
ymin_a = int(input())
ymax_a = int(input())

xmin_b = int(input())
xmax_b = int(input())
ymin_b = int(input())
ymax_b = int(input())

if xmin_a < xmax_b <= xmax_a and (ymin_a < ymax_b <= ymax_a or ymin_a <= ymin_b < ymax_a):
   print('YES')
elif xmin_a <= xmin_b < xmax_a and (ymin_a < ymax_b <= ymax_a or ymin_a <= ymin_b < ymax_a):
   print('YES')
elif xmin_b < xmax_a <= xmax_b and (ymin_b < ymax_a <= ymax_b or ymin_b <= ymin_a < ymax_b):
   print('YES')
elif xmin_b <= xmin_a < xmax_b and (ymin_b < ymax_a <= ymax_b or ymin_b <= ymin_a < ymax_b):
   print('YES')
else:
   print('NO')

不幸的是,它不起作用,我不明白为什么。有什么想法吗?

PS:http://data.france-ioi.org/Task/7b0ee4fb57949c3db1f694afcef9d1a1//exemple.png

【问题讨论】:

  • 这是否合法xmin_a &lt; xmax_b &lt;= xmax_a?你有没有检查过你写的语句是否像你认为的那样工作?
  • 是的,它工作正常。事实上,该程序有时有效,有时无效。
  • 嗯,好吧,这是很奇怪的形式,至少对我来说。但是,如果您说“It sometimes works”,那么它应该指定输入、实际输出和预期输出。如果您知道测试失败,则更容易发现错误。
  • 尝试编写单元测试来缩小错误范围。
  • 非常抱歉。我通常会通过 Java 标记过滤我的问题。难怪我的回答被否决了。不过,语法出奇地相似! (请随意向我扔香蕉皮,因为 Python 在问题的标题中)

标签: python rectangles


【解决方案1】:

我编写了一个生成随机正方形的简短程序,并使用您的函数对其进行测试。按下控制生成新的方块,直到你看到失败的东西。我做了一些快速测试,发现有些案例失败了。您需要考虑它们是否被视为相交,它们是否具有完全相同的边界值。

例如这样:

import numpy as np
import matplotlib.pyplot as plt
from random import randint


def caseTest(xmin_a, xmax_a, ymin_a, ymax_a, xmin_b, xmax_b, ymin_b, ymax_b):

    if xmin_a < xmax_b <= xmax_a and (ymin_a < ymax_b <= ymax_a or ymin_a <= ymin_b < ymax_a):
        print('YES'),
    elif xmin_a <= xmin_b < xmax_a and (ymin_a < ymax_b <= ymax_a or ymin_a <= ymin_b < ymax_a):
        print('YES'),
    elif xmin_b < xmax_a <= xmax_b and (ymin_b < ymax_a <= ymax_b or ymin_b <= ymin_a < ymax_b):
        print('YES'),
    elif xmin_b <= xmin_a < xmax_b and (ymin_b < ymax_a <= ymax_b or ymin_b <= ymin_a < ymax_b):
        print('YES'),
    else:
        print('NO'),

    print(xmin_a, xmax_a, ymin_a, ymax_a, xmin_b, xmax_b, ymin_b, ymax_b)


def createRandomSquares():
    fig = plt.gcf()
    fig.clf()

    xmin_a = randint(0, 9)
    xmax_a = randint(xmin_a + 1, 10)
    ymin_a = randint(0, 9)
    ymax_a = randint(ymin_a + 1, 10)

    xmin_b = randint(0, 9)
    xmax_b = randint(xmin_b + 1, 10)
    ymin_b = randint(0, 9)
    ymax_b = randint(ymin_b + 1, 10)

    caseTest(xmin_a, xmax_a, ymin_a, ymax_a, xmin_b, xmax_b, ymin_b, ymax_b)

    sqr1_x = [xmin_a, xmax_a, xmax_a, xmin_a, xmin_a]
    sqr1_y = [ymin_a, ymin_a, ymax_a, ymax_a, ymin_a]
    sqr2_x = [xmin_b, xmax_b, xmax_b, xmin_b, xmin_b]
    sqr2_y = [ymin_b, ymin_b, ymax_b, ymax_b, ymin_b]

    plt.plot(sqr1_x, sqr1_y)
    plt.plot(sqr2_x, sqr2_y)

    ax = plt.gca()

    ax.set_ylim(min([ymin_b, ymin_a]) - 1, max([ymax_a, ymax_b]) + 1)
    ax.set_xlim(min([xmin_b, xmin_a]) - 1, max([xmax_a, xmax_b]) + 1)

    fig.canvas.draw()


def key_event(event):
    if (event.key == 'control'):
        createRandomSquares()

fig = plt.figure()
fig.canvas.mpl_connect('key_press_event', key_event)

plt.show()

这个给出 NO - 显然应该是的。

  • 如果一个完全包含在另一个中,它们是否被认为是相交的?
    这个答案是肯定的——我会说这可能是否定的。

【讨论】:

    猜你喜欢
    • 2019-03-15
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    相关资源
    最近更新 更多