<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Pintura en aerosol Fue un mal intento de comportarse en bandada.Creo que lo que me faltaba era la alineación, que http://gamedevelopment.tutsplus.com/tutorials/the-tres-simple-rules-of-flocking-behaviors-alignment-cohesion-and-separa… me guió hacia.Aquí tenéis un nuevo vídeo.
ChanceOfDragons - YouTube

Y aquí está el JSL para crear los mapas de bits (nuevamente, no me disculpo... necesitarás eliminar el cálculo de vecindad y nnear de la función de iteración si quieres jugar con los controles deslizantes.Este es el JSL final que se ejecutó durante varias horas para crear todos los mapas de bits, no el JSL inicial cuando intentaba encontrar algunos valores de parámetros que pudieran generar resultados interesantes).
// ideas tomadas de
// http://gamedevelopment.tutsplus.com/tutorials/the-tres-simple-rules-of-flocking-behaviors-alignment-cohesion-and-separation--gamedev-3444
barrio = 2; // radio del vecindario cercano
ncerca=20; // número de vecinos a encontrar en el barrio
a=.04;b=0.08;c=0.2;
w=.8;//1-w es tirar hacia el centro
speed=8;//cuanto más pequeño es más rápido
x = 1;
y = 2;
dx = 3;
dí = 4;
color=5;
var = 5;
nrebaño = 1700;
rebaño = J( nrebaño, nvar,. );
// establece posiciones iniciales de 10 a 90 y velocidades iniciales menores que 1
Asignación paralela(
{x = x, y = y, dx = dx, dy = dy, nflock = nflock,color=color},
rebaño[i, v] = Si( v < dx,
100*(i+100)/(nflock+200),//Entero aleatorio( 10, 90 ),
if(v
)
);
marco = 0;
iterar = Función( {},
{temp = rebaño, iflock, irow, kdt = KDTable( rebaño[0, 1 :: 2] ), dxsum, Dysum, xsum, ysum, myx, myy, xdif, ydif, vecino, nneighbors, len},
ncerca = 10*(1.1+sin(marco/2000)); // de uno a veinte vecinos más cercanos
barrio = 1*(1+cos(marco/3000)); // vecindad cero a dos
{filas, dist} = kdt << KNearestRows( {ncerca, vecindario});
marco++;
Para (iflock = 1, iflock <= nflock, iflock++,
myx = temp[iflock, x];
myy = temp[iflock, y];
dxsum = 0;
disum = 0; // suma de velocidades vecinas
xsuma = 0;
ysum = 0; // suma de posiciones vecinas
xdif = 0;
ydif = 0; // suma de distancias vecinas
vecinos = 0;
For( irow = 1, irow <= nnear & (vecino = filas[iflock, irow]) != 0, irow++,
vecinos++;
dxsum += temp[vecino, dx];
Dysum += temp[vecino, dy];
si(1,
xsum += temp[vecino, x];
ysum += temp[vecino, y];
si(1,
xdif += (myx - temp[vecino, x]); // vector alejado del vecino
ydif += (myy - temp[vecino, y]);
))
);
len = Sqrt( dxsum * dxsum + disum * disum );
Si(len!= 0,
dxsum /= len; // esto hace que la velocidad sea 1, en la dirección del grupo
disum /= len;
,
dxsum = 0;
disum = 0;
);
Si (vecinos,
xc = 50+40*sin((elegir(1+mod(iflock,3),3,5,7)*frame)/2207);
yc = 50+40*cos((elegir(1+mod(iflock,3),11,13,17)*frame)/3067);
xsum = ((1-w)*xc+(w*(xsum) / (nvecinos))) - myx; // este vector proporciona dirección al centro del grupo
ysum = ((1-w)*yc+(w*(ysum) / (nvecinos))) - myy;
len = Sqrt( xsum * xsum + ysum * ysum );
if(len!=0,xsum/=len;ysum/=len,xsum=0;ysum=0);// normalizado a 1
len = Sqrt( xdif * xdif + ydif * ydif );
if(len!=0,xdif/=len;ydif/=len,xdif=0;ydif=0); // normalizado a 1
,
xsuma = 0;
ysum = 0;
xdif = 0;
ydif = 0;
);
rebaño[iflock, dx] += a*dxsum + b*xsum + c*xdif;
if( abs(rebaño[iflock, dx])>1, rebaño[iflock, dx]*=.9);
rebaño[iflock, x] += rebaño[iflock, dx]/velocidad;
if((rebaño[iflock, x] < -5 & rebaño[iflock, dx] < 0)|(rebaño[iflock, x] >105 & rebaño[iflock, dx] > 0), rebaño[iflock, dx] = - rebaño[iflock, dx]);
rebaño[iflock, dy] += a*dysum + b*ysum + c*ydif;
if( abs(rebaño[iflock, dy])>1, rebaño[iflock, dy]*=.9);
rebaño[iflock, y] += rebaño[iflock, dy]/velocidad;
if((rebaño[iflock, y] < -5 & rebaño[iflock, dy] < 0)|(rebaño[iflock, y] >105 & rebaño[iflock, dy] > 0), rebaño[iflock, dy] = - rebaño[iflock, dy]);
grey[iflock,color]=heatcolor((nneighbors)/(nnear),"spectral");//heatcolor((nneighbors-1)/(nnear+10),"jet");//3+nneighbors;/ /hlscolor(.4-.6*(nvecinos)/(ncerca),.5,1);//
);
);
iterar();
Nueva ventana( "Bandada",
V Cuadro de lista(
gb = Cuadro de gráfico(
suprimir ejes,
tamaño de fotograma (1922, 1082),
<
Tamaño de la pluma (3);
Para (i = 1, i <= nflock, i++,
Color de pluma (rebaño[i, color]);
Línea ({rebaño[i, x] - rebaño[i, dx], rebaño[i, y] - rebaño[i, dy]}, {rebaño[i, x], rebaño[i, y]});
);
),
H Cuadro de lista(
Cuadro de texto ("Alineación"),
Cuadro deslizante (0, .16, a),
Cuadro de texto ("Cohesión"),
Cuadro deslizante (0, .2, b),
Cuadro de texto ("Separación"),
Cuadro deslizante (0, .4, c),
Cuadro de texto ("Vecindario"),
Cuadro deslizante (0, 30, vecindario),
,
Cuadro de texto( "NNerca"),
Caja deslizante (1, 30, ncerca),
Cuadro de texto ("Velocidad"),
Caja deslizante (.5, 30, velocidad)
)
)
);
Mientras(cuadro<=27000,
gb << inval;
gb << ventana de actualización;
Espere (0);
temp=gb[framebox(1)]<
píxeles=temp<
píxeles=píxeles[3::1082,3::1922];
temp<
temp<
iterar();
);