return new Point2D.Double(newX, newY);
}
改进结果
如果您已经试过清单 1 中的代码,那么您会发现对付 spinbot(沿圆周移动 的样本机器人)的情况明显好多了,但您很可能还会注意到,机器人发出的炮弹 中仍有不少没有命中目标。这不单单是因为瞄的不准;还要归因于您对子弹要花 费多长时间才能到达目标的估算不准。要提高您的技术,可以通过使用一个非常 简单的迭代来估算一下时间,然后把这个估算值送入瞄准系统得到当子弹到达目 标时您与目标之间的距离的更精确的估算值。反复执行几次这一步,您将得到近 乎完美的估值。
清单 2. 迭代代码
/**This function predicts the time of the intersection between the
bullet and the target based on a simple iteration. It then moves
the gun to the correct angle to fire on the target.**/
void doGun() {
long time;
long nextTime;
Point2D.Double p;
p = new Point2D.Double(target.x, target.y);
for (int i = 0; i < 10; i++){
nextTime =
(intMath.round((getRange(getX(),getY(),p.x,p.y)/(20- (3*firePower))));
time = getTime() + nextTime;
p = target.guessPosition(time);
}
/**Turn the gun to the correct angle**/
double gunOffset = getGunHeadingRadians() -
(Math.PI/2 - Math.atan2(p.y - getY(), p.x - getX()));
setTurnGunLeftRadians(normaliseBearing(gunOffset));
}
double normaliseBearing(double ang) {
if (ang > Math.PI)
ang -= 2*PI;
if (ang < -Math.PI)
ang += 2*Math.PI;
return ang;
}
public double getrange(double x1,double y1, double x2,double y2) {
double x = x2-x1;
double y = y2-y1;
double h = Math.sqrt( x*x + y*y );
return h;
}
改进圆周瞄准的性能
作为瞄准系统,圆周瞄准基本成形了;也就是说,既在我们能力所及范围内 又能在此基础上更进一步的事并不多。但是,能改善性能的小改动有两处:
平均速度:您也许愿意保持一个补偿加速效应的移动平平均速度,而不是根 据目标的最后速度进行计算。
每一回合方向的平均变化:测量在每一回合内目标方向变化绝对量的平均值 有助于我们对付那些不如 spinbot 有规律的目标。 |