言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

回転しない脳

昨日からずっとコンパスと定規を手に悩んでいるが解決しない。

僕が途中で数学が嫌になったのは、沢山覚えないといけない公式のせいだ(言い訳)。サインコサインやベクトルの内積、行列の乗法など、一度は試験の為に覚えた記憶があるが、今全く思い出せない。つまり、あの勉強の時間は無駄だった。とはいえ、今でもたまにそういう公式が必要な事があるので本を見ながらやるのだが、困る事がある。それは、自分で公式からプログラムを作る分には良いが、他の人のコードが何やってるのか判らない事だ。

他人のコードを読むためには公式を覚えているだけではなく、意味も分かっていなくてはならない。という事で、今更ながら一から自分で公式とその証明を作る事にした。特に、CG で頻出する様々な操作、回転、平行移動、投射等が当面必要だ。作るに当たって、次のような制限を課した。

  • サインコサインは使わない。
  • 出来るだけ幾何的に解決する。
  • 意味不明な式の変形を使わない。

サインコサインを使わないというのは、無用な公式を使いたく無いのと、必要を感じないから。もちろん、30度図形を右に回すというような時は仕方が無いが、たとえ図形の回転をしたい場合でも本当は角度なんて必要が無い。例えばキャラを誰かの方向に向かせたい時、お互いの向きの差を現すベクトル(普通は長さ 1 のベクトル)があれば十分だ。実際にプログラムの中でもわざわざ角度に変換して回転するような事をしては無用な誤差の元。回転の公式にサインコサインが混じっているのはろくに物を考えていないとしか言えない。

出来るだけ幾何的に解決するというのは、デバッグに必要だから。作ったプログラムがもしも上手く動いてくれない時、そのアルゴリズムがすざましい式の変形の後に作られた物なら、上手く動かない原因を突き止める事が出来ない。これは本当によくあるぞっとする状況だ。もしも幾何的に、つまり定規とコンパスだけで作ったアルゴリズムならば、適当に値を変えて試してやるだけで、何となくどこが問題なのか分かる。

意味不明な式の変形というのは、行列や複素数やベクトルの乗算の事だ。これは本当にどうにかして欲しい。で、どうにかなると思っている。行列は連立一次方程式つまり交点を求めるだけに使う。内積は直角の為だけに使う。複素数は必ず座標として扱う。幾何的な意味が無い事はしない。

とこうやって考え出したは良いが、いきなり最初でつまずいている。やりたい事は点の回転。点 P を単位ベクトル R だけ回転して点 Q にしたい。公式によるとその関係は、

  • (Rx * Px) + (-Ry * Py) = Qx
  • (Ry * Px) + ( Rx * Py) = Qy

(教科書的には Rx = cosθ, Ry = sin θ) になるはずだけど、これを上手く
図にする方法が浮かばなかった。ちなみに、R に関する式

  • (Px * Qx) + ( Py * Qy) = Rx
  • (Px * Qy) + (-Py * Qx) = Ry

なら割とストレートに図を描く事が出来た。