检查点列表是不是是矩形的一部分

Posted

技术标签:

【中文标题】检查点列表是不是是矩形的一部分【英文标题】:Check if a list of points is part of a rectangle检查点列表是否是矩形的一部分 【发布时间】:2018-10-01 21:59:38 【问题描述】:

我有一个点列表,我需要找出这些点是否存在于由左上角和右下角定义的矩形中。如果所有点都属于矩形,则结果为 True,否则结果为 False。

这是我的代码,但我在某处弄错了。

 def Functn1(topLeft=(0,0), bottomRight=(0,0), pointList=[]):
        x1 = topLeft[0]
        y1 = topLeft[1]
        x2 = bottomRight[0]
        y2 = bottomRight[1]

        xa = pointList[i][0]
        ya = pointList[i][0]
        xb = pointList[i][1]
        yb = pointList[i][1]

        lengthofList = len(pointList)

        for i in range(lengthofList):
            if ((xa > x1 and xb < x2) and (ya > y1 and yb < y2)):

            #if ((x[i][0] > x1 and x[i][1] < x2) and (y[i][0] > y1 and y[i][1] < y2)): 
            #Also tried using this code but keep getting the same error                
                return True
            else:
                return False


Functn1((0,0), (5,5), [(1,1), (0,0), (5,6)]) #should get False

我收到此错误:

<ipython-input-153-669eeffdb011> in allIn(topLeft, bottomRight, pointList)
     20 
     21         for i in range(lengthofList):
---> 22             if ((x[i][0] > x1 and x[i][1] < x2) and (y[i][0] > y1 and y[i][1] < y2)):
     23                 return True
     24             else:

TypeError: 'int' object is not subscriptable

【问题讨论】:

你能澄清你的问题吗,我不太明白你想检查pointList元组之一是否等于bottomRighttopLeft 为什么它应该返回False(1, 1) 不是 (0, 0)(5, 5) 内的一个点吗? 嗨@Azhy。首先,矩形仅由 2 个点形成。在这种情况下为 (0,0) 和 (5,5)。 (1,1) 和 (0,0) 将导致此矩形为 True,但 (5,6) 在矩形之外。由于所有点都不在矩形中,我应该得到一个错误。 【参考方案1】:

根据我对您问题的理解,以下是您在代码中犯的一些错误:

    您在设置或初始化它之前使用了i 变量:-.

    xa = pointList[i][0]
    ya = pointList[i][0]
    xb = pointList[i][1]
    yb = pointList[i][1]
    

    我认为您想在 for 循环中将其用作迭代变量,但您在循环外使用了它。

    您为pointList 变量中的每个点创建了四个变量,我认为这些变量是针对该点的x、y、宽度、高度,尽管一个点没有任何宽度或高度。

    您的循环无效,因为它在遍历列表中的第一项后返回TrueFalse,并且它不会搜索其他点以了解它们是在矩形内部还是外部.


因此,我创建了您的代码副本,并根据您的需要进行了一些更改,并且也易于理解:

def Functn1(topLeft=(0,0), bottomRight=(0,0), pointList=[]):

    x = topLeft[0]     #Rectangle x
    y = topLeft[1]     #Rectangle y
    w = bottomRight[0] #Rectangle width(which you created with name of x2)
    h = bottomRight[1] #Rectangle height(which you created with name of y2)

    for i in range(len(pointList)):

        p_x = pointList[i][0] #Current point x
        p_y = pointList[i][1] #Current point y

        if not ((p_x >= x and p_x < w) and (p_y >= y and p_y < h)): #Return False if the point wasn't in the rectangle (because you said theyre all must be inside the rectangle)
            return False

    return True #If non of them was outside the rectangle (Or it wasn't returned False) so return True

但是,如果您工作或阅读过有关图形的知识,您应该知道示例中的 (0, 0) 在矩形内,(5, 5) 在矩形外,因为如果某物的大小为 5 像素,那么最后一个像素的值为 4不是 5,我编写了这样的代码,如果您想更改它,您可以轻松地将 &lt; 运算符更改为 &lt;= 并将 &gt; 更改为 &gt;= 以包含矩形的最后一个点。

【讨论】:

嗨@Azhy。非常感谢您的快速周转。效果很好! @GinoMempin 是的,你是对的,我忘了这样做。但顺便问一下,为什么len() 函数会返回此错误?我不明白那个函数不是返回一个integer 值吗? 对不起,我想我严重误解了代码和错误。 TypeError 不是由rangelen 函数引起的。这是另一回事,您的代码已经修复了它。所以请忽略我以前的cmets。你的回答很好,+1。

以上是关于检查点列表是不是是矩形的一部分的主要内容,如果未能解决你的问题,请参考以下文章

python:检查特定字符串是不是是文件名的一部分

Java检查两个矩形是不是在任何点重叠

检查坐标是不是在屏幕矩形内

检查列表框是不是包含文本框

如何在 Pygame 中检查变量是不是包含矩形? [复制]

在 OnPaint() 事件中,如何检查给定的矩形是不是与无效区域相交?