表現行列③ 回転行列

表現行列③ 回転行列

回転行列

回転行列の定義

 ベクトルを $x$ 軸から反時計周りに角度 $\theta$ だけ 回転 (rotation) する表現行列は
 
\[R=\begin{bmatrix}\cos\theta&-\sin\theta\\
\sin\theta&\cos\theta\end{bmatrix}\tag{1}\]
で与えられます。行列 $R$ を単位ベクトル $\begin{bmatrix}1\\0\end{bmatrix}$ に乗じると、
 
\[\begin{bmatrix}\cos\theta&-\sin\theta\\
\sin\theta&\cos\theta\end{bmatrix}
\begin{bmatrix}1\\0\end{bmatrix}
=\begin{bmatrix}\cos\theta\\\sin\theta\end{bmatrix}\tag{2}\]
となりますが、この式は半径 $1$ の円周上の点を表しています。

 Python で回転行列を定義して、単位ベクトル $\begin{bmatrix}1\\0\end{bmatrix}$ を反時計周りに $60^\circ$ 回転させてみます。予め 関数ライブラリ にある coordinate() と visual_vector() を実装しておいてください。

# SLA_023-1

import numpy as np
import matplotlib.pyplot as plt

def rotation(x, t, deg = False):
    if deg == True:
        t = np.deg2rad(t)
    a = np.array([[np.cos(t), -np.sin(t)],
                  [np.sin(t),  np.cos(t)]])
    ax = np.dot(a, x)        
    return ax

# FigureとAxesを作成
fig, ax = plt.subplots(1, 1, figsize=(5, 5))

# 座標を設定
coordinate(ax, [-2, 2], [-2, 2])

# ベクトルの始点
loc = np.array([0, 0])

# ベクトルv0
v0 = np.array([1, 0])

# ベクトルv0を回転行列aで変換
v1 = rotation(v0, 60, deg = True)

# ベクトルv0,v1を表示
visual_vector(ax, loc, v0, color = "red")
visual_vector(ax, loc, v1, color = "blue")

plt.show()

 Matplotlib 回転行列 (rotation matrix) によるベクトルの回転
 

カラー図解 最新 Raspberry Piで学ぶ電子工作 作って動かしてしくみがわかる (ブルーバックス)

新品価格
¥1,296から
(2019/8/21 23:40時点)

回転行列による円のプロット

 初期座標 $(1,0)$ に回転行列 $R$ を連続作用させて円を描いてみます。

# SLA_023-2

# FigureとAxesを作成
fig, ax = plt.subplots(1, 1, figsize=(5, 5))

# 座標を設定
coordinate(ax, [-2, 2], [-2, 2])

# ベクトルvの初期値
v = np.array([1, 0])

# ベクトルvを角度pi/12ずつ回転して一周させる
for i in range(24):
    v = rotation(v, np.pi/12)
    ax.scatter(v[0], v[1], color = "red")

plt.show()

 Matplotlib 回転行列 (rotation matrix) による円周描画

放物線の回転

 方程式で表された曲線も回転行列で任意の角度に回転させることができます。以下のコードは放物線 $P_0(x)=x^2$ を反時計回りに $90^\circ$ 回転させます。

# SLA_023-3

# FigureとAxesを作成
fig, ax = plt.subplots(1, 1, figsize=(5, 5))

# 座標を設定
coordinate(ax, [-2, 2], [-2, 2])

# 放物線のデータを作成
x = np.linspace(-2, 2, 33)
y = x ** 2

# xとyを縦軸方向に連結して行列を作成
p0 = np.vstack((x, y))

# 放物線p0を左に90°回転
p1 = rotation(p0, np.pi/2)

# p0とp1をAxesにプロット
ax.plot(p0[0], p0[1], label = "P0", color = "blue")
ax.plot(p1[0], p1[1], label = "P1", color = "darkorange")

# 凡例を表示
ax.legend(loc = "lower right")

plt.show()

 回転行列による2次関数の左45°の回転