投影幾何学的代数PGAによる3次元計算が楽で面白い
作成日: 2023-09-05
youtubeで見かけたPGAのチュートリアルを見て感動しました。3次元の座標系を計算するとき、手を動かすには複雑な概念がわさわさ出てきて嫌な気持ちになりますよね。それらが全部おなじ基底であつかえるとなると俄然楽しそうです。動画を参考にPGAの概要を紹介します。

PGAの基底は平面から始まる
初めにすべての3次元平面を表す基底を考えます。
の4本の基底の線形結合で任意の平面を表すことができます。
PGAのMeetで共通部分が求まる
PGAの演算にはいくつか種類があります。その中の1つがMeetです。Meetは基底を次のルールで計算します。
同じ基底があれば0。そうでなければ基底を並べて新しい基底にします。と略記します。
並んだ基底を1箇所入れ替えると符号を反転させます。
Meetが賢いのは、これだけで平面の共通部分である直線を計算できることです。との共通部分を求めてみましょう
なんだかあまり見慣れない形になりましたが、これが直線の表現らしいです。そもそも三次元の直線の表現ってなんだと思いましたが、どうやらPlücker座標というらしいです。
3次元の直線は向きのベクトルと直積のベクトルで表現できます。Plücker座標が次のように展開されています。
先程の共通部分では次のようになります。
点A(1, 0, 1)から点B(0, 1, 1)への直線なので、を満たしてますね!すごいです!
Meetでもっと共通部分が求まる
Meetは平面と平面の共通部分だけではありません。直線と平面の共通部分も求められます。先程の直線と平面の共通部分も求めてみましょう。
の両側に同じ基底があるともりもり消えます。計算された点のPGAでの表現は次のようになります。
ただし、wが1でないときは全体をwで割って正規化する必要があります。
直線と平面の共通部分の計算結果は点(2, -1, 1)になりました。ととをすべて満たすので間違いないですね!平面平面平面で点が求まるのはとても美しいです。
Joinでつながる点と点
ここまでは共通部分を求める演算でしたが、逆につなげる演算もできます。Meetに対して双対なJoinという演算を考えます。Joinのために、基底を反転する演算を考えます。
詳細を省きますが、↑みたいな感じです。Joinは次のように定義できます。
これを使うと点と点をつなぐことができます。A(1,0,1) B(0,1,1)を繋いでみましょう。
さっきと同じ直線の表現が無事得られました。ここまで来たら同様に平面までつなげることができます。偉いですね。
回転とか変換とか
ここまでは三次元のモノどうしの関係を扱いました。実は回転や変換などもここまでの基底で表すことができます。詳細を省きますが、直線(軸)に対する回転子は次のようになります。
回転子を使って点を回転させるには両側から挟んで積を取ります。
長くなってきたので、PGAの積やについては次のページを参照してください。チートシートや計算機もあり非常に便利なサイトです。
つまり、3次元回転でおなじみのクオータニオンもPGAの中に含まれています。いたせりつくせりです。16個の基底を簡単にこねくり回すだけで、これだけの表現ができるので感動します。
ちなみに、Rustの実装も存在します。使ってみたいですね。
おまけ
ここまでの知識で螺旋をくるくるするコードを書いてみました。行列のことを知らないで実装するのは不思議で楽しいですね。
メモ: クリフォード代数だと平面を基底にするのではなく、点を基底にして始めるほうが普通らしい?