はじめに
このチュートリアルでは、Python の Matplotlib ライブラリを使って三角メッシュを使って 3D 曲面を作成する方法を示します。三角メッシュを使った曲面の描画の 2 つの例を示します。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要がある場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
学習中に問題がある場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
必要なライブラリをインポートする
まず、必要なライブラリをインポートします。matplotlib.pyplot と numpy です。また、三角メッシュを作成するために matplotlib.tri もインポートします。
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.tri as mtri
メッシュを作成する
パラメータ化変数 u と v の空間にメッシュを作成します。これは、u と v の点のグリッドを作成するために np.meshgrid() 関数を使って行われます。
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()
曲面を定義する
次に、曲面を定義します。この例では、メビウス写像を使って u、v のペアを取り、x、y、z の 3 つ組を返します。
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)
パラメータ空間を三角分割する
x、y、z の点を結ぶ三角形を決定するために、パラメータ空間を三角分割します。
tri = mtri.Triangulation(u, v)
曲面を描画する
最後に、plot_trisurf() 関数を使って曲面を描画します。パラメータ空間の三角形が、どの x、y、z の点が辺で接続されているかを決定します。
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)
マスクを作成する
この例では、不要な三角形を除去するためにマスクを作成します。まず、パラメータ空間 radii と 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
x、y、z の点にマッピングする
radius と angle のペアを x、y、z の点にマッピングします。
x = (radii*np.cos(angles)).flatten()
y = (radii*np.sin(angles)).flatten()
z = (np.cos(radii)*np.cos(3*angles)).flatten()
三角分割を作成する
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 曲面を作成する方法を示しました。メッシュの作成、曲面の定義、パラメータ空間の三角分割、マスクの作成、および曲面の描画に関する手順について説明しました。