Plus de surfaces 3D triangulaires

Beginner

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

Introduction

Ce tutoriel montre comment créer des surfaces 3D à l'aide d'un maillage triangulaire dans la bibliothèque Matplotlib de Python. Il présente deux exemples de tracé de surfaces avec un maillage triangulaire.

Conseils sur la machine virtuelle

Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Carnet de notes pour accéder au carnet Jupyter pour pratiquer.

Parfois, vous devrez attendre quelques secondes pour que le carnet Jupyter ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations du carnet Jupyter.

Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez votre feedback après la session, et nous résoudrons rapidement le problème pour vous.

Importation des bibliothèques requises

Nous commençons par importer les bibliothèques requises : matplotlib.pyplot et numpy. Nous importons également matplotlib.tri pour créer les maillages triangulaires.

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

Créer un maillage

Nous créons un maillage dans l'espace des variables de paramétrisation u et v. Cela est fait à l'aide de la fonction np.meshgrid() pour créer une grille de points u et 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()

Définir la surface

Ensuite, nous définissons la surface. Dans cet exemple, nous utilisons une transformation de Möbius pour prendre une paire u, v et retourner un triplet 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)

Trianguler l'espace de paramètres

Nous triangulons l'espace de paramètres pour déterminer les triangles qui connecteront les points x, y, z.

tri = mtri.Triangulation(u, v)

Tracer la surface

Enfin, nous traçons la surface à l'aide de la fonction plot_trisurf(). Les triangles dans l'espace de paramètres déterminent quels points x, y, z sont connectés par un bord.

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)

Créer un masque

Dans cet exemple, nous créons un masque pour éliminer les triangles indésirables. Nous créons d'abord les espaces de paramètres rayons et 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

Projeter sur les points x, y, z

Nous projetons les paires rayon, angle sur les points x, y, z.

x = (radii*np.cos(angles)).flatten()
y = (radii*np.sin(angles)).flatten()
z = (np.cos(radii)*np.cos(3*angles)).flatten()

Créer une triangulation

Nous créons la triangulation à l'aide de la fonction Triangulation(). Étant donné qu'il n'y a pas de triangles, la triangulation de Delaunay est créée.

triang = mtri.Triangulation(x, y)

Masquer les triangles indésirables

Nous masquons les triangles indésirables en calculant le point milieu de chaque triangle et en vérifiant si celui-ci se trouve à l'intérieur d'un rayon donné.

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)

Tracer la surface

Enfin, nous traçons la surface à l'aide de la fonction plot_trisurf().

ax = plt.figure().add_subplot(projection='3d')
ax.plot_trisurf(triang, z, cmap=plt.cm.CMRmap)

Sommaire

Ce tutoriel a démontré comment créer des surfaces 3D à l'aide d'un maillage triangulaire dans la bibliothèque Matplotlib de Python. Nous avons couvert les étapes impliquées dans la création d'un maillage, la définition de la surface, la triangulation de l'espace de paramètres, la création d'un masque et le tracé de la surface.