Как «нарисовать» геометрическую фигуру на двумерной сетке? - PullRequest
2 голосов
/ 02 апреля 2012

Я хочу провести симуляцию дифракции Фраунгофера, и для этого я решил использовать numpy и matplotlib. Что мне нужно сделать, так это указать функцию двумерной апертуры, и для этого я могу создать сетку из значений 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 в виде массива и декодировать цвета.

Однако это накладывает серьезные ограничения на значения, принимаемые функцией z, что является основной причиной, по которой я ищу другой подход.

Большое спасибо всем, кто может мне помочь.

1 Ответ

2 голосов
/ 03 апреля 2012

Два самых простых варианта - использовать 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

Какой выход (булев массив значений):

[[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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...