6s从icloud云备份恢复:游戏中常见的几种追踪算法

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 17:54:38
http://www.cppblog.com/expter/archive/2009/10/09/98210.html 2009-10-09 23:57      所谓追踪,相对于另外一个角色来说是逃跑,首先需要做出追和逃跑的决策判断。

1.坐标追踪
       也是最基本追逐方式,他根据要追踪对象的坐标来修改追踪者的坐标,使两者的距离逐渐缩短。
        一个简单的例子:
              Point   m_pPrey;   /// 被追踪者
              Point   m_pAtta;   ///  追踪者
        对于追踪者来说:   新位置 =  旧位置 +  XY速度 ; 
              1if( m_pAtta.x < m_pPrey.x )
 2    m_pAtta.x ++;
 3else if( m_pAtta.x > m_pPrey.x )
 4    m_pAtta.x --;
 5
 6
 7if( m_pAtta.y < m_pPrey.y )
 8    m_pAtta.y ++;
 9else if( m_pAtta.y > m_pPrey.y )
10    m_pAtta.y --;

 
2.视线追踪
      视线追踪方式,主要是描述每一时刻都追踪者会沿着被追逐者之间的直线方向运动。如图所示:
                    
     通过图可以更好描述此问题,此问题的求解关键在于求出连接追踪者与猎物之间的直线,可以通过向量知道:2个向量想减即可得到。
     可以分别用追踪者与猎物的位置坐标构造出两个向量,假设b 代表追踪者位置向量,a 代表猎物位置向量。做向量减法a-b 便得到了向量c,将c 的起点置于追踪者的位置上,就得到了一条指向猎物的向量c. 此时,令:

     追踪者X 方向速度 / 追踪者Y 方向速度    =     c 向量x 轴分量/   c 向量y 轴分量 .即可求解。

3.拦截追踪
      所谓拦截追踪,如果考虑的是被追逐的目标太远,如果2者速度一样,或者相差不大,有可能很难追上,玩过实况足球的都知道,如果采用上面的2中追逐方式,可能错过最佳的防守位置。下面是拦截追踪的一个示例图:

   
    对于追踪者来说,他只需要知道被追踪者的位置,方向与速度,讲会计算一个最佳的拦截位置。然后你会发现这只是一个简单的追踪问题。且需要的时间t最少。


整个3种追踪的源码代码 以及 demo都共享:
/Files/expter/chase.rar

下一篇通过实例demo来记录学习的聚类算法:  (#)