終点枕崎

プログラミングとvimと音楽と地理

壁を設置する粒子

どうもこんばんは。もう春も終わろうとしているこの頃ですが、僕は何をしていたかというと、よくわからない妙ちくりんなものを作っていました。

言葉で説明するよりも、まずは動画を見てもらった方がいいですね。カクカクしていて申し訳ないです。

youtu.be

概要

振る舞いのルールは非常に単純で、次の3つのルールに従っています。

  1. 粒子は一定速度で動き、自分の通ったところに壁を設置する
  2. 粒子は壁に当たると反射される(自分で設置した壁も含めて)
  3. 壁は一定時間経つと消滅

一見線分が動いているように見えますが、内部的には先頭の粒子とそれに続く壁によって構成されています。

なぜ作ったの?

複雑な動きを眺めてニヤニヤしたかったから。ただ、予想してたよりかなり「収束」(後から説明)が発生することがわかったので、ライフゲームのように安定に向かわないようなパターンを作るのは不可能かと思います。

開発言語は?

Javaです。

点と点の当たり判定はないの?

粒子の大きさはゼロなので当たり判定はないです。仮にあっても、実数同士の比較なのであまり意味がないです。ただ粒子と壁の間には当たり判定があります。ちなみに壁の厚さもゼロです。

収束する粒子

f:id:uchifuji:20170518013201p:plain
注意深く見ればわかりますが、動かなくなってその場にとどまり続ける粒子がちらほら見られます。この粒子は「収束」を起こしていて、粒子の位置する点は収束した点を示します。

そもそもなぜ収束するのかという話ですが、大雑把に言えば

なんらかの原因で粒子が四方を壁に囲まれる → 自分の設置した壁に無限にぶつかりまくって身動きが取れなくなる = 収束

という仕組みで発生します。例えばこんな感じ。自分自身で設置した壁に当たって自滅する粒子、とても健気です。
f:id:uchifuji:20170518022223p:plain

当然、壁の消滅時間が長いほど収束は頻繁に起きます。あと粒子の密度が高いほど収束の起きる確率が高い(つまり衝突する確率が高い)。動画では一定の間隔で新しい粒子を追加していますが、時間が経てば一定の密度で均衡します。

そもそも本当に収束するのか

壁が永遠に消えないのであれば収束するのは当たり前です。しかし、壁が有限時間内に消滅する場合だと、この「収束」は少々直感に反します。いつかは壁は消えるのだから、もう一度粒子は動き出しそうです。

正直にいうと、最初作った時は本当に収束するのかあやふやにしたまま「収束」の処理を行っていました。時間あたりの衝突回数が閾値を超えた時に収束扱いにするというものです。ただこの「収束」を取り入れないと、延々と壁と反射し続ける粒子が発生してプログラムが固まっちゃうんですよね。仕方ないね。

こういったメタ的な理由で勝手に収束させていたのですが、先日これを大学の友人に見せたところ、「本当に収束するのか」という疑問を呈されまして。確かにそうです。

というわけで、このままあやふやにしておくのも気持ち悪いので、自分なりに考察を試みました。少なくとも分かったのは、

  • 収束には2個以上の粒子が必要
  • 収束するパターンは一応存在はする
  • 粒子が反射するたびに粒子が移動可能な範囲は狭義単調減少する。だからt(n)(n回目の衝突からn+1回目の衝突までの時間)は狭義単調減少する数列a(n)によって上から押さえることができるはず。ただa(n)の無限級数が収束することを示せない。

ということです。全然分かってないじょのいこ。

収束するパターンの例

筆者はε-N論法習いたてのペーペーなので、間違ったこといってるかもしれません。もし何かあればコメントで指摘お願いします。
f:id:uchifuji:20170518024157j:plain
このパターンは、同じ反射のパターンを再帰的に繰り返します。なので、先ほど定義したa(n)は指数関数的に減少します。なのでt(n)の無限級数は有限値に収束。よって粒子の総運動時間は有限時間内に収束します。それよりも長く壁の消滅時間を設定すれば粒子は収束します。

というわけで収束するパターンは存在するには存在すると思います。しかし、もっと一般的に、どんな条件なら収束するのか、そしてそれをどのように示すのかは分かりませんでした。数学のプロよ解いてくれ…。

最後に

なんとも歯切れの悪い記事になってしまいましたが、これが現時点での僕が持てる知識を総動員して考えた結果です。これらの問題を解く鍵があるのなら、ご教授いただけると嬉しいです。

それではまた。
f:id:uchifuji:20170518033535p:plain
(壁が消えない場合の収束する様子)