Robocode 对数螺旋
这是一种使机器人遵循对数螺旋的工作运行方法,我相信它是黄金螺旋(可以用斐波那契数近似的螺旋)的近似值。
public void run() {
double v = 5;
double c = Math.PI*2;
double a = .1;
double b = .0053468;
setMaxVelocity(v);
setAhead(100*999);
setTurnRight(360*999);
while(true)
{
double t = getTime();
double f = a*Math.pow(Math.E,b*t);
double w = v/(c*f);
setMaxTurnRate(w);
execute();
System.out.println(t+"\t"+w);
}
}
解释
要绕圈移动(普通螺旋),您需要保持恒定速度(机器人移动的速度)和恒定的旋转速度(机器人转动的速度)。有几种方法可以从这种微不足道的螺旋运动变成更有趣的东西。螺旋运动的最简单方法是保持恒定速度并改变旋转速度。 来自游戏开发交流的这个答案很好地介绍了如何获得旋转速度的近似方程。
w = v / (2*pi*t)
或w = v / (2*pi*f(t))
在哪里:
- w = 转速
- v = 速度
- 圆周率= 3.14...
- t = 时间或f(t) = 半径随时间变化的函数
这个方程提供了一种沿着螺旋移动的方法,我们可以通过指定f(t)来选择我们想要的任何螺旋。要获得黄金螺旋的正确半径函数,请查看这个关于黄金螺旋的 wiki 页面。它给出了这个等式:
r = a*e^(b*theta)
或者换句话说f(t) = a*e^(b*t)
,其中:
- f(t) = 我们的半径函数
- a = 用于缩放螺旋的任意常数
- e = 欧拉常数
- b = .0053468(如果使用弧度,则为 .3063489)
- t = 时间
结论
剩下的就是将此代码合并到您的机器人中,并为a和v选择您自己的值。v将决定机器人的速度,因此较大的v是个好主意(最大值为 10),并且由于w的最大值为8,因此您应该相应地缩放a,以使w尽可能长时间地保持在 0 和 8 之间(这就是我包含 println 的原因)。
[注意:我想不出一种简单的方法来将金色螺旋叠加在机器人的路径上以检查其准确性。因此,虽然它显然是一个对数螺旋,但我不确定它在多大程度上接近所需的黄金螺旋]