より多様な三角形の 3D 曲面

Beginner

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

はじめに

このチュートリアルでは、Python の Matplotlib ライブラリを使って三角メッシュを使って 3D 曲面を作成する方法を示します。三角メッシュを使った曲面の描画の 2 つの例を示します。

VM のヒント

VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。

時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要がある場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。

学習中に問題がある場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。

必要なライブラリをインポートする

まず、必要なライブラリをインポートします。matplotlib.pyplotnumpy です。また、三角メッシュを作成するために matplotlib.tri もインポートします。

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

メッシュを作成する

パラメータ化変数 uv の空間にメッシュを作成します。これは、uv の点のグリッドを作成するために 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()

曲面を定義する

次に、曲面を定義します。この例では、メビウス写像を使って uv のペアを取り、xyz の 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)

パラメータ空間を三角分割する

xyz の点を結ぶ三角形を決定するために、パラメータ空間を三角分割します。

tri = mtri.Triangulation(u, v)

曲面を描画する

最後に、plot_trisurf() 関数を使って曲面を描画します。パラメータ空間の三角形が、どの xyz の点が辺で接続されているかを決定します。

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)

マスクを作成する

この例では、不要な三角形を除去するためにマスクを作成します。まず、パラメータ空間 radiiangles を作成します。

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

xyz の点にマッピングする

radiusangle のペアを xyz の点にマッピングします。

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 曲面を作成する方法を示しました。メッシュの作成、曲面の定義、パラメータ空間の三角分割、マスクの作成、および曲面の描画に関する手順について説明しました。