<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Historia, Parte 1
A primera hora de la tarde, el sol de finales de octubre juega con el niño y sus amigos.Todavía no da miedo. Halloween está a horas de distancia.
( ¡Se acerca una comunidad de usuarios de JMP rediseñada!¡La parte 2 y la parte 3 lo encontrarán allí! )
Vídeo y código
Esta secuencia de video muestra el recocido simulado para colocar uniformemente 3200 puntos alrededor de una esfera.Inicialmente, los puntos se colocan en una doble espiral desde el polo norte hasta el polo sur.No estaba intentando una doble espiral; Esperaba un poco más de difusión inicial, pero funciona de todos modos.Los colores son solo para la visualización.Después de los puntos iniciales, comienza el proceso de recocido.https://en.wikipedia.org/wiki/Recocido_(metalurgia) describe un proceso de recocido físico, donde el metal se calienta para relajar una estructura cristalizada, lo que permite que los átomos se muevan a una relación diferente.Algunos materiales pueden incluso recocerse al calor del sol de octubre.El JSL aquí está ajustado para el video y no está optimizado para nada más... pero es lo suficientemente bueno.Durante la fase de recocido, un programa de calentamiento y enfriamiento controla cuánto se permite que los puntos se alejen unos centímetros de su vecino más cercano.Debido a que hay muchos puntos amontonados en los polos, el cronograma debe mantener el sistema caliente por un tiempo para que esos puntos tengan tiempo de migrar.A esa “temperatura alta”, los puntos saltan lo suficiente como para adentrarse demasiado en la vecindad de otro punto.La fase de enfriamiento gradual del horario permite que los puntos se asienten, moviéndose cada vez menos.El video termina antes de que se hayan asentado por completo.
https://www.youtube.com/watch?v=8-Fjw1wD-Oc

nnodos = 3200;
xx = -nnodos * 3/2;
nodelocs = J(nnodos, 3, 0); // punto x,y,z para cada nodo
For( i = 1, i <= nnodos, i++,
f = i / nnodos; // 0..1
z = Cos( f * Pi() ); // de arriba hacia abajo
r = Sin( f * Pi() ); // radio
x = Sin( 10000 * f ) * r; // 10,000 radianes
y = Cos( 10000 * f ) * r; // es demasiado.pero funciona...
nodelocs[i, 1] = x;
nodelocs[i, 2] = y;
nodelocs[i, 3] = z;
);
//nodeobj = lista de visualización de escena(); nodeobj<
addnodes = Función ({thisnnodes},
{inodo, delta, pos = [0 0 0], resultado = Lista de visualización de escenas()},
For( inodo = 1, inodo <= estos nodos, inodo++,
delta = nodelocs[inodo, 0] - pos;
pos = nodelocs[inodo, 0];
// mostrar (posición, delta);
resultado << traducir( delta );
rgb = Color a RGB (Color de calor (inodo / nnodos, "espectral")) * 1;
//mostrar(inodo/nnodos,rgb);
resultado << color( rgb[1], rgb[2], rgb[3] );
resultado << esfera (.005, 3, 3) // lista de llamadas (nodeobj);
;
);
resultado << traducir( -pos ); // restaurar la ubicación original
result// devuelve la lista de visualización
;
);
//a=agregarnodos();
// animar los nodos en una esfera de radio 1 alrededor de 0,0,0
ajustar = Función ({d},
{inodo, radio, más cercano, dist, err, pos, newlocs = J( nnodes, 3, . ), table = KDTable( nodelocs )},
For( inodo = 1, inodo <= nnodos, inodo++,
pos = nodelocs[inodo, 0];
// empujar lejos del vecino más cercano
tabla << eliminarfilas(inodo);
{más cercano, dist} = tabla << knearestrows( 5, pos );
tabla << insertarfilas(inodo);
For( iclose = 1, iclose <= 5, iclose++,
err = pos - nodelocs[más cercano[iclose], 0] + J( 1, 3, Random Normal( 0, .01 ) ); // [dx dy dz]
// pos = pos + .00991/ error; // alejarse
Para (ídem = 1, ídem <= 3, ídim++,
Si (err[idim] < 0,
pos[idim] -= d / icerrar,
pos[idim] += d / iclose
)
);
);
// empujar el radio hacia 1.000
radio = Sqrt( Suma( pos
pos ) );
//err = 1.0 - radio; // err es positivo si el radio es demasiado pequeño
pos = pos / radio; // gran error se mueve más rápido
newlocs[inodo, 0] = pos; // copia temporal
);
nodelocs = newlocs; // copia temporal a real
0 // valor de retorno ficticio
;
);
ángulo = 30;
escena = Cuadro de escena (1924/2, 1084/2);
construir = Función ({thisnnodes},
{},
escena << claro;
escena << ShowArcBall( nunca/*siempre*/ /*Durante Arrastrar*/ );
escena << Color de fondo (negro);
escena << Perspectiva( 65, .1, 5 );
escena << Traducir( 0.0, 0.0, -2.0 );
ángulo += .1;
escena << rotar (ángulo * 0.23, 1, 0, 0);
escena << rotar (ángulo * 0.11, 0, 1, 0);
escena << rotar (ángulo * 2, 0, 0, 1);
objeto = addnodes(thisnnodes);
escena << ArcBall(objeto, 1);
);
construir (1);
Nueva ventana ("Dot World", escena);
Para( i = 1, i <= 3200, i += 4,
construir( yo );
escena << actualizar;
Espera(0);
// escena<
);
For( i = 1, i < 5000, i++, // todo menos hecho en 1000
vint = Interpolar( i, 1, .00001, 100, .0005, 200, .001, 4000, .0005, 5000, .00001 );
Mostrar (i, vint);
construir (3200);
escena << actualizar;
Espera(0);
ajustar( vint );
//escena<
);
construir();
escena << actualizar;
Espera(0);