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

时间:2018-10-01 21:59:39

标签: python python-3.x coordinates rectangles

我有一个点列表,我需要查找这些点是否存在于由左上角和右下角定义的矩形中。如果所有点都属于矩形,则结果为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

1 个答案:

答案 0 :(得分:2)

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

  1. 您在设置或初始化变量之前已使用i变量,例如:-。

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

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

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

  3. 您的循环无效,因为它在循环遍历列表中的第一项后返回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像素,则最后一个pixel的值是4而不是5,我编写了这样的代码,如果要更改它,则可以轻松地将<运算符更改为<=,也可以将>更改为{{ 1}},以包含矩形的最后一个点。