コンテナにダメージを通す方法に気付く夢
love-neniye
枯山水の庭園に、この場には似付かわしくないようなコンテナが置かれている。コンテナにしてはちょっとコンパクトなような、一辺が1.5メートルくらいの立方体だ。少なくとも3、4個は置かれていたように思う。コンテナの表面は特有のでこぼこ加工があり、Hi-uniのような臙脂色でペイントされていた。
とりあえず現在までにわかっているのは、コンテナを含む一定の円形領域に意識のフォーカスを合わせているときに(このフォーカスを合わせるアクションを「フラッシュ」と呼んでいる)、コンテナにショットを当てると、通常の半分だけコンテナにダメージが通るようになっている、ということだ。
今までこのコンテナにダメージは通らず、破壊できないオブジェクトとして存在している、と思っていた。コンテナの破壊までに至ったことはないが、このダメージを蓄積していけばいつかコンテナを壊せるかもしれない、と思う。
起床。
何を考えたのかわからないが、配偶者が「学校に遅れちゃうよ」と子供を起こし、それが嘘だと分かって子供が激昂している状況で起きたので、夢の内容の大部分を思い出せなかった。
例のギザギザ北海道タイル(最小Pisot数による双対タイル張り)の分割と内点を判定するアルゴリズムを書いたので、Quadtree art的な分割が(時間さえ許せば)できるようになった。

ギザギザの多角形として内点の判定をしているため、winding numberの計算に時間がかかり過ぎているということが課題だ。たとえばひとつの改善策として、タイルを内部に含む円を考え、明らかに外部と判定できるものは早めに除外して計算量を減らせるだろうとは思っている。
座標から角度を計算するときに(平面の)ベクトルの内積と外積を計算する必要がある。ただ、タイルのデータは複素数として持っているため、内積と外積を求めるために改めて計算方法を定義する必要はなく、複素数の積(と複素共役)があればよい。二つの複素数 z, wに対して、zの複素共役を取ったものとwとの積を計算し、その実部と虚部がそれぞれが内積と外積(の成分)になっている。
こういう計算はトリッキーに思えるかもしれないけれど、(超)複素数の積と内積や外積との関係はクリフォード代数の構成を知っていると自然に思える、気はする。
それから、角度を求めるときに逆余弦関数acosやasinを使うと、(定義域の端っこの近くで)計算の誤差が大きめになるというのをなんとなく思い出し、逆正接関数を使った。逆正接関数は多くのプログラム言語やライブラリでatan2という二変数関数として定義されている。しかし(x,y)という順序と(y,x)の順序で定義するパターンがあったりしてちょっと紛らわしい。Javascriptは(y,x)のほうだ。
acosとatan2で比較すると、atan2のほうが1桁から2桁くらい精度がよかった。とはいえ、10のマイナス14乗か15乗かというくらいのオーダーなのでacosでも充分だと思う。ただ、acosを使う方法だと外積の符号で場合分けする必要があるので(そういうことを考慮してつくられている)atan2のほうがシンプルだ。