更多三角形 3D 表面

PythonPythonBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本教程演示了如何使用Python的Matplotlib库中的三角网格创建3D曲面。它展示了两个使用三角网格绘制曲面的示例。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问Jupyter Notebook进行练习。

有时,你可能需要等待几秒钟让Jupyter Notebook完成加载。由于Jupyter Notebook的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,请随时向Labby提问。课程结束后提供反馈,我们将立即为你解决问题。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/DataStructuresGroup(["Data Structures"]) python(("Python")) -.-> python/ModulesandPackagesGroup(["Modules and Packages"]) python(("Python")) -.-> python/DataScienceandMachineLearningGroup(["Data Science and Machine Learning"]) matplotlib(("Matplotlib")) -.-> matplotlib/BasicConceptsGroup(["Basic Concepts"]) python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) matplotlib/BasicConceptsGroup -.-> matplotlib/importing_matplotlib("Importing Matplotlib") matplotlib/BasicConceptsGroup -.-> matplotlib/figures_axes("Understanding Figures and Axes") python/BasicConceptsGroup -.-> python/booleans("Booleans") python/DataStructuresGroup -.-> python/lists("Lists") python/DataStructuresGroup -.-> python/tuples("Tuples") python/ModulesandPackagesGroup -.-> python/importing_modules("Importing Modules") python/DataScienceandMachineLearningGroup -.-> python/numerical_computing("Numerical Computing") python/DataScienceandMachineLearningGroup -.-> python/data_visualization("Data Visualization") subgraph Lab Skills matplotlib/importing_matplotlib -.-> lab-49012{{"更多三角形 3D 表面"}} matplotlib/figures_axes -.-> lab-49012{{"更多三角形 3D 表面"}} python/booleans -.-> lab-49012{{"更多三角形 3D 表面"}} python/lists -.-> lab-49012{{"更多三角形 3D 表面"}} python/tuples -.-> lab-49012{{"更多三角形 3D 表面"}} python/importing_modules -.-> lab-49012{{"更多三角形 3D 表面"}} python/numerical_computing -.-> lab-49012{{"更多三角形 3D 表面"}} python/data_visualization -.-> lab-49012{{"更多三角形 3D 表面"}} end

导入所需库

我们首先导入所需的库:matplotlib.pyplotnumpy。我们还导入 matplotlib.tri 来创建三角网格。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.tri as mtri

创建网格

我们在参数化变量 uv 的空间中创建一个网格。这是通过使用 np.meshgrid() 函数来创建 uv 点的网格来完成的。

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()

定义曲面

接下来,我们定义曲面。在这个例子中,我们使用莫比乌斯映射来获取一对 uv,并返回一个三元组 xyz

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)

对参数空间进行三角剖分

我们对参数空间进行三角剖分,以确定连接 xyz 点的三角形。

tri = mtri.Triangulation(u, v)

绘制曲面

最后,我们使用 plot_trisurf() 函数绘制曲面。参数空间中的三角形决定了哪些 xyz 点由一条边连接。

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)

创建一个掩码

在这个例子中,我们创建一个掩码来移除不需要的三角形。我们首先创建参数空间 radiiangles

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

映射到 xyz

我们将 radiusangle 对映射到 xyz 点。

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表面。我们介绍了创建网格、定义表面、对参数空间进行三角剖分、创建掩码以及绘制表面所涉及的步骤。