<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />スプレーペイント群がる行動としては不適切な試みでした。私に欠けていた部分はアライメントだったと思います。 http://gamedevelopment.tutsplus.com/tutorials/the-three-simple-rules-of-flocking-behaviors-alignment-cohesion-and-separa…私をその方向に導いた。新しいビデオはこちらです。
チャンスオブドラゴンズ - YouTube

そして、これがビットマップを作成するための JSL です (繰り返しになりますが、申し訳ありません...スライダを操作したい場合は、反復関数から近傍と近傍の計算を削除する必要があります。これは、すべてのビットマップを作成するために数時間実行された最後の JSL であり、興味深い結果を生み出すいくつかのパラメーター値を見つけようとしていた初期の JSL ではありません。)
// アイデアを借用しました
// http://gamedevelopment.tutsplus.com/tutorials/the-three-simple-rules-of-flocking-behaviors-alignment-cohesion-and-separation--gamedev-3444
近隣 = 2; // 近隣の半径
近い=20; // 近隣で検索する近傍の数
a=.04;b=0.08;c=0.2;
w=.8;//1-w は中央に引っ張られます
Speed=8;//小さいほど速い
x = 1;
y = 2;
dx = 3;
dy = 4;
色=5;
nvar = 5;
nflock = 1700;
flock = J( nflock, nvar, . );
// 初期位置を 10 ~ 90 に設定し、初期速度を 1 未満に設定します
並列割り当て(
{x = x、y = y、dx = dx、dy = dy、nflock = nflock、color=color}、
flock[i, v] = If( v < dx,
100*(i+100)/(nflock+200),//ランダム整数( 10, 90 ),
if(v
)
);
フレーム = 0;
iterate = Function( {},
{temp = flock、iflock、irow、kdt = KDTable( flock[0, 1 :: 2] )、dxsum、dysum、xsum、ysum、myx、myy、xdif、ydif、neighbor、nneighbors、len}、
nnear = 10*(1.1+sin(フレーム/2000)); // 1 から 20 の最近傍
近傍 = 1*(1+cos(フレーム/3000)); // 0 から 2 の近傍
{行, 距離} = kdt << KNearestRows( {近く, 近傍} );
フレーム++;
For( iflock = 1、iflock <= nflock、iflock++、
myx = temp[iflock, x];
myy = temp[iflock, y];
dxsum = 0;
ディサム = 0; // 隣接する速度の合計
xsum = 0;
ysum = 0; // 隣接する位置の合計
xdif = 0;
ydif = 0; // 隣接距離の合計
近隣 = 0;
For( irow = 1, irow <= near & (neighbor = rows[iflock, irow]) != 0, irow++,
隣人++;
dxsum += temp[近傍, dx];
dysum += temp[隣人、dy];
if(1,
xsum += temp[隣人, x];
ysum += temp[隣人, y];
if(1,
xdif += (myx - temp[neighbor, x]); // 隣から遠ざかるベクトル
ydif += (myy - temp[隣人, y]);
))
);
len = Sqrt( dxsum * dxsum + dysum * dysum );
If( len != 0,
dxsum /= 長さ; // これにより、グループの方向の速度が 1 になります。
ディサム /= レン;
、
dxsum = 0;
ディサム = 0;
);
If( 隣人、
xc = 50+40*sin((choose(1+mod(iflock,3),3,5,7)*frame)/2207);
yc = 50+40*cos((choose(1+mod(iflock,3),11,13,17)*frame)/3067);
xsum = ((1-w)*xc+(w*(xsum) / (nneighbors))) - myx; // このベクトルはグループの中心への方向を提供します
ysum = ((1-w)*yc+(w*(ysum) / (nneighbors))) - myy;
len = Sqrt( xsum * xsum + ysum * ysum );
if(len!=0,xsum/=len;ysum/=len,xsum=0;ysum=0);// 1 に正規化される
len = Sqrt( xdif * xdif + ydif * ydif );
if(len!=0,xdif/=len;ydif/=len,xdif=0;ydif=0); // 1に正規化される
、
xsum = 0;
ysum = 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]/速度;
if((flock[iflock, x] < -5 & flock[iflock, dx] < 0)|(flock[iflock, x] >105 & flock[iflock, dx] > 0), flock[iflock, dx] = - フロック[iflock, dx]);
flock[iflock, dy] += a*dysum + b*ysum + c*ydif;
if( abs(flock[iflock, dy])>1, flock[iflock, dy]*=.9);
flock[iflock, y] += flock[iflock, dy]/速度;
if((flock[iflock, y] < -5 & flock[iflock, dy] < 0)|(flock[iflock, y] >105 & flock[iflock, dy] > 0), flock[iflock, dy] = - flock[iflock, dy]);
flock[iflock,color]=heatcolor((nneighbors)/(nnear),"spectral");//heatcolor((nneighbors-1)/(nnear+10),"jet");//3+nneighbors;/ /hlscolor(.4-.6*(近傍)/(近傍),.5,1);//
);
);
反復();
新しいウィンドウ( "群れ",
V リストボックス(
gb = グラフボックス(
サプレッサーックス、
フレームサイズ( 1922, 1082 )、
<
ペンのサイズ( 3 );
For( i = 1, i <= nflock, i++,
ペンの色( flock[i, color] );
Line( {flock[i, x] - flock[i, dx], flock[i, y] - flock[i, dy]}, {flock[i, x], flock[i, y]} );
);
)、
H リスト ボックス(
テキストボックス(「配置」)、
スライダー ボックス( 0, .16, a )、
テキストボックス(「結合力」)、
スライダー ボックス( 0, .2, b )、
テキストボックス(「区切り」)、
スライダーボックス(0, .4, c)、
テキストボックス(「近所」)、
スライダーボックス(0、30、近傍)、
、
テキストボックス(「Near」)、
スライダーボックス(1、30、付近)、
テキストボックス(「速度」)、
スライダーボックス(.5、30、スピード)
)
)
);
While( フレーム<=27000,
gb << 無効;
gb << 更新ウィンドウ;
待機( 0 );
temp=gb[framebox(1)]<
ピクセル=temp<
ピクセル=ピクセル[3::1082,3::1922];
temp<
temp<
反復();
);