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

PythonPythonBeginner
今すぐ練習

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

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

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

VMのヒント

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

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/DataStructuresGroup(["Data Structures"]) python(("Python")) -.-> python/ModulesandPackagesGroup(["Modules and Packages"]) python(("Python")) -.-> python/DataScienceandMachineLearningGroup(["Data Science and Machine Learning"]) matplotlib(("Matplotlib")) -.-> matplotlib/BasicConceptsGroup(["Basic Concepts"]) python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) matplotlib/BasicConceptsGroup -.-> matplotlib/importing_matplotlib("Importing Matplotlib") matplotlib/BasicConceptsGroup -.-> matplotlib/figures_axes("Understanding Figures and Axes") python/BasicConceptsGroup -.-> python/booleans("Booleans") python/DataStructuresGroup -.-> python/lists("Lists") python/DataStructuresGroup -.-> python/tuples("Tuples") python/ModulesandPackagesGroup -.-> python/importing_modules("Importing Modules") python/DataScienceandMachineLearningGroup -.-> python/numerical_computing("Numerical Computing") python/DataScienceandMachineLearningGroup -.-> python/data_visualization("Data Visualization") subgraph Lab Skills matplotlib/importing_matplotlib -.-> lab-49012{{"より多様な三角形の 3D 曲面"}} matplotlib/figures_axes -.-> lab-49012{{"より多様な三角形の 3D 曲面"}} python/booleans -.-> lab-49012{{"より多様な三角形の 3D 曲面"}} python/lists -.-> lab-49012{{"より多様な三角形の 3D 曲面"}} python/tuples -.-> lab-49012{{"より多様な三角形の 3D 曲面"}} python/importing_modules -.-> lab-49012{{"より多様な三角形の 3D 曲面"}} python/numerical_computing -.-> lab-49012{{"より多様な三角形の 3D 曲面"}} python/data_visualization -.-> lab-49012{{"より多様な三角形の 3D 曲面"}} end

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

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