<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;
羊群 = J( nflock, nvar, . );
// 設定初始位置從 10 到 90,初始速度小於 1
並行分配(
{x = x,y = y,dx = dx,dy = dy,nflock = nflock,顏色=顏色},
羊群[i, v] = If( v < dx,
100*(i+100)/(nflock+200),//隨機整數( 10, 90 ),
if(v<顏色,Max( -1, Min( 1, /*隨機常態( 0, 1 )*/(i-nflock/2)/(nflock/2) ) ), rgbcolor(0,0,0 ) )
)
);
幀=0;
迭代=函數({},
{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*(1+cos(幀/3000)); // 零到二鄰域
{rows, dist} = kdt << KNearestRows( {nnear, Neighborhood} );
框架++;
對於( iflock = 1, iflock <= nflock, iflock++,
myx = temp[iflock, x];
myy = temp[iflock, y];
dx 總和 = 0;
鏑 = 0; // 鄰居速度之和
x 總和 = 0;
總和 = 0; // 相鄰位置的總和
xdif = 0;
ydif = 0; // 鄰居距離之和
鄰居=0;
For( irow = 1, irow <= nnear & (neighbor = rows[iflock, irow]) != 0, irow++,
鄰居++;
dxsum += temp[鄰居, dx];
Dysum += temp[鄰居, dy];
如果(1,
xsum += temp[鄰居, x];
ysum += temp[鄰居, y];
如果(1,
xdif += (myx - temp[鄰居, x]); // 遠離鄰居的向量
ydif += (myy - temp[鄰居, y]);
))
);
len = Sqrt( dxsum * dxsum + Dysum * Dysum );
如果(長度!= 0,
dxsum /= 長度; // 這使得團隊方向上的速度變成 1
Dysum /= len;
,
dx 總和 = 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)*幀)/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
,
x 總和 = 0;
總和 = 0;
xdif = 0;
ydif = 0;
);
羊群[iflock, dx] += a*dxsum + b*xsum + c*xdif;
if(ABS(flock[iflock, dx])>1,flock[iflock, dx]*=.9);
羊群[iflock, x] += 羊群[iflock, dx]/速度;
if((flock[iflock, x] < -5 & 羊群[iflock, dx] < 0)|(flock[iflock, x] >105 & 羊群[iflock, dx] > 0), 羊群[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 & 羊群[iflock, dy] < 0)|(flock[iflock, y] >105 & 羊群[iflock, dy] > 0), 羊群[iflock, dy] = - 羊群[iflock, dy]);
flock[iflock,color]=heatcolor((nneighbors)/(nnear),"光譜");//heatcolor((nneighbors-1)/(nnear+10),"jet");//3+nneighbors;/ /hlscolor(.4-.6*(nneighbors)/(nnear),.5,1);//
);
);
迭代();
新視窗(“羊群”,
V 列錶框(
gb = 圖形框(
抑制器,
框架尺寸( 1922, 1082 ),
<<背景顏色( RGB 顏色( 0, 0, 0 ) ),
筆尺寸(3);
對於( i = 1, i <= nflock, i++,
筆顏色(flock[i,顏色]);
Line( {flock[i, x] - 羊群[i, dx], 羊群[i, y] - 羊群[i, dy]}, {羊群[i, x], 羊群[i, y ]} );
);
),
H 列錶框(
文字方塊(“對齊方式”),
滑桿框( 0, .16, a ),
文字方塊(“內聚力”),
滑桿框( 0, .2, b ),
文字方塊(“分隔”),
滑桿框( 0, .4, c ),
文字方塊(“鄰居”),
滑桿框( 0, 30, 鄰域 ),
,
文字方塊(“NNear”),
滑塊盒( 1, 30, 近),
文字方塊(“速度”),
滑塊箱(0.5、30、速度)
)
)
);
而(幀<=27000,
gb << 無效;
gb << 更新視窗;
等待(0);
temp=gb[framebox(1)]<
像素=暫時<
像素=像素[3::1082,3::1922];
溫度<
temp<
迭代();
);