简介
本教程演示了如何使用Python的Matplotlib库中的三角网格创建3D曲面。它展示了两个使用三角网格绘制曲面的示例。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问Jupyter Notebook进行练习。
有时,你可能需要等待几秒钟让Jupyter Notebook完成加载。由于Jupyter Notebook的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,请随时向Labby提问。课程结束后提供反馈,我们将立即为你解决问题。
This tutorial is from open-source community. Access the source code
💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版
本教程演示了如何使用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表面。我们介绍了创建网格、定义表面、对参数空间进行三角剖分、创建掩码以及绘制表面所涉及的步骤。