BOIDS規則的個人見解

來源:互聯網
上載者:User

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;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.