はじめに
剛体変換って、「任意点回りの回転に変換できるんじゃないか」と思って、
まずは、2次元で計算してみるかって記事です。
2次元の剛体変換を任意点周りの回転に変換
剛体変換行列を とします。
回転行列を 、平行移動行列を とします。
任意点周りの行列は と書けるので、以下が成り立ちます。
式 の左辺を計算します。
式 より、以下が成り立ちます。
回転角を とすると、 であるので、 と求まります。
ただし、 です。 を除いているのは、式 の計算における逆行列が存在するようにです。
の時は回転していないので、この時の剛体変換は単なる平行移動変換です。
を を使って書き直します。
式 より、以下が成り立ちます。
を計算します。
式 を式 に代入します。
以上より、 が求まったので、任意点回りの回転行列が求まりました。
SymPyで検算
式 をSymPyで検算してみました。
from sympy.algebras.quaternion import Quaternion from sympy import * init_printing() var('r_0,r_1,r_2,r_3,theta') r_0 = cos(theta) r_1 = sin(theta) r_2 = -sin(theta) r_3 = cos(theta) R = Matrix([ [r_0, r_2 ], [r_1, r_3 ], ]) I = Matrix([ [1, 0 ], [0, 1 ], ]) M = I - R M_det = M.det() M_det = factor(M_det) answer = solve(M_det,theta) display(answer) display(m_det) M_inv = M.inv() M_inv = simplify(M_inv) M_inv = M_inv.subs([(sin(theta), 2 * sin(theta/2) * cos(theta/2)), (2 - 2 * cos(theta), 4 * sin(theta/2) ** 2)]) M_inv = simplify(M_inv) M_inv = M_inv.subs([(1/tan(theta/2),cot(theta/2))]) display(M_inv)
プログラムの実行結果