Craig Halesが私にMandelbrotのセット画像とビデオシーケンスの作成をやめさせました。 https://community.jmp.com/t5/Uncharted/Mandelbrot-shallow-tour/ba-p/53295 出発点は これは、フラクタルセットの本質についてだけでなく、JSLプログラミング、ビデオ編集、およびYouTube向けのコンテンツの作成についても、興味深い学習経験でした。
私は最近、マンデルブローのパワーセットについてのいくつかのビデオに出会いました(時には "Multibrot Set"とも呼ばれます( https://en.wikipedia.org/wiki/Multibrot_set)) Mandelbrotのべき乗関数の詳細については詳しく説明しませんが、使い方は次のとおりです。
- みましょう f_c(z)= z ^ d + c(ここで、zは複素数 z = x + iy、c = xc + iyc)。
- の与えられた値に対して c 、次のように繰り返す
- させて z_0 = 0
- みましょう f_c(z_i)=(z_(i-1))^ d + c
- どちらかまで繰り返す
- 「救済」回数の繰り返しが満たされている(すなわち、指定された最大反復回数または)
- || z || =(x ^ 2 + y ^ 2)>(停止半径)^ 2 (ここで停止半径通常は2ですが、これより小さい場合もあります)
- 値を記録する私点の繰り返し回数(または深さ)として c
mandelbrotセットの画像を生成するのに役立つJSL関数Mandelbrot()がありますが、マルチブロットセットを実行するには、私自身のJSL関数を書く必要がありました。
f_mandelbrotpowercount = Function( {x, y, d = 2, radius=2, max_n = 100},
{zx, zy, n_iter = 0, r = 0, theta = 0},
if ( x ^ 2 + y ^ 2 <4,
While( (r < radius) & (n_iter < max_n),
zx = r ^ d * Cos( d * theta ) + x;
zy = r ^ d * Sin( d * theta ) + y;
r = Sqrt( zx ^ 2 + zy ^ 2 );
theta = ArcCosine( zx / r ) * ((zy > 0) * 2 - 1);
n_iter++;
);
);
n_iter;
);あなたが複素数と複素数の乗算について少し知っているならば、あなたは私がその識別を利用していることを見ることができます
z = x + iy = R e ^(i Theta)
どこで
R = sqrt(x ^ 2 + y ^ 2)、θ= ArcCosine(x / R) ( シータ間にあるように制約されている (-Pi、Pi)
構文は次のとおりです。
f_mandelbrotpowercount(xc、yc、、、)
デフォルトの累乗は2、デフォルトの半径は2、デフォルトの救済の相互作用は100です。これはJSL Mandelbrot()関数と同じ結果を返すはずです。
この関数の結果を計算すると、power = 2のとき、で定義された長方形全体で
左x値= -2.27、右x値= 2.27
上のy値= 1.5、下のy値= -1.5
そして、結果をある程度拡大縮小し、拡大縮小した結果に基づいてRGBカラーを設定すると、次のような画像が得られます。
定番のマンデルブローのセット画像!
power = 7のとき、あなたはこのような画像を得ます!
マンデルブローパワーセット、パワー= 7
画像ファイルを作成するためのJSLはこちら
pow=7;<BR />xleft = -1.5*1640/1080;<BR />xright = 1.5*1640/1080;<BR />ytop = 1.5;<BR />ybottom = -1.5;
Parallel Assign(
{f = Name Expr( f_mandelbrotpowercount ), p = pow},
mat[r( ytop, ybottom ), c( xleft, xright )] = f( c, r, p )
);
mat = mat / 100;
green = mat ^ .3;
red = mat ^ 6;
blue = 1 - mat ^ .2;
img = New Image( "rgb", {red, green, blue} );
img << Save image("power7.png");これはParallel Assign()JSl関数を利用して計算を実行するために私のマシン上のすべてのコアを使用できるようにすることに注意してください。 それでも、この解像度の単一の画像を生成するのに2分以上かかります。
本当にクールなビジュアルは、あなたが2から10にパワーを変えたり、戻したりするときに何が起こるかを見ることです。 私はこれのビデオを作成しました見たい場合はYouTubeに投稿してください。 シーケンスは、0.005の増分で、power = 2〜10の場合です。 画像シーケンスの作成には約53時間かかりました。
これは画像シーケンスを作成するための完全なコードです(公平な警告、上記参照、画像を生成するのに53時間かかりました!)
Names Default To Here( 1 );
f_mandelbrotpowercount = Function( {x, y, d = 2, radius=2, max_n = 100},
{zx, zy, n_iter = 0, r = 0, theta = 0},
if ( x ^ 2 + y ^ 2 <4,
While( (r < radius) & (n_iter < max_n),
zx = r ^ d * Cos( d * theta ) + x;
zy = r ^ d * Sin( d * theta ) + y;
r = Sqrt( zx ^ 2 + zy ^ 2 );
theta = ArcCosine( zx / r ) * ((zy > 0) * 2 - 1);
n_iter++;
);
);
n_iter;
);
xleft = -1.5*1640/1080;
xright = 1.5*1640/1080;
ytop = 1.5;
ybottom = -1.5;
xres = 1640;
yres = 1080;
filenamebase="m000";
fileindex=100000;
mat = J( yres, xres, . );
For( pow = 2, pow <= 10, pow += .005,
Parallel Assign(
{f = Name Expr( f_mandelbrotpowercount ), p = pow},
mat[r( ytop, ybottom ), c( xleft, xright )] = f( c, r, p )
);
mat = mat / 100;
green = mat ^ .3;
red = mat ^ 6;
blue = 1 - mat ^ .2;
img = New Image( "rgb", {red, green, blue} );
img << Save image("D:\mandelbrot\powerbrosequence\m"||char(fileindex)|| ".png");
fileindex+=1;
);あなたが何を考えているのか、あるいは質問があれば教えてください。