java - 斐波那契螺旋 - Robocode

标签 java fibonacci spiral robocode

有谁知道如何在 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 = 速度
    • 圆周率 = 3.14...
    • t = 时间或f(t) = 半径随时间变化的函数

这个方程给出了一种沿着螺旋线移动的方法,我们可以通过指定f(t)来选择我们想要的任何螺旋线。要获得黄金螺旋的正确半径函数,请查看 this关于黄金螺旋的维基页面。它给出了这个方程:

  • r = a*e^(b*theta) 或者换句话说 f(t) = a*e^(b*t) 其中:
    • f(t) = 我们的半径函数
    • a = 用于缩放螺旋的任意常数
    • e = 欧拉常数
    • b = .0053468(如果使用弧度则为 .3063489)
    • t = 时间

结论

剩下的就是将此代码合并到您的机器人中,并为 av 选择您自己的值。 v 将决定机器人的速度,因此较大的 v 是个好主意(最大值为 10),并且由于 w 的最大值为 8,因此您应该相应地缩放 a,以便 w 尽可能长时间地保持在 0 到 8 之间(这就是我包含 println 的原因)。

[注意:我想不出一种简单的方法将黄金螺旋叠加在机器人的路径上以检查其准确性。因此,虽然它显然是一个对数螺旋,但我不确定它在多大程度上接近所需的黄金螺旋]

关于java - 斐波那契螺旋 - Robocode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17331019/

相关文章:

java - 半月付款频率的增量指定日期为每月 1 日和 16 日

java - Spring Security 按角色限制 URL 访问

algorithm - 为什么斐波那契数列在计算机科学中很重要?

algorithm - n 楼梯/台阶攀爬问题 : cannot conceptualize why T(n) = T(n-1) + T(n-2)

c - 查找斐波那契数列中第 n 项的最后一位数字的问题

model - 敏捷模型和螺旋模型的区别

java - 使用 httpPost 从 java 发送时,node.js req.body 为空

java - 迁移到 java 17 后有关 "memory mappings per process"和 JVM 崩溃的 GC 警告

python - 使用双曲正切在 Python 中创建螺旋结构

c - 用于在 c 中创建螺旋形状图案的嵌套循环