<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Vernice spray era un cattivo tentativo di comportamento di affollamento.Penso che la parte che mi mancava fosse l'allineamento, che http://gamedevelopment.tutsplus.com/tutorials/the-three-simple-rules-of-flocking-behaviors-alignment-cohesion-and-separa… mi ha guidato verso.Ecco un nuovo video.
ChanceOfDragons - YouTube

Ed ecco il JSL per creare le bitmap (di nuovo, niente scuse... dovrai rimuovere il calcolo del vicinato e del vicino dalla funzione iterativa se vuoi giocare con gli slider.Questo è l'ultimo JSL che è stato eseguito per diverse ore per creare tutte le bitmap, non il primo JSL quando stavo cercando di trovare alcuni valori di parametro che avrebbero prodotto risultati interessanti.)
// idee prese in prestito
// http://gamedevelopment.tutsplus.com/tutorials/the-three-simple-rules-of-flocking-behaviors-alignment-cohesion-and-separation--gamedev-3444
quartiere = 2; // raggio del quartiere vicino
vicino=20; // numero di vicini da trovare nel quartiere
a=.04;b=0.08;c=0.2;
w=.8;//1-w è tirato al centro
speed=8;//più piccolo è più veloce
x = 1;
y = 2;
dx = 3;
dy = 4;
colore=5;
nvar = 5;
nflock = 1700;
stormo = J( nflock, nvar, . );
// imposta le posizioni iniziali da 10 a 90 e le velocità iniziali inferiori a 1
Assegna parallela(
{x = x, y = y, dx = dx, dy = dy, nflock = nflock, colore=colore},
stormo[i, v] = Se( v < dx,
100*(i+100)/(nflock+200),//Intero casuale( 10, 90 ),
if(v
)
);
cornice = 0;
iterare = Funzione( {},
{temp = gregge, iflock, irow, kdt = KDTable( gregge[0, 1 :: 2] ), dxsum, dysum, xsum, ysum, myx, myy, xdif, ydif, neighbor, nneighbors, len},
vicino = 10*(1.1+peccato(frame/2000)); // da uno a venti vicini più prossimi
quartiere = 1*(1+cos(frame/3000)); // quartiere da zero a due
{righe, dist} = kdt << KNearestRows( {vicino, quartiere} );
cornice++;
For( iflock = 1, iflock <= nflock, iflock++,
myx = temp[iflock, x];
myy = temp[iflock, y];
somma dx = 0;
disum = 0; // somma delle velocità vicine
xsomma = 0;
ysum = 0; // somma delle posizioni vicine
xdif = 0;
ydif = 0; // somma delle distanze vicine
vicini = 0;
For( irow = 1, irow <= nnear & (neighbor = righe[iflock, irow]) != 0, irow++,
vicini++;
dxsum += temp[vicino, dx];
dysum += temp[vicino, dy];
se(1,
xsum += temp[vicino, x];
ysum += temp[vicino, y];
se(1,
xdif += (myx - temp[vicino, x]); // vettore lontano dal vicino
ydif += (myy - temp[vicino, y]);
))
);
len = Sqrt( dxsum * dxsum + dysum * dysum );
Se( len != 0,
somma dx /= len; // questo fa sì che la velocità diventi 1, nella direzione del gruppo
disum /= len;
,
somma dx = 0;
disum = 0;
);
Se( vicini,
xc = 50+40*sin((scegli(1+mod(iflock,3),3,5,7)*frame)/2207);
yc = 50+40*cos((scegli(1+mod(iflock,3),11,13,17)*frame)/3067);
xsum = ((1-w)*xc+(w*(xsum) / (vicini))) - mix; // questo vettore fornisce la direzione al centro del gruppo
ysum = ((1-w)*yc+(w*(ysum) / (vicini))) - myy;
len = Sqrt( xsum * xsum + ysum * ysum );
if(len!=0,xsum/=len;ysum/=len,xsum=0;ysum=0);// normalizzato a 1
len = Sqrt( xdif * xdif + ydif * ydif );
if(len!=0,xdif/=len;ydif/=len,xdif=0;ydif=0); // normalizzato a 1
,
xsomma = 0;
ysum = 0;
xdif = 0;
ydif = 0;
);
stormo[iflock, dx] += a*dxsum + b*xsum + c*xdif;
if( abs(flock[iflock, dx])>1, storm[iflock, dx]*=.9);
gregge[iflock, x] += gregge[iflock, dx]/velocità;
if((flock[iflock, x] < -5 & storm[iflock, dx] < 0)|(flock[iflock, x] >105 & storm[iflock, dx] > 0), storm[iflock, dx] = - stormo[iflock, dx]);
stormo[iflock, dy] += a*dysum + b*ysum + c*ydif;
if( abs(flock[iflock, dy])>1, storm[iflock, dy]*=.9);
stormo[iflock, y] += stormo[iflock, dy]/velocità;
if((flock[iflock, y] < -5 & storm[iflock, dy] < 0)|(flock[iflock, y] >105 & storm[iflock, dy] > 0), storm[iflock, dy] = - stormo[iflock, dy]);
flock[iflock,color]=heatcolor((neighbors)/(nears),"spectral");//heatcolor((neighbors-1)/(neighbors-1)/(near+10),"jet");//3+neighbors;/ /hlscolor(.4-.6*(vicini)/(vicino),.5,1);//
);
);
iterare();
Nuova finestra ("Flock",
Casella di riepilogo V(
gb = riquadro grafico(
sopprime,
dimensione del fotogramma ( 1922, 1082 ),
<
Dimensione penna( 3 );
For( i = 1, i <= nflock, i++,
Colore penna(flotta[i, colore]);
Line( {gregge[i, x] - gregge[i, dx], gregge[i, y] - gregge[i, dy]}, {gregge[i, x], gregge[i, y]} );
);
),
Casella di riepilogo H(
Casella di testo ("Allineamento"),
Casella di scorrimento( 0, .16, a ),
Casella di testo ("Coesione"),
Casella di scorrimento( 0, .2, b ),
Casella di testo ("Separazione"),
Casella di scorrimento ( 0, .4, c ),
Casella di testo ("Vicinato"),
Casella di scorrimento ( 0, 30, quartiere ),
,
Casella di testo (" NVicino " ),
Casella di scorrimento ( 1, 30, vicino ),
Casella di testo ("Velocità"),
Casella di scorrimento (.5, 30, velocità)
)
)
);
Mentre( frame<=27000,
gb << inval;
gb << finestra di aggiornamento;
Aspetta( 0 );
temp=gb[framebox(1)]<
pixel=temp<
pixel=pixel[3::1082,3::1922];
temp<
temp<
iterare();
);