ねこでじ(Nekodigi)

Nekodigi’s diary

学習中の気づきをまとめています。応援よろしくお願いします

【Processing】波紋をシュミレーションする、非常にシンプルなアルゴリズム

成果物

www.youtube.com

ずっと作ろうと思っていた波紋のシュミレーションを40行にも満たないコードで実現していたサイトがあったので、なぜなのか考えてみました。発見はありましたが、完全には分かりません。仕組みをわかりやすくするために、次元を減らしてみました。

仕組み(推測)

すいません。完全にはわからないのですが、私の推測を書かせていただきます。本家のサイトにも説明は載ってはいるのですが、その説明もあまり納得がいかないです。

web.archive.org

現在のマスを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さんの物をご覧ください。

www.youtube.com