回転行列のサンプル（2次元・3次元）のメモ

2次元や3次元空間で原点を中心に回転させるときの符号や乗算する方向が、いつも脳内で図形を描いて回転をシミュレーションしないと出てこないので、まとめておきます。特に3次元での回転の向きと符号が覚えられません。

# 2次元

回転の方向

- 点Pを反時計回りに移動させる場合
- 座標軸を時計回りに回転させる場合


```math
\begin{pmatrix} x' \\\ y' \end{pmatrix} = \begin{pmatrix} \cosθ & -\sinθ \\\ \sinθ & \cosθ \end{pmatrix} \begin{pmatrix} x \\\ y \end{pmatrix}
```

行列を使わない表現するならば

```math
x' = x\cosθ - y\sinθ \\\ y' = x\sinθ + y\cosθ 
```

です。

回転の方向が反対の場合は$ θ $に負号を付けるか、同じことですが$ \sin $の符号を反転します。これは次の3次元の場合でも同じです。

座標を横ベクトル（行ベクトル）で表現するならば

```math
\begin{pmatrix} x' & y' \end{pmatrix} = \begin{pmatrix} x & y \end{pmatrix} \begin{pmatrix} \cosθ & \sinθ \\\ -\sinθ & \cosθ \end{pmatrix}
```

のように、右からの乗算になり、行列の縦横も入れ替わります。これも3次元の場合でも同様です。

# 3次元

軸の向きは右手系とします。

- 右手の親指をx軸、人差し指をy軸としたとき、z軸が中指の方向と一致
- 地表から見て、北方向をx軸、西方向をy軸としたとき、z軸が天頂方向と一致
- 地球から見て、うお座方向をx軸、オリオン座方向をy軸としたとき、z軸が天の北極と一致

軸ごとに回転方向が考えられますが、2次元と同じ計算式になるz軸の場合を最初に書きます。

## z軸回転

回転の方向

- z軸の正の方向から見て、点Pを反時計回りに移動させる場合
- z軸の正の方向から見て、x軸とy軸を時計回りに回転させる場合

```math
\begin{pmatrix} x' \\\ y' \\\ z' \end{pmatrix} = \begin{pmatrix} \cosθ & -\sinθ & 0 \\\ \sinθ & \cosθ & 0 \\\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x \\\ y \\\ z \end{pmatrix}
```

です。

```math
R_z(θ) = \begin{pmatrix} \cosθ & -\sinθ & 0 \\\ \sinθ & \cosθ & 0 \\\ 0 & 0 & 1 \end{pmatrix} 
```

とおけば

```math
\begin{pmatrix} x' \\\ y' \\\ z' \end{pmatrix} = R_z(θ) \begin{pmatrix} x \\\ y \\\ z \end{pmatrix}
```

です。xとyだけを見れば2次元の場合とまったく同じになります。

## x軸回転

回転の方向

- x軸の正の方向から見て、点Pを反時計回りに移動させる場合
- x軸の正の方向から見て、y軸とz軸を時計回りに回転させる場合

```math
\begin{pmatrix} x' \\\ y' \\\ z' \end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 \\\ 0 & \cosθ & -\sinθ \\\ 0 & \sinθ & \cosθ \end{pmatrix} \begin{pmatrix} x \\\ y \\\ z \end{pmatrix}
```

です。

```math
R_x(θ) = \begin{pmatrix} 1 & 0 & 0 \\\ 0 & \cosθ & -\sinθ \\\ 0 & \sinθ & \cosθ \end{pmatrix} 
```

とおけば

```math
\begin{pmatrix} x' \\\ y' \\\ z' \end{pmatrix} = R_x(θ) \begin{pmatrix} x \\\ y \\\ z \end{pmatrix}
```

です。

## y軸回転

回転の方向

- y軸の正の方向から見て、点Pを反時計回りに移動させる場合
- y軸の正の方向から見て、z軸とx軸を時計回りに回転させる場合

```math
\begin{pmatrix} x' \\\ y' \\\ z' \end{pmatrix} = \begin{pmatrix} \cosθ & 0 & \sinθ \\\ 0 & 1 & 0 \\\ -\sinθ & 0 & \cosθ \end{pmatrix} \begin{pmatrix} x \\\ y \\\ z \end{pmatrix}
```

です。

```math
R_y(θ) = \begin{pmatrix} \cosθ & 0 & \sinθ \\\ 0 & 1 & 0 \\\ -\sinθ & 0 & \cosθ \end{pmatrix} 
```

