📌  相关文章
📜  门| Sudo GATE 2020 Mock II(2019年1月10日)|问题20(1)

📅  最后修改于: 2023-12-03 15:12:45.079000             🧑  作者: Mango

门| Sudo GATE 2020 Mock II(2019年1月10日)|问题20

这道题是Sudo GATE 2020 Mock II(2019年1月10日)中的问题20。这是一道考查数学知识和编程能力的题目。

问题描述

平面上有一个门,门有四个顶点:A(x1,y1),B(x2,y2),C(x3,y3)和D(x4,y4)。门没有开启时,门处于俯视图中的矩形的四个角上。门开启后,门变成了一个开口向上的V形。门在开启时,其两个翼的宽度相等,为w,它们的初始高度是h。门的中心位置为(x,y),如下图所示:

image

现在,你需要编写一段程序来判断一个物体是否与门相交。

输入格式

输入分为两行。第一行有8个整数x1,y1,x2,y2,x3,y3,x4,y4分别表示门矩形顶点的坐标。第二行有3个整数x,y,w分别表示门的中心坐标和门翼的宽度。

输出格式

输出仅包含一个整数,表示一个物体是否与门相交。若相交,则输出 1,否则,输出 0。

代码片段
x1, y1, x2, y2, x3, y3, x4, y4 = map(int, input().split())
x, y, w = map(int, input().split())
h = abs(y1 - y)

def is_intersect(x1, y1, x2, y2, x3, y3, x4, y4, x, y, w, h):
    # check if point(x1,y1), (x2,y2), (x3,y3), (x4,y4) are in the boundary of door
    if x1 < x - w // 2 or x1 > x + w // 2:
        return False
    if x2 < x - w // 2 or x2 > x + w // 2:
        return False
    if x3 < x - w // 2 or x3 > x + w // 2:
        return False
    if x4 < x - w // 2 or x4 > x + w // 2:
        return False
    # check if top of the object is below the top of door
    if y + h < max(y1, y2, y3, y4):
        return False
    return True

# test if point (2, 2) intersects with the door:
print(is_intersect(x1, y1, x2, y2, x3, y3, x4, y4, x, y, w, h)) # output should be 0
思路

首先,我们需要理解门在开启时的形状。我们可以将门看成一个V形,其两个翼的宽度相等,并且高度为h。根据门在俯视图中的形状,我们可以得到门四个顶点的坐标。

然后,我们需要判断物体是否和门相交。首先,我们需要判断物体的顶部是否在门的下面。我们可以通过比较物体的顶部和门的顶部的高度来进行判断。如果物体的顶部高度比门的顶部高度低,则不会相交。反之亦然。

接着,我们需要判断物体是否和门相交。我们可以通过比较物体的坐标和门的坐标来进行判断。如果物体在门左边或右边,则一定不会相交。反之亦然。

最后,我们可以用上述的算法来判断一个物体是否和门相交。在给定门和物体的坐标、宽度和高度后,我们可以调用is_intersect函数来判断是否相交,如果相交则返回 1,否则返回 0。

结论

这是一道考察编程能力和数学知识的题目。在解题的过程中,我们需要理解门在开启时的形状,并且需要使用数学知识来判断物体是否和门相交。通过对此题的剖析和解答,能够帮助我们加深对编程和数学知识的理解和掌握,提高我们的编程能力。