我试图创建一个2D向量场,应用多边形“遮罩”,使得每个点的Angular 和值都是它们与该多边形最近顶点的距离的函数。
我猜scipy.interpolate
可能有我需要的东西,但我需要一些指导。
到目前为止,我可以用matplotlib创建一个多边形,得到它的顶点,然后用它们来创建一个插值器,但是在那之后,我不知道我在做什么。
我认为相关的伪代码应该是这样的:
for point in all_points:
nearest = NearestPoint(polygon_vertices, point)
value = point - nearest
angle = Angle(nearest, point)
最困难的部分是计算任何给定坐标的多边形的最近顶点:但是必须有一个numpy/scipy函数来实现这个...
这是我目前得到的:
def CircleVertices():
circ = plt.Circle((0.5, 0.5), radius=0.4, edgecolor='b', facecolor='None')
return circ.get_path().vertices
def NearestNeighborInterpolate():
vertices = CircleVertices()
x, y = vertices[:,0], vertices[:,1]
z = [np.hypot(x, y) for x,y in vertices]
X = np.linspace(min(x)-0.5, max(x)+0.5, num=100)
Y = np.linspace(min(y)-0.5, max(y)+0.5, num=100)
X, Y = np.meshgrid(X, Y)
interp = scipy.interpolate.NearestNDInterpolator(list(zip(x, y)), z)
Z = interp(X, Y)
plt.pcolormesh(X, Y, Z, shading='auto')
plt.plot(x, y, "ok", label="input point")
plt.legend()
plt.colorbar()
plt.axis("equal")
plt.show()
def GriddataInterpolate():
vertices = CircleVertices()
x, y = vertices[:,0], vertices[:,1]
xx = np.linspace(-1, 1, 20)
yy = np.linspace(-1, 1, 20)
xx, yy = np.meshgrid(xx, yy)
u = [np.hypot(x, y) for x,y in vertices]
v = [0.5 for _ in x]
u_interp = scipy.interpolate.griddata(vertices, u, (xx, yy), method='linear')
v_interp = scipy.interpolate.griddata(vertices, v, (xx, yy), method='linear')
plt.quiver(xx, yy, u_interp, v_interp)
plt.show()
1条答案
按热度按时间31moq8wy1#
可以使用NearestNDInterpolator
对文档中的示例稍作修改
你有这个