有谁知道我如何按照Robocode中的点围绕斐波那契模式做螺旋运动?我有setTurnRight(double),setAhead(double),getX()和getY()之类的方法。
我试图用这种方式制作一个简单的螺旋,没有必需的标准,但是没有用……更像是一个圆圈。
this.setAhead(this.direction * Double.POSITIVE_INFINITY);
if (this.direction == 1) {
this.setTurnRight(Utils.normalRelativeAngleDegrees(this.enemy.getBearing() + 60));
} else {
this.setTurnRight(Utils.normalRelativeAngleDegrees(this.enemy.getBearing() + 120));
}
游戏物理:
http://robowiki.net/wiki/Robocode/Game_Physics
最佳答案
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);
}
}
说明
要绕圈运动(平缓的螺旋运动),请保持恒定的速度(机器人移动的速度)和恒定的旋转速度(机器人旋转的速度)。从这种微不足道的螺旋运动到更有趣的事情,有几种方法。螺旋运动的最简单方法是保持恒定速度并改变转速。游戏开发交流中的This答案很好地介绍了如何获得转速的近似方程。
w = v / (2*pi*t)
或w = v / (2*pi*f(t))
其中:w =转速
v =速度
pi = 3.14 ...
t =时间或f(t)=半径随时间的函数
该方程式提供了一种沿着螺旋运动的方式,我们可以通过指定f(t)来选择所需的任何螺旋。要获得正确的半径函数,请查看this关于金色螺旋的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的原因)。
[注意:我想不出一种简单的方法来在机器人的路径上叠加金色螺旋,以检查其准确性。因此,虽然它显然是对数螺旋,但我不确定它在多大程度上接近所需的黄金螺旋]
关于java - 斐波那契螺旋-Robocode,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17331019/