检查点列表是不是是矩形的一部分
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
元组之一是否等于bottomRight
和topLeft
?
为什么它应该返回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、宽度、高度,尽管一个点没有任何宽度或高度。
您的循环无效,因为它在遍历列表中的第一项后返回True
或False
,并且它不会搜索其他点以了解它们是在矩形内部还是外部.
因此,我创建了您的代码副本,并根据您的需要进行了一些更改,并且也易于理解:
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,我编写了这样的代码,如果您想更改它,您可以轻松地将 <
运算符更改为 <=
并将 >
更改为 >=
以包含矩形的最后一个点。
【讨论】:
嗨@Azhy。非常感谢您的快速周转。效果很好! @GinoMempin 是的,你是对的,我忘了这样做。但顺便问一下,为什么len()
函数会返回此错误?我不明白那个函数不是返回一个integer
值吗?
对不起,我想我严重误解了代码和错误。 TypeError 不是由range
或len
函数引起的。这是另一回事,您的代码已经修复了它。所以请忽略我以前的cmets。你的回答很好,+1。以上是关于检查点列表是不是是矩形的一部分的主要内容,如果未能解决你的问题,请参考以下文章