ベクトルフィールドを調べる¶
この例では,スカラーフィールドのグラディエントからベクトルフィールドを作成し,インタラクティブに調査します.この例では,フィルタとモジュールを使用して,前の例と同様の操作を対話的に行う方法を示します.このアプローチでは,ほとんどの操作に 「numpy」 が使用されている前の例よりも,MayaviフィルタおよびVTKフィルタに関する知識が必要です.大きな利点は,結果として得られる視覚化をインタラクティブに調査できることです.
まず,前の例と同じスカラーフィールドを作成します.Mayaviを開き,Pythonシェルに次のコードを入力します.
from mayavi import mlab
import numpy as np
def V(x, y, z):
""" A 3D sinusoidal lattice with a parabolic confinement. """
return np.cos(10*x) + np.cos(10*y) + np.cos(10*z) + 2*(x**2 + y**2 + z**2)
X, Y, Z = np.mgrid[-2:2:100j, -2:2:100j, -2:2:100j]
mlab.contour3d(X, Y, Z, V)
前の例と同様に,カラーマップとアイソサーフェスで選択した値を変更できます.
スカラー場の勾配を使ってベクトル場を作成します.これを行うために,セル内にあるデータの導関数を取る CellDerivatives フィルタを使用します(つまり,点と点の間は, Mayaviでのデータ表現 を参照してください.).このため,最初に PointToCellData フィルタを使用して,データが配置されているポイントからセルにデータを補間する必要があります.次に, CellDerivatives フィルタを適用し,次に CellToPointData フィルタを適用してポイントデータを取得します.
ベクトルフィールドを表示するには, VectorCutPlane モジュールを使用します.結果として得られるベクトルは大きすぎるので,タブに移動してスケール係数を0.2に減らすことができます.この場合もベクトルフィールドの密度が高すぎるため, Glyph タブ(とこのタブの Glyph タブ)に移動してマスキングを有効にし,(6つのうち1つの矢印がマスクされている) on ratio を6に設定してマスキングし,ランダムモードをオフにします.
きれいな色にするために,ベクトルフィールドのカラーマップも変更しました.それには, VectorCutPlane のすぐ上にある Colors and legend ノードに移動し, in the VectorLUT タブを選択します.これは,ベクトルデータとスカラーデータに異なるカラーマップが存在する可能性があるためです.
前の例とは異なり,ダイアログボックス内のマスキングなどのすべてのパラメータを操作したり, Glyph タブの color_by_scalar を選択してポテンシャルの値を表示したりできます.ベクトルの表示に使用する切断面をドラッグして移動することもできます.
3Dベクトルフィールドができたので,Mayaviを使用してパーティクルの軌跡を統合することもできます.これには,streamlineモジュールを使用できます.シードサーフェスの頂点から始まるモーションパスが表示されます.シードには( Seed タブの) Point Widget を選びます.次に,3Dシーン内でシードポイントをドラッグして移動します.これにより,初期スカラー場によって生成されたポテンシャル内の軌跡を調べることができます.この例では,すべての軌跡が最終的に局所的な最小ポテンシャルになり,シード点を移動させることで,どの最小点が他の世界ではそれぞれの局所的な最小のアトラクタの引力圏に入るかを見ることができます.