• BOIDS规则的个人见解


    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;

    作者:涵曦www.hanxi.cc
    出处:hanxi.cnblogs.com
    GitHub:github.com/hanxi
    Email:im.hanxi@gmail.com
    文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    《 Skynet 游戏服务器开发实战》

  • 相关阅读:
    python爬虫之urllib
    python 数据库操作类
    Vue学习之路第十篇:简单计算器的实现
    Vue学习之路第九篇:双向数据绑定 v-model指令
    Vue学习之路第八篇:事件修饰符
    Vue学习之路第七篇:跑马灯项目实现
    Vue学习之路第六篇:v-on
    Vue学习之路第五篇:v-bind
    Vue学习之路第四篇:v-html指令
    Vue学习之路第三篇:插值表达式和v-text的区别
  • 原文地址:https://www.cnblogs.com/hanxi/p/2400878.html
Copyright © 2020-2023  润新知