识别矩形中是否存在点列表

Identifying if list of points exists in rectangle

提问人:insectsongs 提问时间:6/13/2023 最后编辑:Scott Hunterinsectsongs 更新时间:6/13/2023 访问量:53

问:

我是 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 而不仅仅是单个点。提前感谢您可能提供的任何帮助 - 我真的很感激!

循环 if-语句 整数 伊辛

评论

0赞 Marc 6/13/2023
添加标签可能会有所帮助。python

答:

0赞 Tim Roberts 6/13/2023 #1

所以,只有当你找到一个局外人时,你才会在循环中。否则,您必须先运行整个列表,然后才能返回。 这行得通。最后的“不是”只是将列表的现在或不存在转换为 或 。returnTrueTrueFalse

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 函数来处理列表部分。allany

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), []))