![見出し画像](https://assets.st-note.com/production/uploads/images/14967945/rectangle_large_type_2_31e3aafd6ab33a0366135fec34950063.png?width=800)
ブラウン運動もランダムウォークも無し! Processing で DLA 風の画像を作成
DLA(Diffusion-limited aggregation) 、日本語だと拡散律速凝集。
これはブラウン運動する粒子がくっつきながら成長していく様子を表したもので、珊瑚のような形を描くことができるそう。
これ面白そうなので Processing でやってみました。
この記事は全文無料でお読みいただけます。もしお気に召しましたら投げ銭お願いしますね。😉✨
難しいのはちょっと…
DLA にはブラウン運動が付きものですが、ブラウン運動を実装するのって結構大変そうです。
ブラウン運動
なので、まずはランダムウォークで試してみました。
参考にしたコードはこちら。
DLA、拡散律速凝集(かくさんりっそくぎょうしゅう)
— deconbatch (@deconbatch) September 16, 2019
舌噛みそうですね。😝#processing #creativecoding #generative pic.twitter.com/ufDsEViy6U
なかなかそれっぽい結果です!
粒子を上から下に向けてランダムウォークさせて、それをアニメーションにしてみると。
落雷で成長していく DLA。🌩️
— deconbatch (@deconbatch) September 17, 2019
私はこれを CLA:Chain Lightning Aggregation と名付けようとは思っていない。🙃#processing #creativecoding #generative pic.twitter.com/okOBLwWHRd
まるで落雷で成長していくかのようですね。
ランダムにぶつかるだけでいいんじゃ…
ここまでやってふと思いました。
『粒子がくっつくまでの途中のランダムウォーク要らなくない?』
ということで、試しにランダムな角度で直線的に入射させてみると…
ミサイルコマンドで育ててみる。🚀
— deconbatch (@deconbatch) September 17, 2019
以外とそれっぽい結果になるし、難しいブラウン運動いらないかも?🤨#processing #creativecoding #generative pic.twitter.com/eE79qckbp4
それっぽい!
さらに、粒子自体大きさを持っているので、ランダムな位置から真っ直ぐ下に向かって落とすだけでもこうなります。
まさかな😨と思いつつやってみたら…
— deconbatch (@deconbatch) September 18, 2019
単純にまっすぐ落とすだけでもいいんじゃん!🤣#processing #creativecoding #generative pic.twitter.com/HO8JxXMbsL
まさかと思ったけど、本当に真っ直ぐ落とすだけで結構それっぽい結果が出るなんて…
同じ要領で、ランダムな方向から中心の一点に向かって真っ直ぐ打ち込むとこういうのが出来ます。
複雑なブラウン運動とか無しで、単純にランダムな方向から中心に向かって真っすぐ打ち込むとこう。#processing #creativecoding #generative pic.twitter.com/LuVN4FCwzq
— deconbatch (@deconbatch) September 22, 2019
ついでに、入射角を中心からちょっとずつずらしてやるとこう。
渦巻銀河って、回転してるから渦になってると思ってるでしょう?🍥#processing #creativecoding #generative #DLA pic.twitter.com/eBTr0qqRfR
— deconbatch (@deconbatch) September 20, 2019
形はそれっぽいけどやってることは全然 DLA じゃありません。
ランダムさえ要らなかったり…?
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);
じゃあ、打ち込む角度を規則的に変えていくとこう。
— deconbatch (@deconbatch) September 22, 2019
単調ですね。#processing #creativecoding #generative pic.twitter.com/4EWjv6RZzH
角度の間隔を計算して調整してやるとこういう図形も描けます。
けど、角度の間隔を調整したらこんなのもできました。#processing #creativecoding #generative pic.twitter.com/sdz9iBHssR
— deconbatch (@deconbatch) September 22, 2019
さらに複雑な計算にすればこんなのも。
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);
我はミジンコの神なり👻#processing #creativecoding #generative pic.twitter.com/twCVaOxESr
— deconbatch (@deconbatch) September 21, 2019
そして、最終的には規則的な角度で打ち込んでもこのような複雑な模様を描けるようになります。
float entryRadius = 1.0;
for (int plotCnt = 0; plotCnt < plotMax; plotCnt++) {
// complex rhythm
entryRadius += entryRadius;
entryRadius = entryRadius % TWO_PI;
種を 5つに増やしてアニメーション🌲#processing #creativecoding #generative pic.twitter.com/Fx1ive2lhp
— deconbatch (@deconbatch) September 23, 2019
種を増やして放射状に🔆https://t.co/hUYGbhM3FW#processing #creativecoding #generative pic.twitter.com/3Lq6qSptsf
— deconbatch (@deconbatch) October 7, 2019
全体のコードはこちらに掲載しました。
ブラウン運動どころかランダムウォークも無しでこんなのが描けるなんて思いもしませんでした。
コピーして遊んでみてくださいね。
この先には今回の手法を使用したちょっと大きめの作品画像があります。この記事がお気に召しましたら投げ銭お願いしますね。😉✨
ここから先は
¥ 100
この記事が面白かったらサポートしていただけませんか? ぜんざい好きな私に、ぜんざいをお腹いっぱい食べさせてほしい。あなたのことを想いながら食べるから、ぜんざいサポートお願いね 💕