2

行列も四元数もわからないけど空間で回転したい!!

156
0
$$\newcommand{no}[0]{\Vert} \newcommand{v}[1]{\vb*{#1}} $$

はじめに

こんにちは!競技数学と競プロが好きな高校生のButterFlvです.
内容はタイトルの通りです.

経緯

複素数の積は平面での回転相似変換と対応するというなかなか面白い性質を持っています. ここで空間だとどうなるか気になって四元数行列などを調べていたのですが, 普通に理解が難しくて諦めました. なので自分で考えてみたいと思います.

まずは複素数から

複素数がうれしい理由

$z$複素数であるとは, 実数の組$a,b$虚数単位$i:=\sqrt{-1}$を用いて$z=a+bi$と表されるということです. 和(差)は各成分の和(差), 積は展開して虚数単位の定義から計算, 商は共役な複素数($\overline{z}:=a-bi$)を二項に掛けて積と定数倍に帰着して計算します.
今回注目するのは積の性質で, 2つの複素数をかけるとと計算結果の複素数は絶対値が二つの積, 偏角が和となっていることから回転が記述できるわけです.

積の見方をすこし変える

さて, ここから三次元に複素数の積の考え方を拡張するわけですが, ひとつ回転への解釈を加えておきます.

複素数$z$を掛けるという操作は, $1$が表す点をつまんで$z$が表す点に移動させるときにつられてほかの点も移動するような操作である.

この解釈があると, 偏角を足したり絶対値を掛けたりするというイメージだけでは表現しにくい操作も表現できるようになります.

"つられて"動くとはどういうことか(本質部分)

紙に二つ小さな穴をあけて片方の穴をコンパスなどで固定し, もう片方の穴に鉛筆などを通して動かすことを想像してください. これがつられて動くということです.

(+α)自由度をひとつ増やす

ここは完全に後のためですが, 二つ前の節では積を$1\to z$に移動する操作という解釈をしていますがこれを二つの複素数$\alpha,\beta$$\alpha\to\beta$としてみても同じような操作ができることが確認できます.($\dfrac{\beta}{\alpha}=\dfrac{z}{1}$が成立しているとき, 一致する操作となります.)

自然に三次元へと拡張してみる

三次元で"つられて"動くとはどういうことか

三次元になると紙では厳しいので地球儀を使ってみましょう. ただし, どんな向きでも自由に回転できるタイプが必要です. (僕は持っていません)
始点と終点を指定して$\alpha\to\beta$のように移動してみましょう. これがつられて動くということです.
ただし, ここで一つ注意点があります. それは移動するときは最短ルートでなければならないということです. 動かすときに地球儀上の様々なルートを通っていると, ルートごとに地球儀の最終的な状態が変わっていることに気が付くかもしれません. 2つの点と操作とをちゃんと結びつけるには操作に制約をつける必要があります.

始点と終点と中心を含む平面に注目してみる("最"本質部分)

もうすこし地球儀で遊んでみましょう. 始点と終点と中心を含む平面を考え, それを垂直に見ながら回転してみてください. こうすることで, この視線が回転の軸と一致していることがわかると思います. 表現を変えると, 平面にそれぞれの点を垂直に射影すると, その平面において複素数平面のときと同様な回転をしているということになります!!

なぜ前章で自由度を1つ増やしたのか

前節を踏まえると見えてくるのですが, 始点を固定してしまうと回転の軸を, 始点に垂直な向きにしか取れなくなってしまうからです.

数式による表現

あとはもうこの感覚を数式に落とし込むだけです. 2つのベクトル$\vb*{a},\vb*{b}$を用意して回転作用素$R(\vb*{a},\vb*{b})$を定義し, $\vb*{p}$に作用させてみましょう. 内積と外積は知っている前提でいきます. 知らないふりをしたほうが良い記事になるのではと思いましたが便利すぎたので諦めました.

だいたいの流れ

  1. $\vb*{p}$をいい感じに3つの直交するベクトルに分解する. ($x$軸,$y$軸,$z$軸を取り直す.)
  2. 変換後の$x$軸と$y$軸に注目して複素数の積と同じように回転を計算する.
    このあとのパートはなるべく図形的表現を避けて数式処理をしていきます.

導出パート

$\vb*{p}$が以下の性質を満たす3つのベクトル$\v{e_x},\v{e_y},\v{e_z}$で,

(使いません)

$\no\v{e_x}\no=\no\v{e_y}\no=\no\v{e_z}\no=1$
$\v{e_x}\times\v{e_y}=\v{e_z}$
$\v{e_y}\times\v{e_z}=\v{e_x}$
$\v{e_z}\times\v{e_x}=\v{e_y}\quad (x,y,zがこの順に循環するような関係)$

$\v{p}=x\v{e_x}+y\v{e_y}+z\v{e_z}$と表せるとします. ($\v{p}$が指す位置は空間の直交座標における点$(x,y,z)$と対応します.)
コンピュータに計算させるとすれば, これが入力になります.
また以下のように3つのベクトル$\v{f_x},\v{f_y},\v{f_z}$を定めてみます.

$\v{f_x}:=\dfrac{\v{a}}{\no\v{a}\no}, \ \v{f_y}:=\v{f_z}\times\v{f_x}, \ \v{f_z}:=\dfrac{\v{a}\times\v{b}}{\no\v{a}\times\v{b}\no}$

この3つのベクトルは$\v{e_x},\v{e_y},\v{e_z}$が満たすもととまったく同じ条件を満たします. ただ, 定義からわかるように$\v{f_x}$$\v{a}$を長さ$1$にしたもの,$\v{f_z}$は位置$\v{0},\v{a},\v{b}$を含む平面に垂直な長さ$1$のベクトル,$\v{f_y}$は前ふたつに垂直なベクトルになっています. (つまり, 向きが変わった直交座標です.)
このように定めることで以下のかなりうれしい情報が得られます.

$\v{p}=(\v{p}\cdot\v{f_x})\v{f_x}+(\v{p}\cdot\v{f_y})\v{f_y}+(\v{p}\cdot\v{f_z})\v{f_z}$

つまり, もとめたい成分の単位ベクトルと, もとのベクトルとの内積が成分と一致しているということです. これは単位ベクトルを座標の軸に沿わせている場合では取るに足らない性質ですが, そうでないときはかなり役に立ちます. (ただし, 内積とスカラー倍は入れ替えてはいけないことに注意です. 右辺が$3\v{p}$となってしまうことからも明らかだと思います.)
ここで$\v{f_x}$$\v{f_y}$の係数に注目すると軸に垂直な平面における座標になっているのでここで複素数の積っぽい変換をしてあげれば良さそうということになります. $\v{b}$のそれぞれの成分も内積で書けること, $\v{a}$の大きさが影響することに注意しながら計算すると変換後の位置ベクトル$R(\v{a},\v{b})\v{p}$を計算しましょう.

$$\begin{aligned} (p_x,p_y,p_z)&:=(\v{p}\cdot\v{f_x},\v{p}\cdot\v{f_y},\v{p}\cdot\v{f_z}) \\ (b_x,b_y,b_z)&:=(\v{b}\cdot\v{f_x},\v{b}\cdot\v{f_y},\v{b}\cdot\v{f_z}) \end{aligned}$$
とおく. (ただし$b_z=0$となっている)
$(p_x+p_yi)(b_x+b_yi)=(p_xb_x-p_yb_y)+(p_xb_y+p_yb_x)i$ から
$$\begin{aligned} R(\v{a},\v{b})\v{p}&=\dfrac{p_xb_x-p_yb_y}{\no\v{a}\no}\v{f_x}+\dfrac{p_xb_y+p_yb_x}{\no\v{a}\no}\v{f_y}+p_z\v{f_z} \\ &=p_x\dfrac{b_x\v{f_x}+b_y\v{f_y}}{\no\v{a}\no}+p_y\dfrac{-b_y\v{f_x}+b_x\v{f_y}}{\no\v{a}\no}+p_z\v{f_z} \\ &=p_x\dfrac{\v{b}}{\no\v{a}\no}+p_y\dfrac{\v{f_z}\times\v{b}}{\no\v{a}\no}+p_z\v{f_z} \\ &=(\v{p}\cdot\v{f_x})\dfrac{\v{b}}{\no\v{a}\no}+(\v{p}\cdot\v{f_y})\dfrac{\v{f_z}\times\v{b}}{\no\v{a}\no}+(\v{p}\cdot\v{f_z})\v{f_z} \end{aligned}$$

よくみたら自明な式が出てきてしまいましたね(汗)
つまりベクトルの成分だけ抜き出してベクトルの向きを変えて成分を付け直す, みたいなことをすればよかったというわけでした.
ということで,

ちゃんと定義

回転作用素 R(a,b)

$\v{0},\v{a},\v{b}$を含む平面を$\alpha$としたとき, 任意の点について$\alpha$に射影したときに$\v{0}$を中心とした回転相似変換となっており,$\alpha$との距離が変化せず,$\v{a}$$\v{b}$に移っているような変換を表す作用素を$R(\v{a},\v{b})$とする. このとき,$\v{p}$$R(\v{a},\v{b})$を作用させたときのベクトル$R(\v{a},\v{b})\v{p}$は以下のようにかける.

$\quad R(\v{a},\v{b})\v{p}=(\v{p}\cdot\v{f_x})\v{g_x}+(\v{p}\cdot\v{f_y})\v{g_y}+(\v{p}\cdot\v{f_z})\v{g_z}$

ただし, $\v{f_x},\v{f_y},\v{f_z},\v{g_x},\v{g_y},\v{g_z}$ は以下を満たすものとする.

$\quad\v{f_x}:=\dfrac{\v{a}}{\no\v{a}\no}, \ \v{f_y}:=\v{f_z}\times\v{f_x}, \ \v{f_z}:=\dfrac{\v{a}\times\v{b}}{\no\v{a}\times\v{b}\no}$

$\quad\v{g_x}:=\dfrac{\v{b}}{\no\v{a}\no},\ \v{g_y}:=\dfrac{\v{f_z}\times\v{b}}{\no\v{a}\no},\ \v{g_z}:=\v{f_z}$

複数の点に作用させたいときは$\v{f_x},\v{f_y},\v{f_z},\v{g_x},\v{g_y},\v{g_z}$をあらかじめ計算しておくことで計算のボトルネックとなる浮動小数点数の掛け算の回数を減らすことができますね. ちなみにこの場合, 個別ケースに対して$18$回の掛け算が必要なのでもう少し減らしたいところですね~
でも表現のわかりやすさで勝るケースもあるはず...!

さいごに

残念ながら今回は四元数へのつながりは見出すことはできませんでしたが, ゆる~く, ユニークな記事にはなったのではないかなと思います. 書きながらとても楽しめたのでよし!ということでここまで読んでいただきありがとうございます.

追記 (2025/01/24)

現状の表示より全然いい表示が見つかったので書きます.
$R(\v{a},\v{b})$の定義は同じです.

R(a,b) のいい感じの表示

$\quad R(\v{a},\v{b})\v{p}=C\v{p}+S(\v{d}\times\v{p})+(\v{d}\cdot\v{p})\left((1-C)\v{d}\right)$

ただし,

$\quad \v{d}=\dfrac{\v{a}\times\v{b}}{\no\v{a}\times\v{b\no}}$

$\quad C=\dfrac{\v{a}\cdot\v{b}}{\no\v{a}\no^2}$

$\quad S=\dfrac{\no\v{a}\times\v{b}\no}{\no\v{a}\no^2}$

$\v{d}=\dfrac{\v{a}\times\v{b}}{\no\v{a}\times\v{b\no}}$は前章での$\v{f_z}$に対応します. ここで$\v{f_x}$$\v{f_y}$を固定せず, $\v{f_x}$$\v{p}$を平面に射影したものと定めて $\v{f_y}$は他2つに垂直になるように取っているのと同じようになります.

$\v{a},\v{b}$が平面において対応する複素数を$\dfrac{\beta}{\alpha}=C+Si$となるように実数$C,S$を取ります. これは原点さえ一致していれば軸の取り方によりません. 極形式を思い浮かべると$C=\dfrac{\v{a}\cdot\v{b}}{\no\v{a}\no^2},S=\dfrac{\no\v{a}\times\v{b}\no}{\no\v{a}\no^2}$であることがわかります.

$\v{p}$を平面に射影した点は$\v{p}-(\v{d}\cdot\v{p})\v{d}$と書けます. $\v{d}$の成分を取り出してその分引いています. 平面においてこのベクトルを実軸と考えるので$\v{e_x}$とおいておきましょう. 虚軸は$\v{e_y}=\v{d}\times\v{e_x}$です. これらの長さは$1$とは限りませんが$\no\v{d}\no=1$なので$\no\v{e_x}\no=\no\v{e_y}\no$となります.
$$\begin{aligned} R(\v{a},\v{b})\v{p}&=C\v{e_x}+S\v{e_y}+(\v{d}\cdot\v{p})\v{d} \\ &=C(\v{p}-(\v{d}\cdot\v{p})\v{d})+S\v{d}\times(\v{p}-(\v{d}\cdot\v{p})\v{d})+(\v{d}\cdot\v{p})\v{d} \\ &=C\v{p}+S\v{d}\times\v{p}+(\v{d}\cdot\v{p})\left((1-C)\v{d}\right) \end{aligned}$$
$\v{d},C,S,S\v{d},(1-C)\v{d}$を前計算しておけば$1$ケースごと$15$回の乗算ですみます!

投稿日:123
更新日:124
OptHub AI Competition

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。

投稿者

数学とか競プロとか Twitter -> @ButterFlv_beats

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中