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