如何在二维网格上“绘制”几何形状?

时间:2012-04-02 19:08:01

标签: python numpy matplotlib

我想对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_)

下一步做什么?

我尝试以不同方式解决问题:

  • 使用matplotlib绘制图形
  • 使用不同颜色
  • 编码z的值
  • 将图形保存为png
  • 将png导入为numpy数组并解码颜色。

然而,这对函数z所采用的值施加了严格的限制,这是我寻找不同方法的主要原因。

非常感谢能帮助我的人。

1 个答案:

答案 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头部。