【解決方法】球面に垂直な軸を中心に配列を回転させます


球の表面の特定の位置に垂直な軸を中心に配列を回転させたいのですが、どうすればよいかわかりません。

例として、以下のコードは一連の点 (双極子磁力線) を作成し、それを球の中心から離してシフトし、xy 平面である角度まで回転します。 この位置で、磁力線を球面に垂直な軸を中心に任意の角度に回転させたいと思います。

import numpy as np
import matplotlib.pyplot as plt

field=np.linspace(-np.pi/2,np.pi/2,100)
circle=np.linspace(0,2*np.pi,100)
theta=60*np.pi/180

r_shift=0.9
r=1.5*np.sin(field+np.pi/2)**2
x0=r*np.cos(field)+r_shift
y0=r*np.sin(field)
# rotate around y-axis
x=x0*np.cos(theta)
y=y0

fig,ax=plt.subplots()
ax.set_box_aspect(1)
ax.plot(np.cos(circle),np.sin(circle),color='k')
ax.plot(x,y)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_xlim(-2,2)
ax.set_ylim(-2,2)

plt.show()

オイラー角やロドリゲスの公式でできると思いますが、これを実装するのに十分な知識がありません。

ここでは、球の中心で必要な回転を実行し、目的の位置に移動して回転しようとしていますが、結果として得られる磁力線は角度ガンマの周りの回転を保持していないようです。

<pre>import numpy as np
import matplotlib.pyplot as plt

field=np.linspace(-np.pi/2,np.pi/2,100)
circle=np.linspace(0,2*np.pi,100)
theta=60*np.pi/180
gamma=45*np.pi/180

r_shift=0.9
r=1.5*np.sin(field+np.pi/2)**2
x0=r*np.cos(field)
y0=r*np.sin(field)
# rotate around x-axis to angle gamma
# [1    0           0      ]
# [0 cos(gamma) -sin(gamma)]
# [0 sin(gamma)  cos(gamma)]
y=y0*np.cos(gamma)
# displace in x to r_shift
x=x0+r_shift
# rotate around y-axis to angle theta
# [cos(theta) 0  sin(theta)]
# [0          1      0]
# [sin(theta) 0  cos(theta)]
x=x*np.cos(theta)

fig,ax=plt.subplots()
ax.set_box_aspect(1)
ax.plot(np.cos(circle),np.sin(circle),color='k')
ax.plot(x0,y0)
ax.plot(x,y)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_xlim(-2,2)
ax.set_ylim(-2,2)

plt.show()

私が試したこと:

(0,0)で回転を実行しますが、上記のコードがフィールドラインを表示する場所に正しく変換および回転していないようです。

解決策 1

球の表面の特定の位置に垂直な軸を中心に配列を回転させたいのですが、その方法がわかりません。 例として、以下のコードは一連の点 (双極子磁力線) を作成し、それを球の中心から離してシフトし、XY 平面である角度まで回転します。 この位置で、磁力線を球の表面に垂直な軸を中心に任意の角度に回転させたいと考えています。

以下のコードでは、Python の NumPy ライブラリを使用しています。 NumPy は、配列を処理するために使用されます。 また、行列で作業するための関数もあります。 ここでは回転を行っているため、NumPy ライブラリを使用しているのは、回転に使用される関数があるためです。

import numpy as np
import matplotlib.pyplot as plt

field=np.linspace(-np.pi/2,np.pi/2,100)
circle=np.linspace(0,2*np.pi,100)
theta=60*np.pi/180

r_shift=0.9
r=1.5*np.sin(field+np.pi/2)**2
x0=r*np.cos(field)+r_shift
y0=r*np.sin(field)
# rotate around the y-axis
x=x0*np.cos(theta)
y=y0

fig,ax=plt.subplots()
ax.set_aspect('equal','box')
ax.plot(np.cos(circle),np.sin(circle),color='k')
ax.plot(x,y)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_xlim(-2,2)
ax.set_ylim(-2,2)

plt.show()

これは、オイラー角またはロドリゲスの公式の助けを借りて行うことができます。 上記のコードでは Rodriguez の公式を使用しています。

オイラー角: オイラー角シーケンスは、航空機、ドローン、アニメーションなどの 3 次元空間内のオブジェクトの向きを記述するために一般的に使用される主軸を中心とした 3 つの回転のシーケンスです。

ロドリゲスの式: この式は、ベクトルまたは行列をある角度だけ回転させるために使用されます。 上記の例では、ロドリゲスの回転式を使用しました。

r=1.5*np.sin(field+np.pi/2)**2.

コメント

タイトルとURLをコピーしました