<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<
迭代();
);