Más superficies tridimensionales triangulares

Beginner

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

Introducción

Este tutorial demuestra cómo crear superficies 3D utilizando una malla triangular en la biblioteca Matplotlib de Python. Muestra dos ejemplos de trazado de superficies con malla triangular.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.

Importar las bibliotecas necesarias

Comenzamos importando las bibliotecas necesarias: matplotlib.pyplot y numpy. También importamos matplotlib.tri para crear las mallas triangulares.

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

Crear una malla

Creamos una malla en el espacio de las variables de parametrización u y v. Esto se hace utilizando la función np.meshgrid() para crear una cuadrícula de puntos u y 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()

Definir la superficie

A continuación, definimos la superficie. En este ejemplo, usamos una transformación de Möbius para tomar un par u, v y devolver una triple 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)

Triangulación del espacio de parámetros

Triangulamos el espacio de parámetros para determinar los triángulos que conectarán los puntos x, y, z.

tri = mtri.Triangulation(u, v)

Graficar la superficie

Finalmente, graficamos la superficie utilizando la función plot_trisurf(). Los triángulos en el espacio de parámetros determinan qué puntos x, y, z están conectados por un borde.

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)

Crear una máscara

En este ejemplo, creamos una máscara para eliminar triángulos no deseados. Primero creamos los espacios de parámetros radii (radio) y angles (ángulos).

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

Mapear a los puntos x, y, z

Mapeamos los pares radius (radio), angle (ángulo) a los puntos x, y, z.

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

Crear la triangulación

Creamos la triangulación utilizando la función Triangulation(). Dado que no hay triángulos, se crea la triangulación de Delaunay.

triang = mtri.Triangulation(x, y)

Ocultar triángulos no deseados

Ocultamos los triángulos no deseados calculando el punto medio de cada triángulo y comprobando si se encuentra dentro de un radio dado.

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)

Graficar la superficie

Finalmente, graficamos la superficie utilizando la función plot_trisurf().

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

Resumen

Este tutorial demostró cómo crear superficies tridimensionales utilizando una malla triangular en la biblioteca Matplotlib de Python. Cubrimos los pasos implicados en la creación de una malla, la definición de la superficie, la triangulación del espacio de parámetros, la creación de una máscara y la representación de la superficie.