見出し画像

ブラウン運動もランダムウォークも無し! Processing で DLA 風の画像を作成

DLA(Diffusion-limited aggregation) 、日本語だと拡散律速凝集。
これはブラウン運動する粒子がくっつきながら成長していく様子を表したもので、珊瑚のような形を描くことができるそう。

これ面白そうなので Processing でやってみました。

この記事は全文無料でお読みいただけます。もしお気に召しましたら投げ銭お願いしますね。😉✨

画像1

難しいのはちょっと…

DLA にはブラウン運動が付きものですが、ブラウン運動を実装するのって結構大変そうです。

ブラウン運動

なので、まずはランダムウォークで試してみました。
参考にしたコードはこちら。


なかなかそれっぽい結果です!


粒子を上から下に向けてランダムウォークさせて、それをアニメーションにしてみると。

まるで落雷で成長していくかのようですね。


画像2

ランダムにぶつかるだけでいいんじゃ…

ここまでやってふと思いました。
『粒子がくっつくまでの途中のランダムウォーク要らなくない?』

ということで、試しにランダムな角度で直線的に入射させてみると…

それっぽい!

さらに、粒子自体大きさを持っているので、ランダムな位置から真っ直ぐ下に向かって落とすだけでもこうなります。

まさかと思ったけど、本当に真っ直ぐ落とすだけで結構それっぽい結果が出るなんて…

同じ要領で、ランダムな方向から中心の一点に向かって真っ直ぐ打ち込むとこういうのが出来ます。

ついでに、入射角を中心からちょっとずつずらしてやるとこう。

形はそれっぽいけどやってることは全然 DLA じゃありません。


画像3

ランダムさえ要らなかったり…?

DLA じゃないんだったら、もうこのさいランダムもやめて、打ち込む角度を規則的に変えてやったらどうなるのか?

普通にやるとこうなります。

 float entryRadius = 0.0;
 for (int plotCnt = 0; plotCnt < plotMax; plotCnt++) {

   // simple rhythm
   entryRadius += PI * 0.02;
   p.x = width * cos(entryRadius),
   p.y = height * sin(entryRadius),

   for (int walkCnt = 0; walkCnt < walkMax; walkCnt++) {
     // walk to the center
     p.x -= cos(entryRadius);
     p.y -= sin(entryRadius);

角度の間隔を計算して調整してやるとこういう図形も描けます。

さらに複雑な計算にすればこんなのも。

 for (int plotCnt = 0; plotCnt < plotMax; plotCnt++) {

   //  weird rhythm
   float plotRatio = map(plotCnt, 0, plotMax, 0.0, 1.0);
   float entryRadius = TWO_PI * sin(TWO_PI * plotRatio * 25.3094285);


そして、最終的には規則的な角度で打ち込んでもこのような複雑な模様を描けるようになります。

 float entryRadius = 1.0;
 for (int plotCnt = 0; plotCnt < plotMax; plotCnt++) {

   // complex rhythm
   entryRadius += entryRadius;
   entryRadius = entryRadius % TWO_PI;


全体のコードはこちらに掲載しました。


ブラウン運動どころかランダムウォークも無しでこんなのが描けるなんて思いもしませんでした。
コピーして遊んでみてくださいね。


この先には今回の手法を使用したちょっと大きめの作品画像があります。この記事がお気に召しましたら投げ銭お願いしますね。😉✨

ここから先は

0字 / 2画像

¥ 100

この記事が面白かったらサポートしていただけませんか? ぜんざい好きな私に、ぜんざいをお腹いっぱい食べさせてほしい。あなたのことを想いながら食べるから、ぜんざいサポートお願いね 💕