Einführung
In diesem Tutorial wird gezeigt, wie man mit Hilfe der Matplotlib-Bibliothek in Python 3D-Oberflächen mit Hilfe von Dreiecksnetzen erstellt. Es werden zwei Beispiele zur Darstellung von Oberflächen mit Dreiecksnetzen gezeigt.
Tipps für die VM
Nachdem der Start der virtuellen Maschine abgeschlossen ist, klicken Sie in der linken oberen Ecke, um zur Registerkarte Notebook zu wechseln und den Jupyter Notebook-Server für die Übungen zu starten.
Manchmal müssen Sie einige Sekunden warten, bis der Jupyter Notebook-Server vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund der Einschränkungen des Jupyter Notebook-Servers nicht automatisiert werden.
Wenn Sie während des Lernens Probleme haben, können Sie Labby um Hilfe bitten. Geben Sie nach der Sitzung Feedback ab, und wir werden das Problem für Sie schnellstmöglich beheben.
Importieren der erforderlichen Bibliotheken
Wir beginnen mit dem Importieren der erforderlichen Bibliotheken: matplotlib.pyplot und numpy. Wir importieren auch matplotlib.tri, um die Dreiecksnetze zu erstellen.
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.tri as mtri
Erstellen eines Gitters
Wir erstellen ein Gitter im Raum der Parameterisierungsvariablen u und v. Dies wird mit der Funktion np.meshgrid() durchgeführt, um ein Gitter von u- und v-Punkten zu erstellen.
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()
Definieren der Fläche
Als nächstes definieren wir die Fläche. In diesem Beispiel verwenden wir eine Möbiustransformation, um ein u-v-Paar zu nehmen und ein x-y-z-Tripel zurückzugeben.
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)
Dreiecksgitter des Parametersraums
Wir erstellen ein Dreiecksgitter im Parametersraum, um die Dreiecke zu bestimmen, die die x, y, z-Punkte verbinden werden.
tri = mtri.Triangulation(u, v)
Zeichnen der Fläche
Schließlich zeichnen wir die Fläche mit der Funktion plot_trisurf(). Die Dreiecke im Parametersraum bestimmen, welche x, y, z-Punkte durch eine Kante verbunden sind.
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)
Erstellen einer Maske
In diesem Beispiel erstellen wir eine Maske, um unerwünschte Dreiecke zu entfernen. Wir erstellen zunächst die Parametersräume radii und 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
Abbilden auf x, y, z-Punkte
Wir projizieren die radius-angle-Paare auf x, y, z-Punkte.
x = (radii*np.cos(angles)).flatten()
y = (radii*np.sin(angles)).flatten()
z = (np.cos(radii)*np.cos(3*angles)).flatten()
Erstellen der Triangulation
Wir erstellen die Triangulation mit der Funktion Triangulation(). Da es keine Triangeln gibt, wird eine Delaunay-Triangulation erstellt.
triang = mtri.Triangulation(x, y)
Ausschließen unerwünschter Dreiecke
Wir schließen unerwünschte Dreiecke aus, indem wir den Mittelpunkt jedes Dreiecks berechnen und überprüfen, ob er innerhalb eines angegebenen Radius liegt.
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)
Zeichnen der Fläche
Schließlich zeichnen wir die Fläche mit der Funktion plot_trisurf().
ax = plt.figure().add_subplot(projection='3d')
ax.plot_trisurf(triang, z, cmap=plt.cm.CMRmap)
Zusammenfassung
In diesem Tutorial wurde gezeigt, wie man mit Hilfe der Matplotlib-Bibliothek in Python 3D-Flächen mit Hilfe von Dreiecksnetzen erstellt. Wir haben die Schritte behandelt, die bei der Erstellung eines Gitters, der Definition der Fläche, der Triangulation des Parametersraums, der Erstellung einer Maske und der Darstellung der Fläche involviert sind.