inpolygon - matplotlib.path.Path contains_points() 方法的示例?

新手上路,请多包涵

我一直在寻找 MATLAB 的 python 替代品 inpolygon() 我发现 contains_points 是一个不错的选择。

然而,文档有点空洞,没有说明什么类型的数据 contains_points 期望:

contains_points(points, transform=None, radius=0.0)

返回一个 bool 数组 True 如果路径包含相应的点。

如果 transform 不是 None ,则路径将在执行测试之前进行转换。

radius 允许路径稍微变大或变小。

我将多边形存储为 n *2 numpy 数组(其中 n 相当大 ~ 500)。据我所知,我需要对此数据调用 Path() 方法,这似乎工作正常:

 poly_path = Path(poly_points)

目前我还有我希望测试的点存储为另一个 n *2 numpy数组(catalog_points)。

也许我的问题出在这里?就像我跑步时一样:

 in_poly = poly_path.contains_points(catalog_points)

我得到一个 ndarray 包含 False 对于每个值,无论我使用的点集如何(我已经在多边形内的点数组上测试了这个)。

原文由 BJH 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

通常在这些情况下,我发现来源很有启发性……

我们可以看到 path.contains_point 的源代码接受一个至少有 2 个元素的容器。 contains_points 的来源有点难以理解,因为它调用了 C 函数 Py_points_in_path 。似乎这个函数接受一个迭代器,它产生长度为 2 的元素:

 >>> from matplotlib import path
>>> p = path.Path([(0,0), (0, 1), (1, 1), (1, 0)])  # square with legs length 1 and bottom left corner at the origin
>>> p.contains_points([(.5, .5)])
array([ True], dtype=bool)

当然,我们也可以使用一个 numpy 点数组:

 >>> points = np.array([.5, .5]).reshape(1, 2)
>>> points
array([[ 0.5,  0.5]])
>>> p.contains_points(points)
array([ True], dtype=bool)

只是为了检查我们并不总是得到 True

 >>> points = np.array([.5, .5, 1, 1.5]).reshape(2, 2)
>>> points
array([[ 0.5,  0.5],
       [ 1. ,  1.5]])
>>> p.contains_points(points)
array([ True, False], dtype=bool)

原文由 mgilson 发布,翻译遵循 CC BY-SA 3.0 许可协议

确保顶点按需要排序。下面的顶点以生成的路径是一对三角形而不是矩形的方式排序。因此, contains_points 仅返回 True 任何三角形内的点。

 >>> p = path.Path(np.array([bfp1, bfp2, bfp4, bfp3]))
>>> p
Path([[ 5.53147871  0.78330843]
 [ 1.78330843  5.46852129]
 [ 0.53147871 -3.21669157]
 [-3.21669157  1.46852129]], None)
>>> IsPointInside = np.array([[1, 2], [1, 9]])
>>> IsPointInside
array([[1, 2],
       [1, 9]])
>>> p.contains_points(IsPointInside)
array([False, False], dtype=bool)
>>>

如果交换了 bfp3bfp4 ,第一点的输出将是 True

原文由 mehmet ercan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题