Matplotlib喜欢matlab的trisurf

Lar*_*rry 2 python 3d matlab mesh matplotlib

总而言之,我想在python中绘制一个通用的3D三角网格.Matplotlib似乎是理想的候选者,但我会选择能够完成我即将描述的任何3D渲染.

假设我有一个由X,Y和Z定义的三角形网格,一个点云的3D坐标,每个都是长度为n的向量,而UVW是一个2D mx-3矩阵,其中每一行都是一个三元组的索引.点云.这个三元组代表一个单独的三角形.换句话说,我在n个点上有三个三角形.在Matlab中,为了生成3D图,我只是这样做:

trisurf(UVW, X, Y, Z)
Run Code Online (Sandbox Code Playgroud)

有人对这个有经验么?特别是,mplots trisurf可以用来工作吗?

GBy*_*GBy 5

根据您的表现需求,mayavi可能最适合这一点 - 根据戴维斯的评论.

然而,matplotlib自带plot_trisurf到可以完美通过通用UVW,X,Y,Z你描述.

用圆环网格实例:

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

R = 1.
r = 0.8
n = 50
m = 50

def torus_triangles(n, m):
    """ Returns triangles to mesh a (n, m) torus """
    tri = []
    for i in range(n):
        for j in range(m):
            a = i + j*(n)
            b = ((i+1) % n) + j*n
            d = i + ((j+1) % m) * n
            c = ((i+1) % n) + ((j+1) % m) * n
            tri += [[a, b, d], [b, c, d]]
    return np.array(tri, dtype=np.int32)

theta0 = np.linspace(0, (2*np.pi), n, endpoint=False)
phi0 = np.linspace(0, (2*np.pi), m, endpoint=False)
theta, phi = np.meshgrid(theta0, phi0)

x = (R + r * np.sin(phi)) * np.cos(theta)
y = (R + r * np.sin(phi)) * np.sin(theta)
z = r * np.cos(phi)

triangles = torus_triangles(n , m)
triang = mtri.Triangulation(x.ravel(), y.ravel(), triangles)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(triang, z.ravel(), lw=0.2, edgecolor="black", color="grey",
                alpha=0.5)

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述