マンデルブロ集合とジュリア集合
5 日前(2020.02.20)の マンデルブロ・ダイブ に続き、 2/25 には別のフラクタル作品を投稿しました。
#つぶやきProcessing
— Koji Saito (@KojiSaito) February 25, 2020
def setup():size(600,600)
t=0
def draw():
global t;t+=.2;C=sin(t)+(-.7+noise(t))*1j
for i in range(3600):
u=i%60;v=i/60;z=(u*.1-3+v*.1j-3j)/2;fill(0)
for c in range(99):
z=z*z+C
if abs(z)>2:fill(c%9*40,c%5*60,c%7*60);break
rect(u*10,v*10,10,10) pic.twitter.com/ZoEsjqwG85
この作品では、マンデルブロ集合と並び有名なジュリア集合を描いています。 ジュリア集合って何?という人は、次の codezine さんの解説が分かりやすいと思います:
https://codezine.jp/article/detail/310
マンデルブロ集合もジュリア集合も、
$$ Z_{n+1}=Z_n^2+C $$
が重要な役割をします。
マンデルブロ集合の描画では、初期値 Z0 を 0 に固定し、 C の値の方を変化させ、Zn の発散の様子を可視化します。
一方、ジュリア集合を描画する場合、 C の値は固定で、初期値 Z0 の方を変化させ、 その発散の様子を可視化します。
ジュリア集合の形を変化させる
ジュリア集合の形を決めるのは、定数 C の値です。 そのため、この作品ではフレーム毎に C の値を変化させています。 つまり、それぞれのフレームでは、C の値は固定していますが、 アニメーションとして変化がでるように、 ジュリア集合の形を定める数式そのものを少しずつ変化させています。
プログラムでは、C=sin(t)+(-.7+noise(t))*1j として C の値を決定しています。 t はフレームにより少しづつ単調増加していく変数ですが、 sin 関数や noise 関数を用いることにより、 有限な値の範囲で「いい感じ」に値が変動するように工夫しています。
このような仕掛けにより、 あるフレームでは多くの領域に色が付いたり、 あるフレームでは大きな穴が空いているように見えたりするなど、 変化に富む表現を実現しています。
その他:数式を表示するために参考にしたページ
この Web サイトは Hugo により生成されているのですが、 Hugo で数式を使う方法として、
「Hugo に MathJax を導入して数式を書けるようにする」 https://m0t0k1ch1st0ry.com/blog/2017/10/07/mathjax/ さんの情報を 参考にさせてもらいました。
おかげで読みやすい数式を載せることができました(感謝)。