비디오용 JSL.
picpath = ""; // "D:\Chales\pic\m";
//http://www.fractalforums.com/mandelbrot-and-julia-set/good-coordinates-for-mandelbrot-zooms/
//
//Points on the boundary of the Mandelbrot set generally have the most interesting orbits. The easiest boundary points to compute are:
//
//* the spike along the negative real axis
//* the boundary of the main cardioid: r = (1 - cos(theta))/2, x = r*cos(theta)+0.25, y = r*sin(theta)
//* the boundary of the period 2 disk: r = 0.25, x = r*cos(theta)-1, y = r*sin(theta)
eps = 1.6; // slightly outside
deep = 10;
steps = 8000;
angle = 3;
scale = 2; // <<<<<<< video made with 20, very slow
xsize = 192 * scale;
ysize = 108 * scale;
diag = Sqrt( xsize ^ 2 + ysize ^ 2 );
mat = J( ysize, xsize, . );
New Window( "mandelbrot", bb = Border Box( Text Box( "wait" ) ) );
Wait( .2 );
num = 1e6;
For( t = 0, t < steps, t += 1,
If( eps > 1e-9, eps *= .997 );
deep += .3;
angle += eps / 50;
radius = (1 - Cos( angle )) / 2 + eps;
x = radius * Cos( angle ) + 0.25;
y = radius * Sin( angle );
top = y - eps;
bottom = y + eps;
left = x - eps * xsize / ysize;
right = x + eps * xsize / ysize;
d = Floor( Min( 1e5, deep ) );
Parallel Assign( {d = d}, mat[r( top, bottom ), c( left, right )] = Mandelbrot( d, 4, c, r ) );
mat = mat / d;
red = mat ^ .5;
green = mat ^ 9;
both = Loc( red :*</img> green == 1 );
red[both] = .1;
green[both] = .4;
blue = 1 - mat ^ .2;
blue[both] = .1;
img = New Image( "rgb", {red, green, blue} );
(bb << child) << delete;
bb << append( img );
num += 1;
If( picpath != "", img << saveimage( picpath || Char( num ) || ".png" ) );
bb << updatewindow;
Wait( 0 );
);
좋아요, 첫 번째가 가장 어렵습니다. ffmpeg를 직접 사용하는 대신 Blender(내부적으로 ffmpeg를 사용함)를 사용하여 약간 다른 경로에 정착했습니다. 나는 ffmpeg 매개 변수에 대한 일부 제어를 포기하고(학습에 시간을 보내고 싶지 않음) 대신 꽤 멋진 비디오 시퀀스 편집기(자체 학습 곡선이 있음)를 얻습니다.
Parallel Assign()에 대한 자세한 정보에 감사드립니다!내 두뇌는 내가 그것을 어떻게 사용할 수 있는지에 대한 아이디어로 헤엄치고 있습니다.
나는 그것을 문서화하지 않은 것 같습니다. 내가 무엇을 할 수 있는지 볼 것입니다.
예, 1..nrows를 top..bottom으로 선형 보간합니다. (c, ncols, 왼쪽, 오른쪽과 유사).
(top,bottom) 비트를 생략하면 표현식의 r 값은 1..nrows가 됩니다.
{d = d} 부분도 설명이 필요합니다. 각 스레드는 참조해야 하는 모든 항목의 자체 복사본을 가져옵니다. 왼쪽 변수는 작업자 스레드의 이름이고 오른쪽은 기본 스레드의 이름입니다. 4-cpu 시스템에서 할당은 4번 수행됩니다. 복사하는 거대한 행렬인 경우 성능 향상이 나타나지 않을 수 있습니다.
Mandelbrot는 다른 데이터가 필요하지 않으며 잘 확장됩니다. 대부분의 실제 문제는 다른 배열에서 읽어야 하며 일부 부기 작업도 수행해야 합니다.
표지 아래를 엿보고 싶다면 다음을 시도하십시오.
m=J(10,10,0);
x=0;
parallelassign({x=x++},m[r,c]=x);
show(x,m);
내 8-cpu 컴퓨터는 다음을 생성합니다.
x = 8;
엠 =
[ 0 1 2 3 4 5 6 7 0 1,
2 3 4 5 6 7 0 1 2 3,
4 5 6 7 0 1 2 3 4 5,
6 7 0 1 2 3 4 5 6 7,
0 1 2 3 4 5 6 7 0 1,
2 3 4 5 6 7 0 1 2 3,
4 5 6 7 0 1 2 3 4 5,
6 7 0 1 2 3 4 5 6 7,
0 1 2 3 4 5 6 7 0 1,
2 3 4 5 6 7 0 1 2 3];
물론 해당 패턴에 의존하는 코드를 작성해서는 안 됩니다.
또한 행렬 할당의 오른쪽이 더 복잡할 수 있습니다.
m=J(400,600,0);
parallelassign({},m[r(-1,1),c(-1,1)]=(
z=sqrt(r^2+c^2);
z=if(z<.707,.707,z)-.5;
1-z; // last item in ; sequence is result
));
m=m/max(m); // for heat color
newwindow("example",newimage(heatcolor(m,"spectral")));
"z"는 각 스레드 내부에만 존재하며 각각에 대한 별도의 사본입니다.
That flat area, dark red, was created by the if statement짙은 빨간색의 평평한 영역은 if 문에 의해 생성되었습니다.
예, for 문을 사용할 수 있습니다. 로그에 기록하는 것 외에는 어떤 형태의 I/O도 시도해서는 안 됩니다. 디스플레이 상자를 만들지 말고, 디스플레이 상자를 업데이트하지 말고, 디스크 파일을 읽거나 쓰지 마십시오. 충돌하지 않으면 여전히 잘못된 것입니다.
전역을 사용할 수 있지만 뮤텍스를 사용하여 액세스를 직렬화하고 코드가 스레드되지 않은 코드보다 빠르지 않을 수 있습니다.
m=J(3,5,0);
global:words="";
parallelassign({},m[r(-1,1),c(-1,1)]=(
z=sqrt(r^2+c^2);
show(r+0,c+0,r+c,z); // r and c are special, use an expression
global:words||=char(z);
z=if(z<.707,.707,z)-.5;
1-z; // last item in ; sequence is result
));
show(words);
global:words는 서로 다른 스레드가 얼마나 빨리 실행되는지에 따라 결정되는 예측할 수 없는 순서로 빌드됩니다.
JSL은 (내부적으로) 복잡하고 스레딩도 마찬가지입니다. parallelassign 기능은 모든 것을 제정신으로 유지하려고 합니다(예: 해당 복사본). 사용자가 수행하지 못하게 하는 문제를 해결하는 방법을 찾으면 두 스레드가 동시에 내부 데이터 구조에 액세스할 때 내부 데이터 구조가 손상될 수 있으며 이로 인해 어느 시점에서 JMP가 중단될 수 있습니다. 자주 저장하십시오.
오...1D 행렬에 대한 마지막 참고 사항: 두 개의 첨자를 사용하십시오! 1xN 행 벡터가 있고 단일 첨자를 사용하려고 하면 혼란스러운 상황이 있습니다. R,C를 사용하고 상수 R==1 값을 무시하십시오.
나는 이 대본을 가지고 약간의 수정을 가하고 이미지 시리즈를 만들어 비디오로 변환하여 나만의 만델브로트 투어를 만들면서 재미를 보았습니다.
질문: Parallel Assign() 함수 -- 구문 참조를 찾고 있습니까?JMP 스크립팅 책에는 없지만 도움말 아래 JMP 스크립팅 가이드에 항목이 있습니다.스크립트에서 Parallel Assign 기능으로 무엇을 하고 있는지 명확하지 않습니다.
Parallel Assign( {d = d}, mat[r( top, bottom ), c( left, right )] = Mandelbrot( d, 4, c, r ) );r(위, 아래) 및 c(왼쪽, 오른쪽)는 무엇을 합니까?위쪽, 아래쪽, 왼쪽 및 오른쪽은 생성 중인 프레임의 좌표 경계를 결정하기 위해 스크립트에서 직전에 결정됩니다.사용할 y 및 x 좌표를 얻기 위해 위쪽, 아래쪽 및 왼쪽, 오른쪽 사이에 일종의 보간을 수행한다고 가정합니다.어딘가에 이 구문에 대한 일반적인 설명이 있습니까?
환영합니다. 감사합니다! 비디오도 렌더링하는 데 몇 시간이 걸렸지만 4K 해상도와 1000프레임입니다.
나는 만들기 시작했다 GKS 80년대 프로그램.프랙탈을 렌더링하는 데 몇 시간의 microVAX 컴퓨팅 시간이 소요됩니다.공유해 주셔서 감사합니다.