我想对Fraunhofer衍射进行模拟,为此我选择使用numpy和matplotlib。我需要做的是指定一个2D光圈函数,为此我可以创建一个x和y值的网格,并分配一个函数z(x,y),在这种情况下应该是复杂的。所有这些听起来并不复杂,但这里我碰到了一个问题。
如何在网格网格中定义矩形或三角形块,使得在几何图形内部z = 1且在z = 0之外?
最小的工作示例,从哪里开始:
#! /bin/usr/env python
# Import environment
import numpy as np
x_ = np.linspace(0,1,255)
y_ = np.linspace(0,1,255)
x,y = np.meshgrid(x_,y_)
下一步做什么?
我尝试以不同方式解决问题:
然而,这对函数z所采用的值施加了严格的限制,这是我寻找不同方法的主要原因。
非常感谢能帮助我的人。
答案 0 :(得分:2)
最简单的两个选项是使用matplotlib.nxutils.points_inside_poly
或使用mahotas.polygon.fill_polygon
。后者速度稍快,但需要安装mahotas
。
作为第一个选项的示例:
import numpy as np
from matplotlib.nxutils import points_inside_poly
nx, ny = 10, 10
poly_verts = [(1,1), (5,1), (5,9),(3,2),(1,1)]
# Create vertex coordinates for each grid cell...
# (<0,0> is at the top left of the grid in this system)
x, y = np.meshgrid(np.arange(nx), np.arange(ny))
x, y = x.flatten(), y.flatten()
points = np.vstack((x,y)).T
grid = points_inside_poly(points, poly_verts)
grid = grid.reshape((ny,nx))
print grid
产生(布尔numpy数组):
[[False False False False False False False False False False]
[False True True True True False False False False False]
[False False False True True False False False False False]
[False False False False True False False False False False]
[False False False False True False False False False False]
[False False False False True 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]]
另一方面,nxutils
将在某些时候折旧,以支持某些路径方法。将来,您可能希望按照以下方式执行以下操作:
from matplotlib import path
...
p = path.Path(poly_verts)
grid = p.contains_points(points)
...
然而,目前只在github头部。