2016年12月20日 | ブログ記事

ベクトルの回転~~線型変換の一例として

hatasa-y

こんにちは。traP Advent Calendar 2016 20日目担当のhatasa-yです。

traPでは現在titeQuestのプログラムを担当させていただいています。

いやークリスマスまであと5日ですよー!みなさん予定入ってますか?

僕は予定入ってますよー

数学&進捗

というわけで僕からは線型代数について話したいと思います。(題名と違うじゃないか!)

線型代数とはベクトル空間と線型写像を中心とした代数学の一分野であります。

簡単に言うと、ベクトル空間とは和とスカラー倍の2種類の演算(線型演算)が定義できている空間のことで、線型変換とは線型演算を保存するように、ベクトル空間からベクトル空間への対応のことをいいます。(詳しく知りたい人は線型代数の本を見てください)

理系学部の大学一年生では微分積分学と共に習っていると思います。理工系だけでなく社会科学系の学部でも線型代数の講義が行われていることもあるでしょう。

線型代数は幅広いところで応用されています。プログラムで座標を考える際はかなり線型変換が重要になってきます。ここでは座標の線型変換の一例として回転について紹介したいと思います。

2次元における回転

高校数学では行列 [cosθsinθsinθcosθ]\begin{bmatrix} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{bmatrix} の定める線型変換 [xy][xy]=[cosθsinθsinθcosθ][xy]\begin{bmatrix} x \\ y \end{bmatrix} \mapsto \begin{bmatrix} x' \\ y' \end{bmatrix} = \begin{bmatrix} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} が平面 R2\mathbb{R}^2 の原点を中心とした角 θ\theta の回転であると習ったと思います。 I=[1001],J=[0110]I=\begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}, J=\begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix} とおくと [cosθsinθsinθcosθ]=Icosθ+Jsinθ\begin{bmatrix} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{bmatrix}=I \cos \theta + J \sin \theta であるが、 J2=[0110][0110]=[1001]=IJ^2=\begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix} \begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix} = \begin{bmatrix} -1 & 0 \\ 0 & -1 \end{bmatrix}=-I I=1I=1 のようにして実数としてみると J=iJ=i となります。

よって平面 R2\mathbb{R}^2 を複素数平面 C\mathbb{C} として考え、 z=x+iy,z=x+iyz=x+iy, z'=x'+iy' とおくと zz=(cosθ+isinθ)zz \mapsto z'=( \cos \theta + i \sin \theta )z 人によってはこちらを高校数学で習った方もいらっしゃると思います。

回転という概念を用いて角 θ\theta 及び三角関数 cosθ,sinθ\cos \theta, \sin \theta を定義することができますがここでは省略します。

3次元における回転

2次元における回転はできたので、3次元についてはどうだろうかと考える人は多いと思います。

実は3次元でもロドリゲスの公式と呼ばれる回転を表す線型変換はあります。 [cosθ+n12(1cosθ)n1n2(1cosθ)n3sinθn1n3(1cosθ)+n2sinθn2n1(1cosθ)+n3sinθcosθ+n22(1cosθ)n2n3(1cosθ)n1sinθn3n1(1cosθ)n2sinθn3n2(1cosθ)+n1sinθcosθ+n32(1cosθ)]\begin{bmatrix} \cos \theta + n_1^2(1- \cos \theta ) & n_1 n_2 (1- \cos \theta ) - n_3 \sin \theta & n_1 n_3 (1- \cos \theta ) + n_2 \sin \theta \\ n_2 n_1 ( 1- \cos \theta) + n_3 \sin \theta & \cos \theta + n_2^2 (1- \cos \theta) & n_2 n_3 (1- \cos \theta ) -n_1 \sin \theta \\ n_3 n_1 (1- \cos \theta ) -n_2 \sin \theta & n_3 n_2 (1- \cos \theta ) + n_1 \sin \theta & \cos \theta + n_3^2 (1- \cos \theta ) \end{bmatrix} ただし n=[n1,n2,n3]\mathbf{n}= [n_1, n_2, n_3] は大きさ1の回転軸ベクトルである。

初めて見たときは流石になんだこれ!?って思いました。(今でもそうですが)

これについて説明する気はありません。なぜかというとめんどくさいからです。

というわけでこの記事は終了です。

というのはあまりにも酷すぎるのでなんでこんな式になるか軽く説明しておきましょう。

このような図を考えます。

ベクトル r\mathbf{r} を回転軸ベクトル n\mathbf{n} の回りに角 θ\theta 回転させたベクトルを r\mathbf{r'} とし、 OP=r,OQ=rOP=\mathbf{r}, OQ=\mathbf{r'} とします。

r=OM+MT+TQ\mathbf{r'}=OM+MT+TQ であるので r=n(n,r)+(rn(n,r))cosθ(r×n)sinθ\mathbf{r'}=\mathbf{n}(\mathbf{n}, \mathbf{r})+(\mathbf{r}-\mathbf{n}(\mathbf{n}, \mathbf{r})) \cos \theta - (\mathbf{r} \times \mathbf{n}) \sin \theta となり r=rcosθ+n(n,r)(1cosθ)(r×n)sinθ\mathbf{r'}=\mathbf{r} \cos \theta +\mathbf{n}(\mathbf{n}, \mathbf{r})(1-\cos \theta) - (\mathbf{r} \times \mathbf{n}) \sin \theta r=[x,y,z]\mathbf{r'}=[x', y', z'] , r=[x,y,z]\mathbf{r}=[x, y, z] , n=[n1,n2,n3]\mathbf{n}=[n_1, n_2, n_3] としてこれを計算すると、 r\mathbf{r} から r\mathbf{r'} への変換は線形写像となり、上で述べたロドリゲスの公式となります。

3次元で回転を考える際には、必ず回転軸となるものが存在します。その軸と回転角度を設定することでどんな回転も表すことが出来ることが分かりました。実際にゲームを作るときはこの行列を使ってプログラムを書くことだと思います。

最後に

どうでしたか?読んでいても線型変換がよく分からないと思った方もいるかもしれませんが、行列を使って回転を表すことができ、プログラムにも活用できるという紹介でした。

明日はcrotkaz, naosan, parumaさんの3本となります。お楽しみに。

この記事を書いた人
hatasa-y

数学をしています。最近はTeXで遊んでいたりしている。

この記事をシェア

このエントリーをはてなブックマークに追加

関連する記事

2017年12月3日
素数判定をしてみよう!!
youjo_tape
2017年11月30日
Negative Thinking
phi16
2017年11月14日
IBIS2017参加報告
Keijan
2017年11月8日
数学と仲良くなりたい人へ
60
2017年11月2日
積分ってなんだろう?区分求積法からリーマン積分へ
Azon
2017年4月27日
合同変換及び運動について【新歓ブログリレー2017 24日目】
hatasa-y

活動の紹介

カテゴリ

タグ