Introdução
Este tutorial demonstra como criar superfícies 3D usando malha triangular na biblioteca Matplotlib do Python. Ele mostra dois exemplos de plotagem de superfícies com malha triangular.
Dicas para a VM
Após a inicialização da VM, clique no canto superior esquerdo para mudar para a aba Notebook e acessar o Jupyter Notebook para praticar.
Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.
Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão, e resolveremos o problema prontamente para você.
Importar as Bibliotecas Necessárias
Começamos importando as bibliotecas necessárias: matplotlib.pyplot e numpy. Também importamos matplotlib.tri para criar as malhas triangulares.
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.tri as mtri
Criar uma Malha
Criamos uma malha no espaço das variáveis de parametrização u e v. Isso é feito usando a função np.meshgrid() para criar uma grade de pontos u e 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 a Superfície
Em seguida, definimos a superfície. Neste exemplo, usamos um mapeamento de Möbius para pegar um par u, v e retornar um triplo 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)
Triangulação do Espaço Paramétrico
Triangulamos o espaço paramétrico para determinar os triângulos que conectarão os pontos x, y, z.
tri = mtri.Triangulation(u, v)
Plotar a Superfície
Finalmente, plotamos a superfície usando a função plot_trisurf(). Os triângulos no espaço paramétrico determinam quais pontos x, y, z são conectados por uma aresta.
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)
Criar uma Máscara
Neste exemplo, criamos uma máscara para remover triângulos indesejados. Primeiro, criamos os espaços paramétricos radii e 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
Mapear para os Pontos x, y, z
Mapeamos os pares radius, angle para os pontos x, y, z.
x = (radii*np.cos(angles)).flatten()
y = (radii*np.sin(angles)).flatten()
z = (np.cos(radii)*np.cos(3*angles)).flatten()
Criar a Triangulação
Criamos a triangulação usando a função Triangulation(). Como não há triângulos, a triangulação de Delaunay é criada.
triang = mtri.Triangulation(x, y)
Mascar Triângulos Indesejados
Mascaramos os triângulos indesejados calculando o ponto médio de cada triângulo e verificando se ele se enquadra em um raio 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)
Plotar a Superfície
Finalmente, plotamos a superfície usando a função plot_trisurf().
ax = plt.figure().add_subplot(projection='3d')
ax.plot_trisurf(triang, z, cmap=plt.cm.CMRmap)
Resumo
Este tutorial demonstrou como criar superfícies 3D usando malhas triangulares na biblioteca Matplotlib do Python. Cobrimos as etapas envolvidas na criação de uma malha, definição da superfície, triangulação do espaço de parâmetros, criação de uma máscara e plotagem da superfície.