幾何学的代数勉強会が落ち着き定期開催がなくなりました。やはり応用例が少し乏しくどんなことに応用できるのか、どんなふうに使えるのか、というところが気になっているところで GA Sandbox を見つけました。そのままではビルドできなかったので、ビルド方法とどんなサンプルが含まれているかについてシェアしていきたいと思います。
GA Sandboxとは
勉強会の中でDorst本と勝手に呼んでいる Geometric Algebra for Computer Scienceのサンプルコードです。サンプルコードのマニュアルの中で書籍のことをGA4CSと略しているので今後はこの呼び方を使います。
実行時のスクリーンショットもSandboxのページから参照できます。GA4CSを手元に持っている人であれば見たことのある図が並んでいることがわかるかと思います。ただし、このスクリーンショットは全てではなくごく一部ですし、実際に実行してみるとマウスでドラッグしたり条件を変更したりできるインタラクティブなプログラムになっています。動かしたことがない方はぜひ実際に見ていただきたいです。
例
まずはサンプルを見てみましょう。全部試せたわけではないのですが、動きのあるものを2つだけピックアップします。
chap12ex3 (GA4CS p.351)
マーカーをつけた人が踊っているのをキャリブレーション済みの複数のカメラで撮影し、撮影された画像から各マーカーの3次元座標を再構成する例です。2つのカメラ間で再構成可能な点をピックアップしていき、最終的には複数(n個以上)のカメラから見えている点を表示するというプログラムです。エピポーラ線を外積と縮約によって求めています。
動画にあるとおり視点や、カメラからのレイの表示有無、何個以上のカメラから見えている点を表示するかなどを変更できます。
chap15ex3 (GA4CS p.464)
ユークリッド射影(Eucilidean Projection)の例です。緑の円が紫の平面上に射影されて水色の円となっています。各点はドラッグで自由に動かすことができます。円を平面に射影することで楕円になるのではなく円になる、ことが動かすことでよりイメージがつきやすくなると思います。
ビルド方法
通常であればReadmeを見てもらえば済みそうなところですが、かなりハマりどころがありそのままではビルドできないため、ビルド手順を記述します。ただし、一部のプログラムはまだビルドに成功していないため、該当プログラムについてはビルドを飛ばすようにしています。
私はUbuntu 16.04を使用していますが、他のディストリビューション/バージョンの場合は適宜インストールするパッケージを読み替えてもらえれば、他の環境でも動作するはずです。
ソースコード
GA Sandbox からリンクを辿ってSourceForgeからソースをダンロードできます。執筆時点のバージョンは1.0.7です。
必要パッケージのインストール
下記パッケージのインストールが必要です。
sudo apt install freeglut3-dev libantlr-dev libopencv-dev libfltk1.3-dev
念の為に必要ファイルとパッケージの対応も記しておきます。
freeglut3-dev
../../libgasandbox/glut_util.cpp:26:22: fatal error: GL/glut.h: そのようなファイルやディレクトリはありません
#include <GL/glut.h>
libantlr-dev
../../libgasandbox/e2ga_mv_lexer.hpp:4:28: fatal error: antlr/config.hpp: そのようなファイルやディレクトリはありません
#include <antlr/config.hpp>
libopencv-dev
extcalibrefine.cpp:25:27: fatal error: opencv/cxcore.h: そのようなファイルやディレクトリはありません
#include <opencv/cxcore.h>
libfltk1.3-dev
glwindow.h:9:29: fatal error: FL/Fl_Gl_Window.H: そのようなファイルやディレクトリはありません
#include <FL/Fl_Gl_Window.H>
Makefileの修正
ここからが本番です。大半のプログラムのビルドにMakefileの修正が必要になります。下記のコマンドで修正します。gcc呼び出し時の引数の順番が誤っていてリンク時に失敗することをsedで順番を変えて解消しています。また、OpenCVを使用するサンプル(chap10ex3, chap11ex2, chap12ex2, chap14ex4)のビルドがうまく通せていないため、ここではビルド対象から外しています。
# gccの引数順番の修正 find ./ -name Makefile.am | xargs sed -i -r 's%= (.+) ([\./[:alnum:]]+libgasandbox\.a)[[:blank:]]*$%= \2 \1%g' sed -i -r 's%chap12ex3_LDADD = \$\(OPENGL_LIBS\) \$\(GLUT_LIBS\)%chap12ex3_LDADD = %g' chap12/ex3/Makefile.am sed -i -r 's%\$\(ANTLR_LIBS\)%\$\(OPENGL_LIBS\) \$\(GLUT_LIBS\) \$\(ANTLR_LIBS\)%g' chap12/ex3/Makefile.am sed -i -r 's%= (.+) ([\./[:alnum:]]+libgasandbox\.a)%= \2 \1%g' chap14/ex1/Makefile.am # OpenCVを使用するサンプルを除外 sed -i -r 's/ ex3//g' chap10/Makefile.am sed -i -r 's/ ex2//g' chap11/Makefile.am sed -i -r 's/ ex2//g' chap12/Makefile.am sed -i -r 's/ ex4//g' chap14/Makefile.am
OpenCVのサンプルコードのビルド方法がわかったら追記するようにします。もし成功した方がいましたらご連絡いただけると大変助かります。
ビルド
autotoolsを使用してビルドします。私はautotoolsにあまり馴染みがなかったのでビルドを通すまで苦労しました。またmakeにつけているオプションはビルド時に参照されてgccに引数として渡されます。
aclocal automake -a -c autoconf ./configure make OPENGL_LIBS="-lGLU -lGL" AQSIS_FLTK_GL_LIBS="-lfltk -lfltk_gl"
最後のmakeはしばらく時間がかかりますが、エラーなく終われば各ディレクトリに実行バイナリが生成されます。サンプルによっては同じディレクトリにあるファイルを参照しているため、バイナリのあるディレクトリに移動した上で実行する必要があります。
最後に
GA Sandboxには多くのサンプルコードが含まれています。書籍に記載のある数式だけを追っていくのもよいですが、GA Sandboxのように動かしてイメージをつけることでより理解が進むのではないでしょうか。ビルドにあたってはハマりどころが多いので、本記事が多くの人の時間の節約につながれば幸いです。