<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Pintura en aerosol fue un mal intento de comportamiento de flocado.Creo que la parte que me faltaba era la alineación, que http://gamedevelopment.tutsplus.com/tutorials/the-three-simple-rules-of-flocking-behaviors-alignment-cohesion-and-separa… me dirigió hacia.Aquí hay un nuevo video.
ChanceOfDragons - YouTube

Y aquí está el JSL para crear los mapas de bits (nuevamente, no me disculpo... tendrá que eliminar el cálculo de vecindad y cercanía de la función de iteración si quiere jugar con los controles deslizantes.Este es el JSL final que se ejecutó durante varias horas para hacer todos los mapas de bits, no el JSL anterior cuando estaba tratando de encontrar algunos valores de parámetros que generarían resultados interesantes).
// ideas tomadas de
// http://gamedevelopment.tutsplus.com/tutorials/the-three-simple-rules-of-flocking-behaviors-alignment-cohesion-and-separation--gamedev-3444
barrio = 2; // radio del vecindario cercano
ncerca=20; // numero de vecinos a encontrar en el barrio
a=.04;b=0.08;c=0.2;
w=.8;//1-w es tirar al centro
velocidad=8;//cuanto más pequeño es más rápido
x = 1;
y = 2;
dx = 3;
dy = 4;
color=5;
nvar = 5;
nflock = 1700;
bandada = J( n bandada, nvar, . );
// establecer posiciones iniciales de 10 a 90 y velocidades iniciales inferiores a 1
Asignación en paralelo (
{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
vecindad = 1*(1+cos(marco/3000)); // vecindario cero a dos
{filas, dist} = kdt << KNearestRows( {nearestRows} );
marco++;
For( iflock = 1, iflock <= nflock, iflock++,
myx = temp[sibloqueo, x];
myy = temp[iflock, y];
dxsum = 0;
disuma = 0; // suma de velocidades vecinas
xsuma = 0;
ysuma = 0; // suma de posiciones vecinas
xdif = 0;
ydif = 0; // suma de distancias vecinas
nvecinos = 0;
For( irow = 1, irow <= nnear & (vecino = filas[iflock, irow]) != 0, irow++,
vecinos++;
dxsum += temp[vecino, dx];
disum += temp[vecino, dy];
si (1,
xsum += temp[vecino, x];
ysum += temp[vecino, y];
si (1,
xdif += (myx - temp[vecino, x]); // vector lejos del vecino
ydif += (myy - temp[vecino, y]);
))
);
len = Sqrt( dxsum * dxsum + dysum * dysum );
Si (largo! = 0,
dxsum /= len; // esto hace que la velocidad se vuelva 1, en la dirección del grupo
disum /= len;
,
dxsum = 0;
disuma = 0;
);
Si( nvecinos,
xc = 50+40*sin((elegir(1+mod(iflock,3),3,5,7)*marco)/2207);
yc = 50+40*cos((elegir(1+mod(iflock,3),11,13,17)*marco)/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(largo!=0,xdif/=largo;ydif/=largo,xdif=0;ydif=0); // normalizado a 1
,
xsuma = 0;
ysuma = 0;
xdif = 0;
ydif = 0;
);
rebaño[iflock, dx] += a*dxsum + b*xsum + c*xdif;
if(abs(rebaño[sibloqueo, dx])>1, rebaño[sibloqueo, dx]*=.9);
bandada[sibloqueo, x] += bandada[sibloqueo, dx]/velocidad;
if((rebaño[sibloqueo, x] < -5 & rebaño[bloqueo, dx] < 0)|(rebaño[bloqueo, x] >105 & rebaño[bloqueo, dx] > 0), rebaño[bloqueo, dx] = - rebaño[iflock, dx]);
rebaño[iflock, dy] += a*dysum + b*ysum + c*ydif;
if( abs(rebaño[sibloqueo, dy])>1, rebaño[sibloqueo, dy]*=.9);
bandada[sibloqueo, y] += bandada[sibloqueo, dy]/velocidad;
if((rebaño[sibloqueo, y] < -5 & rebaño[sibloqueo, dy] < 0)|(rebaño[sibloqueo, y] >105 & rebaño[sibloqueo, dy] > 0), rebaño[sibloqueo, dy] = - rebaño[iflock, dy]);
bandada[sibloqueo,color]=colorcalor((nvecinos)/(ncerca),"espectral");//colorcalor((nvecinos-1)/(ncerca+10),"chorro");//3+nvecinos;/ /hlscolor(.4-.6*(nvecinos)/(ncerca),.5,1);//
);
);
iterar();
Nueva ventana( "Rebaño",
Cuadro de lista V (
gb = cuadro gráfico (
hachas supresoras,
tamaño de fotograma (1922, 1082),
<
Tamaño del bolígrafo (3);
For( i = 1, i <= nflock, i++,
Color de pluma( bandada[i, color] );
Line( {rebaño[i, x] - rebaño[i, dx], rebaño[i, y] - rebaño[i, dy]}, {rebaño[i, x], rebaño[i, y]});
);
),
Cuadro de lista H(
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( " Barrio " ),
Cuadro deslizante (0, 30, vecindario),
,
Cuadro de texto( "Ncerca de"),
Cuadro deslizante (1, 30, nnear),
Cuadro de texto ("Velocidad"),
Cuadro deslizante (.5, 30, velocidad)
)
)
);
Mientras (marco <= 27000,
gb << inval;
gb << ventana de actualización;
Espera(0);
temp=gb[framebox(1)]<
píxeles=temp<
píxeles=píxeles[3::1082,3::1922];
temp<
temp<
iterar();
);