크레이그 헤일 즈 (Craig Hales)는 만델 브로 (Mandelbrot) 이미지와 비디오 시퀀스를 만드는 방법에 대해 설명했다. https://community.jmp.com/t5/Uncharted/Mandelbrot-shallow-tour/ba-p/53295 내가 어디서 시작했는지). 프랙탈 세트의 인티 케이션뿐만 아니라 JSL 프로그래밍, 비디오 편집 및 YouTube 콘텐츠 제작에 대한 흥미로운 학습 경험이었습니다.
최근에 Mandelbrot 파워 세트에 대한 비디오를 보았습니다 (때로는 "Multibrot Set"이라고도 함 https://en.wikipedia.org/wiki/Multibrot_set)). Mandelbrot powerfunction의 모든 세부 사항을 다루지는 않겠지 만 사용 방법은 다음과 같습니다.
- 방해 f_c (z) = z ^ d + c (z는 복소수 z = x + iy, c = xc + iyc).
- 주어진 가치의 기음 , 다음과 같이 반복한다.
- 방해 z_0 = 0
- 방해 f_c (z_i) = (z_ (i-1)) ^ d + c
- 어느 쪽이든
- "구제 금융 (bailout)"반복 횟수가 충족되었습니다 (즉, i> 지정된 최대 반복 횟수 ) 또는
- || z || = (x ^ 2 + y ^ 2)> (정지 반경) ^ 2 (어디에 정지 반경 보통 2와 같지만 더 작을 수 있음)
- 가치를 기록하다 나는 점의 반복 횟수 (또는 깊이)로 기음
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θ)
어디에
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 색상을 설정하면 다음과 같은 이미지를 얻을 수 있습니다
고전 만델 브로 세트 이미지!
힘 = 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");이것은 병렬 할당 () JSl 함수를 이용하여 컴퓨터에서 모든 코어를 계산할 수있게합니다. 심지어이 해상도의 단일 이미지는 생성하는 데 2 분 이상 걸립니다.
정말 멋진 시각 효과는 2에서 10까지 권력을 바꿀 때 어떤 일이 일어나는지 지켜 보는 것입니다. 나는 이것에 대한 비디오를 만들었고 보고 싶으면 YouTube에 게시했습니다. 시퀀스는 전력 = 2 ~ 10에 대해 0.005 씩 증가합니다. 이미지 시퀀스를 만드는 데 약 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;
);당신의 생각이나 질문이 있으면 알려주십시오.