<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; // 附近鄰域的半徑
近=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;
群 = J( nflock, nvar, . );
// 設置初始位置從 10 到 90,初始速度小於 1
並行分配(
{x = x, y = y, dx = dx, dy = dy, nflock = nflock,color=color},
群[i, v] = If( v < dx,
100*(i+100)/(nflock+200),//隨機整數(10, 90),
if(v
)
);
幀 = 0;
迭代 = 函數({},
{temp=flock,iflock,irow,kdt = KDTable(flock[0, 1 :: 2]),dxsum,dysum,xsum,ysum,myx,myy,xdif,ydif,neighbors,len},
近 = 10*(1.1+sin(幀/2000)); // 一到二十個最近的鄰居
鄰域 = 1*(1+cos(frame/3000)); // 零到兩個鄰域
{rows, dist} = kdt << KNearestRows({nnear, 鄰域});
框架++;
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 <= nnear & (neighbor = rows[iflock, irow]) != 0, irow++,
鄰居++;
dxsum += temp[鄰居,dx];
dysum += temp[neighbor, dy];
如果(1,
xsum += temp[鄰居,x];
ysum += temp[鄰居,y];
如果(1,
xdif += (myx - temp[neighbor, x]); // 遠離鄰居的向量
ydif += (myy - temp[neighbor, y]);
))
);
len = Sqrt(dxsum * dxsum +dysum *dysum);
如果(長度!= 0,
dxsum /= 長度; // 這使得速度變為 1,在組的方向
dysum /= len;
,
dxsum = 0;
釔= 0;
);
如果(鄰居,
xc = 50+40*sin((選擇(1+mod(iflock,3),3,5,7)*frame)/2207);
yc = 50+40*cos((選擇(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;
);
群[iflock, dx] += a*dxsum + b*xsum + c*xdif;
如果(abs(flock[iflock,dx])>1,flock[iflock,dx]*=.9);
羊群[iflock, x] +=羊群[iflock, dx]/速度;
if((flock[iflock, x] < -5 & flock[iflock, dx] < 0)|(flock[iflock, x] >105 & flock[iflock, dx] > 0), flock[iflock, dx] = - 羊群[iflock, dx]);
群[iflock, dy] += a*dysum + b*ysum + c*ydif;
if( abs(flock[iflock, dy])>1, flock[iflock, dy]*=.9);
羊群[iflock, y] +=羊群[iflock, dy]/速度;
if((flock[iflock, y] < -5 & flock[iflock, dy] < 0)|(flock[iflock, y] >105 & flock[iflock, dy] > 0), flock[iflock, dy] = - 羊群[iflock, dy]);
flock[iflock,color]=heatcolor((nneighbors)/(nnear),"spectral");//heatcolor((nneighbors-1)/(nnear+10),"jet");//3+nneighbors;/ /hlscolor(.4-.6*(nneighbors)/(near),.5,1);//
);
);
迭代();
新窗口(“群”,
V 列錶框(
gb = 圖形框(
抑制軸,
幀大小(1922、1082),
<
筆大小(3);
對於( i = 1, i <= nflock, i++,
筆顏色(羊群[i,顏色]);
Line( {flock[i, x] - 群[i, dx], 群[i, y] - 群[i, dy]}, {flock[i, x], 群[i, y]} );
);
),
H 列錶框(
文本框(“對齊”),
滑塊 (0, .16, a),
文本框(“凝聚力”),
滑塊 (0, .2, b),
文本框(“分隔”),
滑塊 (0, .4, c),
文本框(“鄰居”),
滑塊框(0、30、鄰域)、
,
文本框(“近鄰”),
滑塊 (1, 30, 近),
文本框(“速度”),
滑塊(0.5、30、速度)
)
)
);
而(幀<=27000,
gb <<無效;
gb << 更新窗口;
等待(0);
temp=gb[framebox(1)]<
像素=溫度<<獲取像素;
像素=像素[3::1082,3::1922];
臨時<<設置像素(像素);
temp<
迭代();
);