- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
有谁知道如何在 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));
}
最佳答案
这是一种使机器人遵循对数螺旋的工作运行方法,我相信它是黄金螺旋的近似值(可以用斐波那契数来近似的螺旋)。
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 的原因)。
[注意:我想不出一种简单的方法将黄金螺旋叠加在机器人的路径上以检查其准确性。因此,虽然它显然是一个对数螺旋,但我不确定它在多大程度上接近所需的黄金螺旋]
关于java - 斐波那契螺旋 - Robocode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17331019/
我是一名优秀的程序员,十分优秀!