<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Storia, parte 1
Nel primo pomeriggio, il sole di fine ottobre gioca con il ragazzo ei suoi amici.Non è ancora spaventoso. Halloween è a poche ore.
( È in arrivo una community di utenti JMP ridisegnata!La Parte 2 e la Parte 3 ti troveranno lì! )
Video e codice
Questa sequenza video mostra la ricottura simulata per posizionare uniformemente 3200 punti attorno a una sfera.Inizialmente i punti sono posti in una doppia spirale dal polo nord al polo sud.Non stavo cercando una doppia spirale; Speravo in una diffusione un po' più iniziale, ma funziona comunque.I colori sono solo per la visualizzazione.Dopo i punti iniziali, inizia il processo di ricottura.https://en.wikipedia.org/wiki/Ricottura_(metallurgia) descrive un processo di ricottura fisica, in cui il metallo viene riscaldato per rilassare una struttura cristallizzata, consentendo agli atomi di muoversi in una relazione diversa.Alcuni materiali potrebbero anche essere cotti al calore del sole di ottobre.Il JSL qui è ottimizzato per il video e non ottimizzato per nient'altro... ma abbastanza buono.Durante la fase di ricottura, un programma di riscaldamento e raffreddamento controlla di quanto i punti possono allontanarsi a pochi centimetri dal loro vicino più vicino.Poiché ci sono molti punti affollati ai poli, la pianificazione deve mantenere il sistema caldo per un po' in modo che quei punti abbiano il tempo di migrare via.A quella "temperatura elevata" i punti saltano abbastanza lontano da spingersi troppo lontano nelle vicinanze di un altro punto.La fase di graduale raffreddamento del palinsesto permette ai punti di assestarsi, muovendosi sempre meno.Il video finisce prima che si siano completamente stabilizzati.
https://www.youtube.com/watch?v=8-Fjw1wD-Oc

nnodi = 3200;
xx = -nnodi * 3 / 2;
nodelocs = J( nnodes, 3, 0 ); // punto x,y,z per ogni nodo
For( i = 1, i <= nnodi, i++,
f = i / nnodi; // 0..1
z = Cos( f * Pi() ); // dall'alto al basso
r = Sin( f * Pi() ); // raggio
x = Sin( 10000 * f ) * r; // 10.000 radianti
y = Cos( 10000 * f ) * r; // sono troppi.ma funziona...
nodi-nodo[i, 1] = x;
nodi-nodo[i, 2] = y;
nodi-nodo[i, 3] = z;
);
//nodeobj = scene displaylist(); nodeobj<
addnodes = Funzione( {thisnnodes},
{inode, delta, pos = [0 0 0], risultato = Scene Display List()},
For( inode = 1, inode <= thisnnodes, inode++,
delta = nodelocs[inode, 0] - pos;
pos = nodelocs[inode, 0];
//mostra(pos,delta);
risultato << traduci( delta );
rgb = Color To RGB( Heat Color( inode / nnodes, "spectral" ) ) * 1;
//show(inode/nnodes,rgb);
risultato << color( rgb[1], rgb[2], rgb[3] );
risultato << sphere( .005, 3, 3 )//calllist( nodeobj );
;
);
risultato << translate( -pos ); // ripristina la posizione originale
risultato// restituisce l'elenco di visualizzazione
;
);
//a=aggiungi nodi();
// anima i nodi in una sfera di raggio 1 circa 0,0,0
aggiusta = Funzione( {d},
{inode, raggio, più vicino, dist, err, pos, newlocs = J( nnodes, 3, . ), table = KDTable( nodelocs )},
For( inode = 1, inode <= nnodes, inode++,
pos = nodelocs[inode, 0];
// allontanati dal vicino più vicino
tabella << removerows( inode );
{più vicino, dist} = tabella << knearestrows( 5, pos );
tabella << insertrows( inode );
For( iclose = 1, iclose <= 5, iclose++,
err = pos - nodelocs[closest[iclose], 0] + J( 1, 3, Random Normal( 0, .01 ) ); // [dx di dz]
//pos = pos + .00991/ err; // vai via
For( idim = 1, idim <= 3, idim++,
Se( err[idim] < 0,
pos[idim] -= d / iclose,
pos[idim] += d / iclose
)
);
);
// Raggio di spinta verso 1.000
raggio = Sqrt( Somma( pos
pos ) );
//err = 1,0 - raggio; // err è positivo se il raggio è troppo piccolo
pos = pos / raggio; // big err si muove più velocemente
newlocs[inode, 0] = pos; // copia temporanea
);
nodelocs = newlocs; // copia la temperatura in quella attuale
0 // valore di ritorno fittizio
;
);
angolo = 30;
scena = Scene Box( 1924 / 2, 1084 / 2 );
build = Funzione( {thisnnodes},
{},
scena << chiara;
scena << ShowArcBall( mai/*sempre*/ /*Durante il trascinamento*/ );
scena << Colore di sfondo (nero);
scena << Prospettiva( 65, .1, 5 );
scena << Traduci( 0.0, 0.0, -2.0 );
angolo += .1;
scena << ruota (angolo * 0,23, 1, 0, 0);
scena << ruotare (angolo * 0,11, 0, 1, 0);
scena << ruotare (angolo * 2, 0, 0, 1);
oggetto = addnodes(thisnnodes);
scena << ArcBall( oggetto, 1 );
);
costruire( 1 );
Nuova finestra("Dot World", scena);
For( io = 1, io <= 3200, io += 4,
costruire( i );
scena << aggiornamento;
Aspetta( 0 );
// scene<
);
For( i = 1, i < 5000, i++, // tutto tranne 1000
vint = Interpola( i, 1, .00001, 100, .0005, 200, .001, 4000, .0005, 5000, .00001 );
Mostra( io, vint );
costruire( 3200 );
scena << aggiornamento;
Aspetta( 0 );
regolare (vinta);
//scene<
);
costruire();
scena << aggiornamento;
Aspetta( 0 );