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;