<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…私をに向けた。これが新しいビデオです。
ChanceOfDragons-YouTube

そして、これがビットマップを作成するためのJSLです(ここでも、お詫びはありません...スライダーを操作する場合は、反復関数から近傍と近傍の計算を削除する必要があります。これは、すべてのビットマップを作成するために数時間実行された最後のJSLであり、興味深い結果をもたらすいくつかのパラメーター値を見つけようとした初期のJSLではありません。)
//から借りたアイデア
// http://gamedevelopment.tutsplus.com/tutorials/the-three-simple-rules-of-flocking-behaviors-alignment-cohesion-and-separation--gamedev-3444
近所=2; //近隣の半径
nnear = 20; //近隣で検索する近隣の数
a = .04; b = 0.08; c = 0.2;
w = .8;//1-wは中央に引っ張られます
speed =8;//小さいほど速い
x = 1;
y = 2;
dx = 3;
dy = 4;
color = 5;
nvar = 5;
nflock = 1700;
flock = J(nflock、nvar、。);
//初期位置を10から90に設定し、初期速度を1未満に設定します
Parallel Assign(
{x = x、y = y、dx = dx、dy = dy、nflock = nflock、color = color}、
flock [i、v] = If(v
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(frame / 2000)); // 1〜20個の最近傍
近傍=1*(1 + cos(frame / 3000)); //0から2の近隣
{rows、dist} = kdt << KNearestRows({near、neighborhood});
フレーム++;
For(iflock = 1、iflock <= nflock、iflock ++、
myx = temp [iflock、x];
myy = temp [iflock、y];
dxsum = 0;
dysum = 0; //隣接速度の合計
xsum = 0;
ysum = 0; //隣接する位置の合計
xdif = 0;
ydif = 0; //隣接距離の合計
隣人=0;
For(irow = 1、irow <= nnear&(neighbor = rows [iflock、irow])!= 0、irow ++、
隣人++;
dxsum + = temp [neighbor、dx];
dysum + = temp [neighbor、dy];
if(1、
xsum + = temp [neighbor、x];
ysum + = temp [neighbor、y];
if(1、
xdif + =(myx --temp [neighbor、x]); //隣人から離れたベクトル
ydif + =(myy --temp [neighbor、y]);
))
);
len = Sqrt(dxsum * dxsum + dysum * dysum);
If(len!= 0、
dxsum / = len; //これにより、グループの方向で速度が1になります
dysum / = len;
、
dxsum = 0;
dysum = 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)/(近隣)))-myx; //このベクトルはグループの中心への方向を提供します
ysum =((1-w)* yc +(w *(ysum)/(隣人)))-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] / speed;
if((flock [iflock、x] <-5&flock [iflock、dx] <0)|(flock [iflock、x]> 105&flock [iflock、dx]> 0)、flock [iflock、dx] = --flock [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] / speed;
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*(nneighbors)/(nnear),.5,1); //
);
);
iterate();
新しいウィンドウ( "群れ"、
Vリストボックス(
gb =グラフボックス(
抑制軸、
framesize(1922、1082)、
<< backgroundcolor(RGB Color(0、0、0))、
ペンサイズ(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、近隣)、
、
テキストボックス( "NNear")、
スライダーボックス(1、30、近く)、
テキストボックス( "速度")、
スライダーボックス(.5、30、速度)
)。
)。
);
While(frame <= 27000、
gb << inval;
gb << updatewindow;
Wait(0);
temp = gb [framebox(1)] << getpicture;
pixel = temp << getpixels;
pixel = pixel [3 :: 1082,3 :: 1922];
temp << setpixels(pixels);
temp << saveimage( "$ temp / f" || right(char(frame、9)、9、 "0")|| ".png");
iterate();
);