以下の左図はベクトル場(y,x)のプロットです. 右図はこの図を45°回転させた様子です(表示範囲の違いのせいで見づらいですが).
この記事ではこんな感じでベクトル場を回転させて表示させる方法を紹介します. 記事にするほどのものではないでしょ, と思うかもしれませんが意外と考える時間が必要だったので, 同じような境遇にいる方のためにこのページにメモします.
なぜてこずったか
もちろん単に画像を回転させる方法は広く知られてます. 要は
の式で元画像(x,y)からだけ(x',y')に回転させることができます.
でも今やりたいのはベクトル場の画像を回転させる方法で本質的には同じですが少し工夫が必要だということに気づきました. しかもベクトルの回転とググっても大体出てくるのはベクトル場のrotの演算, ベクトル解析や電磁気学ででてきたあれだったりして, ただ無駄にネットの世界を漂流していました. もっとも結局最終的にたどり着いた資料はこの電磁気学の教科書だったわけですが....
本題
やることはべクトル画像をだけ回転させる, または元の座標xyから回転した別の座標x'y'で表示させることです.
最初の図を例として, つまり以下のベクトルで表されるベクトル画像を考えていきます.
まず式(2)を以下のように単位基底ベクトルを使うとわかりやすくなります.
ここで, です.
さてこれを回転させたい場合基本的には先の式(1)の変換式を使います. ただしここで注意が必要なのはスカラー部分だけでなく単位ベクトルの部分もこの式を使ってxyからx'y'に変換する必要があります.
つまりスカラー部分の変換
に加えてベクトル部分の変換
も行います.
これを式(3)に代入し, 計算を進めます.
計算自体はこれで終わりです.
例としてこの式に°とし改めてxyで表すと
となります. これを図にすると実際最初の右図のようになります.
内容は以上.
ベクトル画像の表示方法
これまで図で示してきたベクトル画像を作るPythonコードを以下示します(式(5)の場合). matplotlibのquiverという関数がキーです.
import numpy as np import matplotlib.pyplot as plt datanum=9 x = np.array([i-(datanum-1)/2 for i in range(datanum)]) y = np.array([i-(datanum-1)/2 for i in range(datanum)]) X, Y = np.meshgrid(x, y) fig, ax = plt.subplots(figsize = (12, 7)) #最初の2つの引数が座標, 次の2つがベクトル. ax.quiver(X, Y, -X, Y, linewidths=0.5, headlength=3, headaxislength=3) ax.axis([-6, 6, -6, 6]) ax.set_xticks(x) ax.set_yticks(y) ax.grid(which = "major", axis = "x", color = "black", alpha = 1, linestyle = "-", linewidth = 1) ax.grid(which = "major", axis = "y", color = "black", alpha = 1, linestyle = "-", linewidth = 1) plt.show()