ICFP日記2

さて、今日の4時が締め切りのICFP PCですが、そして昨日全く着手せずに放置していたICFP PCですが、いまらさ蛇行せずにすとんとゴールするように改良して悦に入っています。ゴールまでの距離を現在の速度で割った物を大まかな到着までの時間とし、角速度の微分量(正確には探査船の方向ベクトルとゴールの方向ベクトルの間の角のsinの値の微分量)にそれを掛けてやって、それが0を超えたか超えないかでハンドルの切り替えをするようにした。これをすると大きな弧をかいてすとんとゴールに落ちるので気持ちがいい。


障害物も避けたくなってきた。


しかしそれには「今の回転速度を維持したまま進むと15ステップ後にクレーターに突っ込むから、ちょっとハンドルを逆に切ってみるか」とかやらないといけないよね。まっすぐにレイレーシングしてもだめ。そして「次のターンクレーターに落ちる」って状態になってから慌てても回避不能だったりするのである程度先読みが必要。いや、これは面倒だ。面倒だからまっすぐレイトレーシングして最初にぶつかる障害物の視直径の大きさに応じた強さで見えている側と反対側にハンドルを切るようにすればいいか。それでいいや。


えーと。すべてのオブジェクトに対して、オブジェクトの位置と探査船の位置の差分ベクトルと探査船の方向ベクトルの外積をとって、それが障害物の半径(掛ける安全率1.1www)を下回るなら衝突すると判定する。でもって内積で距離が出るので、半径を割って視直径を出して、一番大きい物をえらぶっと。


さて、いくらを超えたら危険かな。1超えてると度に直して45度だからもうダメポだよな。あ、そうか、高速で移動中ほどハンドルの効きが悪いから危険か。hard turnしたときの角加速度が、まぁ設定によって異なるだろうけど、だいたい1度なので、距離-半径を速度で割ったもの(予想衝突時間)で視直径を割って1を超えるとまずいってことにしよう。時間もないしまじめにやるのが面倒だから。


おお、それだけなのにやわらかくくねくねよけていく。かわいい。


火星人に関しては、サンプルでもらった分は頭が悪いのか特に対策しなくても滅多につかまらないし、頭のいいのの対策までするととても面倒なのでスルーで。
お、サンプルのspiral.wrldで全部ゴールできるようになった。


まぁ、そんなこんなで一応submitしておいた。submitするまでがコンテストです。1回テストして、優秀だった一部が2回戦に進んで、というシステムらしい。1回戦突破できるかなぁ。どの程度の人数がどの程度のクオリティのコードを投稿してくる物かよく知らないけど、まぁかなり手抜きなコードだし火星人無視してるし、テスト用ワールドでもたまに小石にぶつかってるし、無理だろうなぁ。まぁ、今回は最初からぐだぐだだったし。来年チームを作って本格的にやろう。Hackathonがしたいよ。