プログラムな日常>ウェブプログラム作品集>
回転の軸を求めるもう一つの方法
(another way to know the axis)
matrix
vector to evaluate
vector as a check

【使い方】
  1. まず、一番上のテキストエリアに、3×3 の直交行列を作ります。 これは、まず「m_random」を、次に「to orthogonal」を押すことで完結します。 「to orthogonal」は、直交行列を保証するものです。 これは各軸が直交すること、各軸のベクトルの長さが1であること、さらに、行列式が正である(直交行列の本来の条件ではありませんが)ことを保証します。 「m_random」を使わず、任意の値を書き込むこともできます。
  2. まず「v_random」を、次に「to axis」を押すことで、上に作られた直交行列で不変の「軸」を求めます。 このステップが、このページでご説明する方法によるものです。 「v_random」を使わず、任意の値を書き込むこともできます。 「to normal」で長さを1にできますが、必須のステップではありません。
  3. 「vector to evaluate」に置かれるベクトルに「matrix」を作用させることが「v_rotate」を押すことででき、結果が「vector as a check」に入ります。 「to axis」が押されてほぼ回転軸を得たものは、「vector to evaluate」と大差ない値が「vector as a check」に入ります。

【解説】

多次元の回転に関してご紹介した 前回のページ のプログラムは反復解法によるもので、 特に、奇数次元の最初の軸を決める部分の反復回数はかなりのものになっていました(プログラムの71~75行目)。 この反復回数は、一定の範囲までの次元で十分と思われる精度を得るために決めたものですが、実は三次元に関しては最初の一回だけで正確な値を得ます。 なお、ここで得られる L の最初の列は、回転の軸に相当する単位ベクトルになっています。

逆に、軸が見つかれば、この第一ステップで求める L は、この軸を第一の列成分とするテキトーな直交行列とすることができます。 また、L が知れれば、O = L ・ M ・ L-1 なのですから、第一ステップの M を求めることもできます。 してみると、軸がカギということになります。 前々回のページ で回転の軸を見つける考え方をご説明しましたが、それをプログラムとしてご紹介することにしました。

回転の軸を見つける解法を良く考えてみたところ、思い付いたことは次のイメージで説明できます。

回転させては中点を求める操作を2回行い、最後にもう1回、回転させます。 図の青い三角形とオレンジの三角形は相似になっているので、二つの点を延長した外分によって軸に属する一点を知ることができます。 あるいは、最後の回転はしなくても、青と緑の相似比を二乗すれば青とオレンジの相似比が得られます。

この方法によるこのページのプログラムでは、確かに三次元に限れば反復なしで解は得られます。 五次元以上では一度では求まりませんが、かなりの回数を反復すれば、求まることは求まるようでした。 五次元以上の事情というのはなかなかイメージしづらいですが、こんな感じでしょうか?

(最初のベクトルの設定に)乱数を使うなど、面倒な部分もあり、計算の手間において特に優れる方法ではないかも知れませんが、理解し易い、面白い方法だとは思います。