行为4

躲避行为

你应该意见猜到了,躲避行为是追捕的反行为,它与追捕的不同点在于,追捕是在seek”未来目标”,而躲避是在flee”未来目标”:

 

AS 版本


                   public function evade(target:Vehicle):void {
                            var lookAheadTime:Number = target.position.dist(_position) / _maxSpeed;
                            //计算此时追上目标的预计时间,即lookAheadTime.
                            var predictedTarget:Vector2D = target.position.add(target.velocity.multiply(lookAheadTime));
                            //在这段时间内,目标以现在的速度,预计会到达的位置,即"未来目标"
                            flee(predictedTarget);
                            //避开这个"未来目标"
                   }

target 是追逐着,追逐者到智能体的距离 / 最大速度(逃跑者使用的是最大速度),计算出追到所要花费的时间,

预测追逐者在经过lookAheadTime 之后所要所在的位置。

然后智能体只要逃离这个位置即可。




预测追逐者在经过lookAheadTime 之后所要所在的位置。

然后智能体只要逃离这个位置即可。

 

-----------------------------
c++ 版本


 

//----------------------------- Evade ------------------------------------
//
//  similar to pursuit except the agent Flees from the estimated future
//  position of the pursuer
//------------------------------------------------------------------------
Vector2D SteeringBehavior::Evade(const Vehicle* pursuer)
{
  /* Not necessary to include the check for facing direction this time */

  Vector2D ToPursuer = pursuer->Pos() - m_pVehicle->Pos();

  //uncomment the following two lines to have Evade only consider pursuers 
  //within a 'threat range'
<span style="color: rgb(102, 102, 102); font-family: Tahoma, Arial; line-height: 24px; text-align: justify; background-color: rgba(255, 255, 255, 0.8);">//取消以下两行逃避只考虑追求者的威胁范围内</span>
  const double ThreatRange = 100.0;
  if (ToPursuer.LengthSq() > ThreatRange * ThreatRange) return Vector2D();
 
 <p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 10.5pt; font-family: 'Times New Roman'; background-color: rgb(240, 240, 240); background-position: initial initial; background-repeat: initial initial;">//<span style="font-family:宋体;">预测的时间正比于追逐者与逃避者的距离;反比于智能体的速度和。</span></span></p>  double LookAheadTime = ToPursuer.Length() / 
                         (m_pVehicle->MaxSpeed() + pursuer->Speed());
  
  //now flee away from predicted future position of the pursuer
  return Flee(pursuer->Pos() + pursuer->Velocity() * LookAheadTime);
}

 

预测的时间正比于追逐者与逃避者的距离;反比于智能体的速度和,是因为要预测追逐者可能的位置,逃跑者的最大速度 加上 追逐者的速度,再用 两者的距离去 除它,加上

两者的速度,注意速度是double类型,这样就速度比他们自己都快,这样算出来的时间就更小,使预测的时间尽可能小

 

注意这里逃跑者使用的是最大速度,上一节,追逐者使用的是最大速度。因为一个用seek,一个用fell,都是最大速度接近或离开,参见seek和feel行为,追逐者和逃跑者永远是相对的,

一个用尽办法追,一个用尽办法逃。

最后

pursuer->Velocity() * LookAheadTime  用追逐者乘以这个时间,表示追逐者在这个时间未来预测的位置。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值