いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

四元数(しげんすう、クオータニオン)を使ってみる(4)

 前回までに四元数を使って空間の点を回転する方法について調べました。再度載せておきます。
f:id:Inuosann:20200930173222p:plain:w450
試してみましょう……と言いたいのですが、手作業だと絶望的な気分になります。4項の和×3項の和×4項の和 で、勘弁です。Pythonで計算できるみたいなので、調べてやってみました。
まず四元数を使えるようにします。
Numpyをインストールしていなければ
pip install numpy
を(ウィンドウズならDOS窓で)実行し、インストールします。次に四元数
pip install numpy-quaternion
四元数を使えるようなります。あとは下のプログラムの通りです。
conj()は共役四元数を求める関数です。

import math
import numpy as np
import quaternion
x = math.pi / 3 #回転角
v = np.array([-1, -1, 2]) #回転軸
d = np.linalg.norm(v) #ベクトルの長さ
w = v / d #長さを1にする
s = math.sin(x / 2) #xは回転角
c = math.cos(x / 2)
w1 = s * w
qt1 = np.quaternion(c , w1[0], w1[1], w1[2])
qt2 = np.quaternion(0, 1, 2, 3) #もとの点
qt = qt1 * qt2 * np.conj(qt1)
print('qt = ', qt)
sys.exit()

実行結果は……
qt = quaternion(0, -2.22487373415292, 2.51776695296637, 1.64644660940673)
となりました。最初の0は関係ありません。2,3,4番目が回転後の点の座標です。

 「xy平面上の直線y=xの周りに点(2,0,0)を90°回す」などではちゃんと正しい結果がでているので多分コードや使っている式などは正しいと思います。関数にしておけば簡単に点を回転させることができます。