提问人:insectsongs 提问时间:6/13/2023 最后编辑:Scott Hunterinsectsongs 更新时间:6/13/2023 访问量:53
识别矩形中是否存在点列表
Identifying if list of points exists in rectangle
问:
我是 Python 的新手,并试图确定点列表是否在矩形内。我认为我的问题可能与整数迭代有关,但我不确定如何解决它。
但是,我尝试了以下解决方案来获取要点列表,但没有成功:
def allIn(firstCorner=(0,0), secondCorner=(0,0), pointList=[]):
fx = firstCorner[0]
fy = firstCorner[1]
sx = secondCorner[0]
sy = secondCorner[1]
import numpy as np
for i in np.array(pointList):
if i[0] >= fx and i[0] <= sx and i[1] >= fy and i[1] <= sy:
return True
if i[0] <= fx and i[0] >= sx and i[1] <= fy and i[1] >= sy:
return True
if i[0] >= fx and i[0] <= sx and i[1] <= fy and i[1] >= sy:
return True
if i[0] <= fx and i[0] >= sx and i[1] >= fy and i[1] <= sy:
return True
if pointList == []:
return False
else:
return False
代码似乎没有错误,但它没有提供正确的答案。例如,当它应该返回 False 时,它说 allIn((0,0), (5,5), [(1,1), (0,0), (5,6)]) 为 True。我认为它只是引用了 pointList 中的第一点。即
allIn((0,0),(5,5),[(0,-1), (0,0), (5,6)]) 返回 False,但 allIn((0,0), (5,5), [(1,1), (0,0), (5,6)]) 返回 True。
它也没有给出 allIn((0,0), (5,5), []) 的任何答案。
需要注意的是,firstCorner 和 secondCorner 不一定是左角和右角。我们假设第一个参数并不总是表示矩形的左角,第二个参数并不总是右角。无论哪种方式,该函数都应该正常工作。
我试图避免使用库来解决这个问题(作业提到不要),但即使有建议的 shapely.geometry 解决方案,我仍然无法弄清楚如何迭代 pointList 而不仅仅是单个点。提前感谢您可能提供的任何帮助 - 我真的很感激!
答:
所以,只有当你找到一个局外人时,你才会在循环中。否则,您必须先运行整个列表,然后才能返回。
这行得通。最后的“不是”只是将列表的现在或不存在转换为 或 。return
True
True
False
def allIn(firstCorner=(0,0), secondCorner=(0,0), pointList=[]):
left,right = sorted((firstCorner[0],secondCorner[0]))
top,bottom = sorted((firstCorner[1],secondCorner[1]))
for point in pointList:
if not (left <= point[0] <= right and top <= point[1] <= bottom):
return False
return not not pointList
print(allIn((0,0), (5,5), [(0,-1), (0,0), (5,6)]))
print(allIn((0,0), (5,5), [(1,1), (0,0)]))
print(allIn((0,0), (5,5), [(1,1), (0,0), (5,6)]))
print(allIn((0,0), (5,5), []))
输出:
False
True
False
False
另一种选择是编写一个函数来检查单个点,然后使用 or 函数来处理列表部分。all
any
def inside(upperleft, lowerright, point):
return upperleft[0] <= point[0] <= lowerright[0] and upperleft[1] <= point[1] <= lowerright[1]
def allIn(firstCorner=(0,0), secondCorner=(0,0), pointList=[]):
if not pointList:
return False
left,right = sorted((firstCorner[0],secondCorner[0]))
top,bottom = sorted((firstCorner[1],secondCorner[1]))
return all(inside((left,top),(right,bottom),pt) for pt in pointList)
print(allIn((0,0), (5,5), [(0,-1), (0,0), (5,6)]))
print(allIn((0,0), (5,5), [(1,1), (0,0)]))
print(allIn((0,0), (5,5), [(1,1), (0,0), (5,6)]))
print(allIn((0,0), (5,5), []))
评论
python