BOIDS规则
今天总结了下BOIDS规则,希望对各位有用。不知道boids是什么的可以进这里看看:http://www.red3d.com/cwr/boids/
基本规则:
1.靠近
往圈内其它点的中心靠拢,受到一个牵引力
2.对齐
与圈内其他点的方向的平均值对齐
3.避免碰撞
离圈内最近点的距离小于最小可靠近距离则受到一个远离的力
规则分析:
//规则一:靠近
//靠近 周围可见区域 的 所有点的中心
//即:提供一个 靠近中心 的 加速度
//要求:
//1.找出区域内的点
//2.求出中心
//3.设定加速大小方向
// 到中心的距离d越大,加速度a越大;
// 方向为点到中心的方向
//规则二:对齐方向
//调整 方向,使方向尽量靠近 区域内所有点的 平均速度方向
//即:提供一个 旋转速度方向 的 加速度
//要求:
//1.找出区域内的点
//2.求出平均速度方向
//3.设定加速大小和方向
// 当前速度方向和平均速度方向的夹角alpha越大,加速度a越大;
// 方向为垂直于当前速度朝着平均速度的方向
//规则三:避免碰撞
//避免和区域内的点的距离小于最小可靠近距离MINDIS
//即:当离区域内某点的距离小于某个值时,开始施加一个加速度
//要求:
//1.找出区域内的点
//2.求出当前点到其他点的距离
//3.如果距离小于某个值时,就产生一个加速
// 加速度大小随着距离的减小而增大;
// 方向为其他点到当前位置点的方向
外加一个规则
//规则四:躲避边界
//当靠近边界时,施加一个躲避边界的加速度
//即:当区域有部分出界时,施加角速度(类似于规则二,但刚好相反),调整方向,使其远离边界
//要求:
//1.找出出界区域
//2.施加一个垂直于相交线的加速度
// 大小随着点到线的距离减小而增加
// 方向垂直于相交线远离边界线
分析之后的总结:(相当于伪代码吧)
1.确定区域;
2.判断 其他点 是否在 该点的 可见区域内;
求 该点 到 其他点 的 距离,并将各个距离保存到一个临时数组d[i]中,本身的i位置设为MAX。
如果 距离 小于 半径:
求出 该点 到 其它点 的 距离的方向;
如果 距离方向 和 该点的方向 的夹角 小于 规定的角度 则判断点在区域内。
在区域内将isinside[i]设为true;(默认为false,本身默认为true)
//以下的平均值都包括该点本身在内
3.求出区域内各个点的平均位置:sum(x)/n,sum(y)/n;
4. 规则一:
求出该点到平均位置的距离和方向。d=...;vx=x-x0;vy=y-y0;
a1 = MAXA*(d初-d)/d初;//d初表示开始产生加速度时的距离,d末表示最小可以靠近的距离为0。
Ax1 = x-x0;
Ay1 = y-y0;//x,y为平均位置,x0,y0为该点位置;
5.规则二:
求出区域内所有点的平均的平均速度方向:vx=sum(vx)/n;vy=sum(vy)/n;
6.求出平均速度方向vxvy和该点速度方向的夹角,夹角alpha越大,加速度a越大;
a2 = MAXA*alpha/pi
方向为 垂直于当前速度 朝着平均速度 的方向
求加速方向的方法:求(x-vy,y+vx)到(x+_vx,y+_vy)的距离d,
if d > sqrt(_vx^2+_vy^2)
A2=(vy,-vx)
else A2=(-vy,vx)
7.规则三:
if d[i] < d初
a3[i] = MAXA*(d初-d[i])/(d初-d末)
Ax3[i] = x0 - xi;
Ay3[i] = y0 - yi;
else
a3[i] = 0;
8.规则四:
i=0 -> 边界点的个数(分内外界)
求相交区域特殊处理(将区域扩展为一个圆):
先求点到边的距离db[i]
if db[i]小于半径
产生加速度ab[i] = a3[i] = MAXA*(d初-db[i])/(d初-d末)
AX,AY垂直于边界,方向由垂点向圆心:即 Ax=x0-ver_x;Ay=y0-ver_y;
else ab[i]=0;