Python Metapitalib Plate_triscover多边形数据

问题描述 投票:0回答:1

无论如何从plot_trisurf函数中获取多边形数据(即三角形边)?因为它需要x,y和z数据并创建一个Delaunay三角剖分,所以必须将这些数据放在某个地方......?

可以与下面的例子一起使用的东西会很棒。

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np

n_angles = 36

n_radii = 8

radii = np.linspace(0.125, 1.0, n_radii)

angles = np.linspace(0, 2*np.pi, n_angles, endpoint=False)

angles = np.repeat(angles[..., np.newaxis], n_radii, axis=1)

x = np.append(0, (radii*np.cos(angles)).flatten())
y = np.append(0, (radii*np.sin(angles)).flatten())


z = np.sin(-x*y)

fig = plt.figure()
ax = fig.gca(projection='3d')

ax.plot_trisurf(x, y, z, cmap=cm.jet, linewidth=0.2)


plt.show()

我想使用matplotlib,因为它使用更适合3D数据的Delaunay算法。从我可以锻炼,不会将其参数化为2D,并且可以在更广泛的硬件上轻松获得,而不像mayavi那样接近相同数量的faff。 Plotly也可以是一个选项,虽然我认为这需要将数据参数化为2D,这对我的应用来说并不理想。我知道python scipy中有Delaunay库可以做到这一点,但数据的参数化再次成为问题。

python matplotlib 3d polygon delaunay
1个回答
0
投票

您可以查看source code of plot_trisurf以了解matplotlib如何进行三角测量。 它基本上在2D网格上执行三角测量并从输入接管z分量。 二维三角测量由matplotlib.tri.triangulation.Triangulation类完成。

以下可以做你想要的,给你一个顶点数组。

from matplotlib.tri.triangulation import Triangulation
import numpy as np

n_angles = 36
n_radii = 8

radii = np.linspace(0.125, 1.0, n_radii)
angles = np.linspace(0, 2*np.pi, n_angles, endpoint=False)
angles = np.repeat(angles[..., np.newaxis], n_radii, axis=1)

x = np.append(0, (radii*np.cos(angles)).flatten())
y = np.append(0, (radii*np.sin(angles)).flatten())
z = np.sin(-x*y)


tri, args, kwargs = Triangulation.get_from_args_and_kwargs(x, y, z)
triangles = tri.get_masked_triangles()
xt = tri.x[triangles][..., np.newaxis]
yt = tri.y[triangles][..., np.newaxis]
zt = z[triangles][..., np.newaxis]

verts = np.concatenate((xt, yt, zt), axis=2)

print verts
© www.soinside.com 2019 - 2024. All rights reserved.