<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />이야기, 1부
이른 오후, 늦은 10월의 햇살이 소년과 그의 친구들과 함께 놀고 있습니다.아직 무섭지 않습니다. 할로윈이 몇 시간 남지 않았습니다.
( 새롭게 디자인된 JMP 사용자 커뮤니티가 옵니다!파트 2와 파트 3에서 당신을 찾을 것입니다! )
비디오 및 코드
이 비디오 시퀀스는 구 주위에 3200개의 점을 고르게 배치하기 위한 시뮬레이션된 어닐링을 보여줍니다.처음에 점은 북극에서 남극으로 이중 나선으로 배치됩니다.나는 이중 나선을 시도하지 않았습니다. 나는 조금 더 초기 확산을 기대했지만 어쨌든 작동합니다.색상은 시각화를 위한 것입니다.초기 포인트 후에 어닐링 프로세스가 시작됩니다.https://en.wikipedia.org/wiki/Annealing_(야금) 금속이 가열되어 결정화된 구조를 이완시켜 원자가 다른 관계로 이동할 수 있도록 하는 물리적 어닐링 프로세스를 설명합니다.일부 재료는 10월 태양의 따뜻함을 어닐링할 수도 있습니다.여기 JSL은 비디오에 맞게 조정되었으며 다른 것에 최적화되어 있지는 않지만...충분히 좋습니다.어닐링 단계에서 가열 및 냉각 일정은 포인트가 가장 가까운 이웃에서 1인치 떨어져 있도록 허용되는 정도를 제어합니다.극점에는 많은 지점이 뭉쳐 있기 때문에 일정은 시스템을 잠시 뜨겁게 유지해야 해당 지점이 이동할 시간이 있습니다.그 "높은 온도"에서 점은 종종 다른 점의 이웃으로 너무 멀리 이동하기에 충분히 멀리 뛰어납니다.일정의 점진적인 냉각 단계를 통해 지점이 안정되고 이동이 줄어듭니다.완전히 자리 잡기도 전에 영상이 끝납니다.
https://www.youtube.com/watch?v=8-Fjw1wD-Oc

노드 = 3200;
xx = -nnodes * 3 / 2;
nodelocs = J( nnodes, 3, 0 ); // 각 노드의 x,y,z 포인트
For( i = 1, i <= nnodes, i++,
f = i / 노드; // 0..1
z = Cos( f * Pi() ); // 위에서 아래로
r = Sin( f * Pi() ); // 반경
x = 죄(10000 * f) * r; // 10,000 라디안
y = Cos( 10000 * f ) * r; // 너무 많습니다.하지만 작동합니다 ...
nodelocs[i, 1] = x;
nodelocs[i, 2] = y;
nodelocs[i, 3] = z;
);
//nodeobj = 장면 displaylist(); nodeobj<<구(.1,7,7);
addnodes = 함수({thisnnodes},
{inode, delta, pos = [0 0 0], 결과 = 장면 표시 목록()},
For( inode = 1, inode <= thisnnodes, inode++,
델타 = nodelocs[inode, 0] - 위치;
pos = nodelocs[inode, 0];
//show(pos,delta);
결과 << 번역(델타);
rgb = 색상을 RGB로(열 색상( inode / nnodes, "spectral" ) ) * 1;
//show(inode/nnodes,rgb);
결과 << 색상( rgb[1], rgb[2], rgb[3] );
결과 << 구( .005, 3, 3 )//calllist( nodeobj );
;
);
결과 << 번역( -pos ); // 원래 위치 복원
result // 표시 목록을 반환
;
);
//a=노드 추가();
// 노드를 약 0,0,0 반경 1의 구로 애니메이션
조정 = 함수({d},
{inode, 반경, 가장 가까운, dist, err, pos, newlocs = J( nnodes, 3, . ), 테이블 = KDTable( nodelocs )},
For( inode = 1, inode <= nnodes, inode++,
pos = nodelocs[inode, 0];
// 가장 가까운 이웃에서 멀어짐
테이블 << removerows( inode );
{가장 가까운, 거리} = 테이블 << knearestrows( 5, pos );
테이블 << insertrows( inode );
For( iclose = 1, iclose <= 5, iclose++,
err = pos - nodelocs[closest[iclose], 0] + J( 1, 3, 랜덤 노멀( 0, .01 ) ); // [dx dy dz]
//pos = pos + .00991/ err; // 떠나다
For( idim = 1, idim <= 3, idim++,
If( err[idim] < 0,
pos[idim] -= d / iclose,
pos[idim] += d / iclose
)
);
);
// 반경을 1.000으로 이동
반경 = Sqrt( 합계( 위치
위치) );
//err = 1.0 - 반경; // 반경이 너무 작으면 오류는 양수입니다.
pos = pos / 반경; // 큰 오류가 더 빠르게 움직입니다.
newlocs[inode, 0] = 위치; // 임시 복사
);
nodelocs = newlocs; // temp를 실제로 복사
0 // 더미 반환 값
;
);
각도 = 30;
장면 = 장면 상자( 1924 / 2, 1084 / 2 );
빌드 = 함수({thisnnodes},
{},
장면 << 클리어;
장면 << ShowArcBall( 절대/*항상*/ /*드래그 중*/ );
장면 << 배경색(검정);
장면 << 원근( 65, .1, 5 );
장면 << 번역( 0.0, 0.0, -2.0 );
각도 += .1;
장면 << 회전(각도 * 0.23, 1, 0, 0 );
장면 << 회전(각도 * 0.11, 0, 1, 0 );
장면 << 회전(각도 * 2, 0, 0, 1 );
개체 = addnodes( thisnnodes );
장면 << ArcBall( 개체, 1 );
);
빌드(1);
새 창( "점 세계", 장면 );
For( 나는 = 1, 나는 <= 3200, 나는 += 4,
빌드( 나는 );
장면 << 업데이트;
대기( 0 );
// 장면<
);
For( i = 1, i < 5000, i++, // 1000에서 완료됨
vint = 보간(i, 1, .00001, 100, .0005, 200, .001, 4000, .0005, 5000, .00001);
표시( i, vint );
빌드(3200);
장면 << 업데이트;
대기( 0 );
조정(빈트);
//장면<<사진 저장("\\VBOXSVR\windowsShare\spiderSphere\picsTess1\s"||right(char(i),6,"0")||".png");
);
짓다();
장면 << 업데이트;
대기( 0 );