成果物
ずっと作ろうと思っていた波紋のシュミレーションを40行にも満たないコードで実現していたサイトがあったので、なぜなのか考えてみました。発見はありましたが、完全には分かりません。仕組みをわかりやすくするために、次元を減らしてみました。
仕組み(推測)
すいません。完全にはわからないのですが、私の推測を書かせていただきます。本家のサイトにも説明は載ってはいるのですが、その説明もあまり納得がいかないです。
現在のマスをcurrent
currentの周囲のマスの過去の平均値をprevAvg
current-prevAvgをdiffとします。(厳密には違いますが、前のフレーム分からの移動量という認識でお願いします。)
diffをcurrentから、そのまま引いてしまうと、prevAvgだけ残り、拡散されるだけになってしまいます。
current-diff=current-(current-prevAvg)
=prevAvg
ところが、2倍して引くと、(prevAvgからdiffを引いたのと同じ)
current-diff=current-2*(current-prevAvg)
=current-2current+2prevAvg
=2prevAvg-current
となり、今回のコードと全く同じになります。
二倍して引くところをn倍にするときは、(deltaは微小な数値)(n>1)
dampening=1/(n-1)-delta
とすることで、n倍にしても波が発生します。なので、このアルゴリズムの鍵は、拡散アルゴリズムから差分をさらに引いていく部分にあると思いました。説明は割愛しますが、このアルゴリズムには微分する働きもあります。しかし、私が作った1D版の物を見るとよくわかるのですが、1ピクセルごとに、無数の細かい波が発生していて、これだけでは説明できない部分もあります。
とにかく、思いついた人はすごいと思います。
コード
私が作った1Dバージョンはこちらです。
2Dバージョンについては、CodingTrainさんの物をご覧ください。