有没有人知道如何在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));
}
答案 0 :(得分:1)
这是一个工作运行方法,使机器人遵循对数螺旋,我相信它是金色螺旋的近似近似(螺旋可以用斐波那契数字近似)。
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))
其中:
这个等式提供了一种沿着螺旋线移动的方法,我们可以通过指定 f(t)来选择我们想要的任何螺旋。要获得黄金螺旋的正确半径函数,请查看有关黄金螺旋的this维基页面。它给出了这个等式:
r = a*e^(b*theta)
或换句话说f(t) = a*e^(b*t)
其中:
剩下的就是将此代码合并到您的机器人中,并为 a 和 v 选择您自己的值。 v 将确定机器人的速度,因此更大的 v 是一个好主意(最大值为10),因为 w 的最大值是8,你应该相应地缩放 a ,以便 w 尽可能长时间地保持在0到8之间(这就是为什么我已经包含了println)。
[注意:我想不出一个简单的方法可以在机器人的路径上叠加金色螺旋来检查它的准确性。因此,虽然它显然是一个对数螺旋,但我不确定它在多大程度上接近所需的金色螺旋]