简介
本教程演示了如何使用 Python 的 Matplotlib 库中的三角网格创建 3D 曲面。它展示了两个使用三角网格绘制曲面的示例。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,请随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。
导入所需库
我们首先导入所需的库:matplotlib.pyplot 和 numpy。我们还导入 matplotlib.tri 来创建三角网格。
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.tri as mtri
创建网格
我们在参数化变量 u 和 v 的空间中创建一个网格。这是通过使用 np.meshgrid() 函数来创建 u 和 v 点的网格来完成的。
u = np.linspace(0, 2.0 * np.pi, endpoint=True, num=50)
v = np.linspace(-0.5, 0.5, endpoint=True, num=10)
u, v = np.meshgrid(u, v)
u, v = u.flatten(), v.flatten()
定义曲面
接下来,我们定义曲面。在这个例子中,我们使用莫比乌斯映射来获取一对 u、v,并返回一个三元组 x、y、z。
x = (1 + 0.5 * v * np.cos(u / 2.0)) * np.cos(u)
y = (1 + 0.5 * v * np.cos(u / 2.0)) * np.sin(u)
z = 0.5 * v * np.sin(u / 2.0)
对参数空间进行三角剖分
我们对参数空间进行三角剖分,以确定连接 x、y、z 点的三角形。
tri = mtri.Triangulation(u, v)
绘制曲面
最后,我们使用 plot_trisurf() 函数绘制曲面。参数空间中的三角形决定了哪些 x、y、z 点由一条边连接。
ax = plt.figure().add_subplot(projection='3d')
ax.plot_trisurf(x, y, z, triangles=tri.triangles, cmap=plt.cm.Spectral)
ax.set_zlim(-1, 1)
创建一个掩码
在这个例子中,我们创建一个掩码来移除不需要的三角形。我们首先创建参数空间 radii 和 angles。
n_angles = 36
n_radii = 8
min_radius = 0.25
radii = np.linspace(min_radius, 0.95, n_radii)
angles = np.linspace(0, 2*np.pi, n_angles, endpoint=False)
angles = np.repeat(angles[..., np.newaxis], n_radii, axis=1)
angles[:, 1::2] += np.pi/n_angles
映射到 x、y、z 点
我们将 radius、angle 对映射到 x、y、z 点。
x = (radii*np.cos(angles)).flatten()
y = (radii*np.sin(angles)).flatten()
z = (np.cos(radii)*np.cos(3*angles)).flatten()
创建三角剖分
我们使用 Triangulation() 函数创建三角剖分。由于没有预先指定三角形,因此会创建德劳内三角剖分(Delaunay triangulation)。
triang = mtri.Triangulation(x, y)
屏蔽不需要的三角形
我们通过计算每个三角形的中点并检查其是否落在给定半径内来屏蔽不需要的三角形。
xmid = x[triang.triangles].mean(axis=1)
ymid = y[triang.triangles].mean(axis=1)
mask = xmid**2 + ymid**2 < min_radius**2
triang.set_mask(mask)
绘制表面
最后,我们使用 plot_trisurf() 函数绘制表面。
ax = plt.figure().add_subplot(projection='3d')
ax.plot_trisurf(triang, z, cmap=plt.cm.CMRmap)
总结
本教程展示了如何使用 Python 的 Matplotlib 库中的三角网格来创建 3D 表面。我们介绍了创建网格、定义表面、对参数空间进行三角剖分、创建掩码以及绘制表面所涉及的步骤。