【问题标题】:How to "draw" a geometric shape on a 2-D meshgrid?如何在二维网格上“绘制”几何形状?
【发布时间】:2012-04-02 19:08:01
【问题描述】:

我想对 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 的取值施加了严格的限制,这是我寻找不同方法的主要原因。

非常感谢任何可以帮助我的人。

【问题讨论】:

    标签: python numpy matplotlib


    【解决方案1】:

    两个最简单的选项是使用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 头中。

    【讨论】:

    • 非常感谢您提供如此详细的答复。你让我今天一整天都感觉很好。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多