とおけば

```math
\begin{pmatrix} x' \\\ y' \\\ z' \end{pmatrix} = R_y(θ) \begin{pmatrix} x \\\ y \\\ z \end{pmatrix}
```

です。

軸を変えて連続して回転させるときには$ R_x, R_y, R_z $を組み合わせて回転順に掛け算します。左からの乗算ですので、回転させる順に行列を右から書きます。最初にz軸で回転して、続けてy軸で回転させる場合には

```math
\begin{pmatrix} x' \\\ y' \\\ z' \end{pmatrix} = R_y(θ_2) R_z(θ_1) \begin{pmatrix} x \\\ y \\\ z \end{pmatrix}
```

となります。

## 赤道座標系から黄道座標系に変換する例

赤道座標系(赤経:$ α $, 赤緯:$ δ $)を黄道座標系(黄経:$ γ $, 黄緯:$ β $)に変換するには、黄道傾斜角を$ ε $として、

```math
\begin{align}
x &= \cosα\cosδ \\
y &= \sinα\cosδ \\
z &= \sinδ \\
\begin{pmatrix} x' \\\ y' \\\ z' \end{pmatrix} &= R_x(-ε) \begin{pmatrix} x \\\ y \\\ z \end{pmatrix} \\
β &= \tan^{-1} \frac{z'}{\sqrt{x'^2+y'^2}} = \sin^{-1} z' \\
α &= \text{atan2} (y', x') = \begin{cases} \tan^{-1} \frac{y'}{x'} & (x > 0) \\\ \tan^{-1} \frac{y'}{x'}+\pi & (x < 0 \space\text{and}\space y \geq 0 ) \\\ \tan^{-1} \frac{y'}{x'} - \pi & (x < 0 \space\text{and}\space y \lt 0 ) \\\ +\frac{\pi}{2} & (x = 0 \space\text{and}\space y > 0) \\\ -\frac{\pi}{2} & (x = 0 \space\text{and}\space y < 0) \end{cases} \\
\end{align}
```

## 赤道座標系から地平座標系に変換する例

赤道座標系(赤経:$ α $, 赤緯:$ δ $)を地平座標系(方位:$ A $, 高度:$ h $)に変換するには、グリニッジ恒星時を$ θ $、 観測地点の経度を$ λ $、緯度を$ φ $として、

```math
\begin{align}
x &= \cosα\cosδ \\
y &= \sinα\cosδ \\
z &= \sinδ \\
\begin{pmatrix} x'' \\\ y'' \\\ z'' \end{pmatrix} &= R_y(φ) R_z(-(λ+θ)) \begin{pmatrix} x \\\ y \\\ z \end{pmatrix} \\
h &= \tan^{-1} \frac{z''}{\sqrt{x''^2+y''^2}} = \sin^{-1} x'' \\
A &= \text{atan2} (y'', z'') \\
\end{align}
```

となります。z軸で回転させ、続けてy軸で回転させています。

最初にz軸で $ λ+θ $ 回転させているのは、地方恒星時の子午線に合わせるためです。東京であれば緯度35度ですので、この回転でx軸は南方向の高度55度付近、y軸は東の地平線方向を向きます。

次にy軸で回転させているのは緯度に応じた傾きに合わせるためです。この回転によりx軸が南方向の高度55度付近から天頂方向に変わります。y軸は東の地平線方向、z軸は北の地平線方向になります。

方位$ A $は、北が0°、東が90°になります。$ x'', y'', z'' $は右手系ですが、$ A, h $は左手系です。右手系と左手系で反転しているにも関わらず$ A $の計算式に負号がついていないのはx軸とz軸が入れ替わっているためです。

以下のようにも書けます。

```math
\begin{align}
x' &= \cos(α-λ-θ)\cosδ \\
y' &= \sin(α-λ-θ)\cosδ \\
z' &= \sinδ \\
\begin{pmatrix} x'' \\\ y'' \\\ z'' \end{pmatrix} &= R_y(φ) \begin{pmatrix} x' \\\ y' \\\ z' \end{pmatrix} \\
h &= \sin^{-1} x \\
A &= \text{atan2} (y'', z'') \\
\end{align}
```

## おまけ

`atan2`という名前の関数は`atan`($ \tan^{-1} $)とともにいろいろなプログラミング言語に標準で備わっている、`atan`をちょっと便利にした関数ですが、書き捨てスクリプトで使われそうなとても安易なネーミングセンスが気に入ってます。