Matplotlib库路径。包含\u点对于某些边上的点而不是其他边上的点,返回false

2024-06-01 09:50:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用Matplotlib来查找多边形路径中包含的所有点,但它似乎缺少一些。更具体地说,我的路径是一个矩形,并且这些点位于底层的统一网格上。将多边形的其余部分视为多边形顶部的测试点,但不会将其视为多边形的其余部分。在

代码:

import matplotlib.path as mpltPath

polygon = [(5,5),(10,5),(10,10),(5,10)]
width =11
height =11

points = [[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0],[9,0],[10,0],[11,0], \
          [0,1],[1,1],[2,1],[3,1],[4,1],[5,1],[6,1],[7,1],[8,1],[9,1],[10,1],[11,1],\
          [0,2],[1,2],[2,2],[3,2],[4,2],[5,2],[6,2],[7,2],[8,2],[9,2],[10,2],[11,2],\
          [0,3],[1,3],[2,3],[3,3],[4,3],[5,3],[6,3],[7,3],[8,3],[9,3],[10,3],[11,3],\
          [0,4],[1,4],[2,4],[3,4],[4,4],[5,4],[6,4],[7,4],[8,4],[9,4],[10,4],[11,4],\
          [0,5],[1,5],[2,5],[3,5],[4,5],[5,5],[6,5],[7,5],[8,5],[9,5],[10,5],[11,5],\
          [0,6],[1,6],[2,6],[3,6],[4,6],[5,6],[6,6],[7,6],[8,6],[9,6],[10,6],[11,6],\
          [0,7],[1,7],[2,7],[3,7],[4,7],[5,7],[6,7],[7,7],[8,7],[9,7],[10,7],[11,7],\
          [0,8],[1,8],[2,8],[3,8],[4,8],[5,8],[6,8],[7,8],[8,8],[9,8],[10,8],[11,8],\
          [0,9],[1,9],[2,9],[3,9],[4,9],[5,9],[6,9],[7,9],[8,9],[9,9],[10,9],[11,9],\
          [0,10],[1,10],[2,10],[3,10],[4,10],[5,10],[6,10],[7,10],[8,10],[9,10],[10,10],[11,10],\
          [0,11],[1,11],[2,11],[3,11],[4,11],[5,11],[6,11],[7,11],[8,11],[9,11],[10,11],[11,11]]


path = mpltPath.Path(polygon)
inside = path.contains_points(points)
print(inside)

同样,上面的代码将返回

^{pr2}$

我希望结果的第5行包含与后面的值一样的真值。如果我把多边形中的坐标从5改为4.9,那么我就得到了我期望的结果。在

我假设这与误用或误解函数有关,但我不太确定这可能是什么或怎样。在

编辑:对于落在多边形边上的点,contains_points应该返回False。在我的例子中,我们看到了顶边[5,5]-[10,5]的这种行为,但其他边(即[5,5]-[5,10],[5,10]-[10,10]和[10,10]-[10,5])没有这种行为。这三个其他边对应于具有真值的第一列和最后一列,以及在上面的示例输出中包含真值的最后一行。正是这种明显的不一致性才是问题所在。在


Tags: path代码路径网格matplotlib多边形points矩形
1条回答
网友
1楼 · 发布于 2024-06-01 09:50:12

更新:现在是一个开放的issue in matplotlib。在


排除边框上的行可能是contains_points之类函数的预期行为。但是,在这种情况下,多边形边界上的点没有以一致的方式处理

在本例中,您给出的第5行表示排除边界上的点,但第5行和第10行表示包含边界点。在

polygon[::-1]绘制路径,因此方向相反,将导致所有边界的预期行为,但第10行除外,其中再次应用了包含。在

对我来说这里没有明显的逻辑模式。但是,即使有这种行为,这种行为肯定会令人困惑,应该加以纠正。


现在,您仍然可以通过避免放置在多边形边界上的点来获得所需的行为。可以使用contains_points函数的radius属性执行此操作:

radius allows the path to be made slightly larger or smaller.

因此,如果为“半径”(radius)属性提供一些较小的正值或负值,如下所示:

# ...
path = mpltPath.Path(polygon)
inside = path.contains_points(points,radius=0.1)

print(inside)

你会得到:

^{pr2}$

注意,半径是正还是负取决于方向。您可以找到有关此here的详细信息。根据经验法则:正半径在路径逆时针方向时扩展路径,在路径顺时针方向时收缩路径。在

相关问题 更多 >