python-Matplotlib path.contains_points对某些边上的点返回false,但对其他边不返回
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-Matplotlib path.contains_points对某些边上的点返回false,但对其他边不返回,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4425字,纯文字阅读大概需要7分钟。
内容图文
![python-Matplotlib path.contains_points对某些边上的点返回false,但对其他边不返回](/upload/InfoBanner/zyjiaocheng/668/6f080888b8184a22961a0efe8295c822.jpg)
我正在尝试使用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)
照原样,上面的代码将返回
[False False False False False False False False False False False False
False False False False False False False False False False False False
False False False False False False False False False False False False
False False False False False False False False False False False False
False False False False False False False False False False False False
False False False False False False False False False False False False
False False False False False True True True True True True False
False False False False False True True True True True True False
False False False False False True True True True True True False
False False False False False True True True True True True False
False False False False False True True True True True True False
False False False False False False False False False False False False]
我希望结果的第5行包含True值,如其后的值.如果将多边形中的坐标从5更改为4.9,则可以得到预期的结果.
我以为这与滥用或误解该函数有关,但我不确定这可能是什么或如何发生.
编辑:提出了contains_points对于落在多边形边缘的点应该返回False.在我的示例中,我们看到顶部边缘[5,5]-[10,5]的这种行为,但其他边缘(即[5,5]-[5,10],[5,10]- [10,10]和[10,10]-[10,5]).这三个其他边对应于上面示例输出中具有True值的第一列和最后一列以及包含True值的最后一行.问题是这种明显的不一致.
解决方法:
更新:现在是一个开放的issue in matplotlib.
排除边界上的线可能是contains_points之类的函数的预期行为.但是,在这种情况下,多边形边界上的点不会以一致的方式处理:
在该示例中,第5行表示在边界上的积分被排除,但第5 10行和第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)
你得到:
[False False False False False False False False False False False False
False False False False False False False False False False False False
False False False False False False False False False False False False
False False False False False False False False False False False False
False False False False False False False False False False False False
False False False False False True True True True True True False
False False False False False True True True True True True False
False False False False False True True True True True True False
False False False False False True True True True True True False
False False False False False True True True True True True False
False False False False False True True True True True True False
False False False False False False False False False False False False]
注意,半径应为正还是负取决于方向.您可以找到有关此here的更多信息.根据经验:当路径逆时针旋转时,正半径会扩展路径,而当路径顺时针旋转时正半径会收缩路径.
内容总结
以上是互联网集市为您收集整理的python-Matplotlib path.contains_points对某些边上的点返回false,但对其他边不返回全部内容,希望文章能够帮你解决python-Matplotlib path.contains_points对某些边上的点返回false,但对其他边不返回所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。