<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Peinture en aérosol était une mauvaise tentative de comportement de flocage.Je pense que la partie qui me manquait était l'alignement, qui http://gamedevelopment.tutsplus.com/tutorials/the-three-simple-rules-of-flocking-behaviors-alignment-cohesion-and-separa… m'a dirigé vers.Voici une nouvelle vidéo.
ChanceOfDragons - YouTube

Et voici le JSL pour créer les bitmaps (encore une fois, pas d'excuses... vous devrez supprimer le calcul de voisinage et proche de la fonction d'itération si vous voulez jouer avec les curseurs.C'est le JSL final qui a fonctionné pendant plusieurs heures pour créer tous les bitmaps, pas le premier JSL lorsque j'essayais de trouver des valeurs de paramètres qui donneraient des résultats intéressants.)
// idées empruntées à
// http://gamedevelopment.tutsplus.com/tutorials/the-three-simple-rules-of-flocking-behaviors-alignment-cohesion-and-separation--gamedev-3444
voisinage = 2 ; // rayon du voisinage proche
proche=20 ; // nombre de voisins à trouver dans le voisinage
a=0,04 ;b=0,08 ;c=0,2 ;
w=.8 ;//1-w est tiré vers le centre
speed=8 ; // plus petit est plus rapide
x = 1 ;
y = 2 ;
dx = 3 ;
dy = 4 ;
couleur=5 ;
nvar = 5 ;
nflock = 1700 ;
troupeau = J( nflock, nvar, . );
// définit les positions initiales de 10 à 90 et les vitesses initiales inférieures à 1
Affectation parallèle(
{x = x, y = y, dx = dx, dy = dy, nflock = nflock,couleur=couleur},
troupeau[i, v] = Si( v < dx,
100*(i+100)/(nflock+200),//Entier aléatoire( 10, 90 ),
if(v
)
);
cadre = 0 ;
itérer = Fonction( {},
{temp = troupeau, iflock, irow, kdt = KDTable( troupeau[0, 1 :: 2] ), dxsum, dysum, xsum, ysum, myx, myy, xdif, ydif, voisin, voisins, len},
nnear = 10*(1.1+sin(frame/2000)); // un à vingt voisins les plus proches
voisinage = 1*(1+cos(frame/3000)); // quartier de zéro à deux
{lignes, dist} = kdt << KNearestRows( {nnear, voisinage} );
cadre++ ;
Pour( iflock = 1, iflock <= nflock, iflock++,
myx = temp[iflock, x] ;
may = temp[iflock, y] ;
dxsum = 0 ;
dysum = 0 ; // somme des vitesses voisines
xsum = 0 ;
ysomme = 0 ; // somme des positions voisines
xdif = 0 ;
ydif = 0 ; // somme des distances voisines
voisins = 0 ;
For( irow = 1, irow <= nnear & (neighbor = rows[iflock, irow]) != 0, irow++,
voisins++ ;
dxsum += temp[voisin, dx] ;
dysum += temp[voisin, dy] ;
si(1,
xsum += temp[voisin, x] ;
ysum += temp[voisin, y] ;
si(1,
xdif += (myx - temp[voisin, x]); // vecteur éloigné du voisin
ydif += (myy - temp[voisin, y]);
))
);
len = Sqrt( dxsum * dxsum + dysum * dysum );
Si( len != 0,
dxsum /= len; // cela fait que la vitesse devient 1, dans la direction du groupe
dysum /= len;
,
dxsum = 0 ;
dysum = 0 ;
);
Si( voisins,
xc = 50+40*sin((choisissez(1+mod(iflock,3),3,5,7)*frame)/2207);
yc = 50+40*cos((choisissez(1+mod(iflock,3),11,13,17)*frame)/3067);
xsum = ((1-w)*xc+(w*(xsum) / (voisins))) - myx ; // ce vecteur donne la direction au centre du groupe
ysum = ((1-w)*yc+(w*(ysum) / (voisins))) - myy ;
len = Sqrt( xsum * xsum + ysum * ysum );
if(len!=0,xsum/=len;ysum/=len,xsum=0;ysum=0);// normalisé à 1
len = Sqrt( xdif * xdif + ydif * ydif );
if(len!=0,xdif/=len;ydif/=len,xdif=0;ydif=0); // normalisé à 1
,
xsum = 0 ;
ysomme = 0 ;
xdif = 0 ;
ydif = 0 ;
);
flock[iflock, dx] += a*dxsum + b*xsum + c*xdif ;
if( abs(flock[iflock, dx])>1, flock[iflock, dx]*=.9);
flock[iflock, x] += flock[iflock, dx]/vitesse ;
if((flock[iflock, x] < -5 & flock[iflock, dx] < 0)|(flock[iflock, x] >105 & flock[iflock, dx] > 0), flock[iflock, dx] = - troupeau[iflock, dx]);
troupeau[iflock, dy] += a*dysum + b*ysum + c*ydif ;
if( abs(flock[iflock, dy])>1, flock[iflock, dy]*=.9);
flock[iflock, y] += flock[iflock, dy]/vitesse ;
if((flock[iflock, y] < -5 & flock[iflock, dy] < 0)|(flock[iflock, y] >105 & flock[iflock, dy] > 0), flock[iflock, dy] = - troupeau[iflock, dy]);
flock[iflock,color]=heatcolor((neighbors)/(near),"spectral");//heatcolor((neighbors-1)/(nnear+10),"jet");//3+neighbors;/ /hlscolor(.4-.6*(voisins)/(neproche),.5,1);//
);
);
répéter();
Nouvelle fenêtre( "Flock",
Zone de liste V(
gb = Boîte graphique(
suppression des taxes,
taille de trame( 1922, 1082 ),
<
Taille du stylo ( 3 );
Pour( i = 1, i <= nflock, i++,
Couleur du stylo( flock[i, color] );
Line( {troupeau[i, x] - troupeau[i, dx], troupeau[i, y] - troupeau[i, dy]}, {troupeau[i, x], troupeau[i, y]} );
);
),
H Zone de liste(
Zone de texte( " Alignement"),
Boîte à curseur( 0, .16, a ),
Text Box( " Cohésion"),
Boîte à curseur( 0, .2, b ),
Zone de texte( " Séparation"),
Boîte à curseur( 0, .4, c ),
Text Box( " Quartier"),
Slider Box( 0, 30, voisinage ),
,
Zone de texte( " NNear" ),
Boîte à curseur (1, 30, proche),
Zone de texte( " Vitesse"),
Boîte à curseur (.5, 30, vitesse)
)
)
);
Tandis que (image<=27000,
gb << inval;
gb << fenêtre de mise à jour ;
Attendez( 0 );
temp=gb[framebox(1)]<
pixels=temp<
pixels=pixels[3::1082,3::1922] ;
temp<
temp<
répéter();
);