<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Peinture en aérosol était une mauvaise tentative de comportement de troupeau.Je pense que la partie qui me manquait était l'alignement, ce qui http://gamedevelopment.tutsplus.com/tutorials/the-trois-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 de proximité de la fonction itérer si vous voulez jouer avec les curseurs.Il s'agit du JSL final qui a duré plusieurs heures pour créer tous les bitmaps, pas du 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-trois-simple-rules-of-flocking-behaviors-alignment-cohesion-and-separation--gamedev-3444
quartier = 2 ; // rayon du quartier proche
près = 20 ; // nombre de voisins à trouver dans le quartier
a=0,04;b=0,08;c=0,2;
w=0,8 ;//1-w est tiré vers le centre
vitesse = 8 ; // plus petit est plus rapide
x = 1 ;
y = 2 ;
dx = 3 ;
jour = 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
Attribution parallèle (
{x = x, y = y, dx = dx, dy = dy, nflock = nflock,color=color},
troupeau[i, v] = Si( v < dx,
100*(i+100)/(nflock+200),//Entier aléatoire ( 10, 90 ),
if(v
)
);
cadre = 0 ;
itérer = Fonction ( {},
{temp = flock, iflock, irow, kdt = KDTable( flock[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
quartier = 1*(1+cos(frame/3000)); // zéro à deux quartiers
{lignes, dist} = kdt << KNearestRows( {nnear, voisinage} );
cadre++;
Pour( iflock = 1, iflock <= nflock, iflock++,
myx = temp[iflock, x];
mony = temp[iflock, y];
somme dx = 0 ;
dysum = 0 ; // somme des vitesses voisines
somme x = 0 ;
somme = 0 ; // somme des positions voisines
xdif = 0 ;
ydif = 0 ; // somme des distances des voisins
voisins = 0 ;
Pour( 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;
,
somme dx = 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) / (nevoisins))) - myx; // ce vecteur fournit la direction vers le centre du groupe
ysum = ((1-w)*yc+(w*(ysum) / (nevoisins))) - 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 );
si(len!=0,xdif/=len;ydif/=len,xdif=0;ydif=0); // normalisé à 1
,
somme x = 0 ;
somme = 0 ;
xdif = 0 ;
ydif = 0 ;
);
troupeau[iflock, dx] += a*dxsum + b*xsum + c*xdif;
if( abs(troupeau[iflock, dx])>1, troupeau[iflock, dx]*=.9);
troupeau[iflock, x] += troupeau[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]);
flock[iflock, dy] += a*dysum + b*ysum + c*ydif;
if( abs(troupeau[iflock, dy])>1, troupeau[iflock, dy]*=.9);
troupeau[iflock, y] += troupeau[iflock, dy]/vitesse;
if((troupeau[iflock, y] < -5 & troupeau[iflock, dy] < 0)|(troupeau[iflock, y] >105 & troupeau[iflock, dy] > 0), troupeau[iflock, dy] = - troupeau[iflock, dy]);
flock[iflock,color]=heatcolor((neighbors)/(nnear),"spectral");//heatcolor((nneighbors-1)/(nnear+10),"jet");//3+nneighbors;/ /hlscolor(.4-.6*(nevoisins)/(near),.5,1);//
);
);
répéter();
Nouvelle fenêtre( "Troupeau",
Zone de liste V (
gb = Zone graphique (
suppressions,
taille du cadre (1922, 1082),
<
Taille du stylo (3) ;
Pour( je = 1, je <= nflock, je++,
Couleur du stylo( flock[i, color] );
Ligne( {troupeau[i, x] - troupeau[i, dx], troupeau[i, y] - troupeau[i, dy]}, {troupeau[i, x], troupeau[i, y]} );
);
),
Zone de liste H (
Zone de texte( "Alignement" ),
Boîte de curseur (0, .16, a),
Zone de texte( " Cohésion" ),
Boîte de curseur (0, .2, b),
Zone de texte( " Séparation" ),
Boîte de curseur (0, .4, c),
Zone de texte( "Quartier" ),
Boîte de curseur (0, 30, quartier),
,
Zone de texte( " NProche" ),
Boîte de curseur (1, 30, proche),
Zone de texte( " Vitesse " ),
Boîte de curseur (0,5, 30, vitesse)
)
)
);
Tandis que( frame<=27000,
gb << inval;
gb << updatewindow;
Attendez( 0 );
temp=gb[framebox(1)]<
pixels=temp<
pixels=pixels[3::1082,3::1922];
temp<
temp<
répéter();
);