Java 斐波那契螺旋机器人码

Java 斐波那契螺旋机器人码,java,fibonacci,spiral,robocode,Java,Fibonacci,Spiral,Robocode,有人知道我怎么能在机器人代码中,沿着斐波那契模式绕着一个点做螺旋运动吗?我有像setTurnRight(double)、setAhead(double)、getX()和getY()这样的方法 我试着做一个简单的螺旋,没有要求的标准,那样的话,但它不起作用。。。它更像一个圆圈 this.setAhead(this.direction * Double.POSITIVE_INFINITY); if (this.direction == 1) { this.setTurnRight(Utils

有人知道我怎么能在机器人代码中,沿着斐波那契模式绕着一个点做螺旋运动吗?我有像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));
}
游戏物理:

机器人代码对数螺旋线 这里有一个使机器人沿着对数螺旋运行的工作运行方法,我相信它是黄金螺旋的近似值(这是可以用斐波那契数近似的螺旋)

解释 要在一个圆圈(普通螺旋)中移动,您需要保持恒定的速度(机器人移动的速度)和恒定的旋转速度(机器人转动的速度)。从这个琐碎的螺旋运动到更有趣的东西,有几种方法以螺旋形移动的最简单方法是保持恒定速度并改变旋转速度。游戏开发交换的答案很好地介绍了如何获得旋转速度的近似方程式

  • w=v/(2*pi*t)
    w=v/(2*pi*f(t))
    其中:
    • w=转速
    • v=速度
    • pi=3.14
    • t=时间或f(t)=半径随时间的函数
这个方程给出了一种沿着螺旋线移动的方法,我们可以通过指定af(t)来选择我们想要的任何螺旋线。要获得黄金螺旋的正确半径函数,请查看关于黄金螺旋的wiki页面。它给出了这个等式:

  • r=a*e^(b*theta)
    或者换句话说
    f(t)=a*e^(b*t)
    其中:
    • f(t)=我们的半径函数
    • a=缩放螺旋的任意常数
    • e=欧拉常数
    • b=.0053468(如果使用弧度,则为.3063489)
    • t=时间
结论 剩下的就是将此代码合并到您的bot中,并为av选择您自己的值。v将决定机器人的速度,所以一个更大的v是一个好主意(最大值是10),因为w的最大值是8,你应该相应地缩放a,使w尽可能长地保持在0和8之间(这就是为什么我包含println)

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

机器人代码对数螺旋 这里有一个使机器人沿着对数螺旋运行的工作运行方法,我相信它是黄金螺旋的近似值(这是可以用斐波那契数近似的螺旋)

解释 要在一个圆圈(普通螺旋)中移动,您需要保持恒定的速度(机器人移动的速度)和恒定的旋转速度(机器人转动的速度)。从这个琐碎的螺旋运动到更有趣的东西,有几种方法以螺旋形移动的最简单方法是保持恒定速度并改变旋转速度。游戏开发交换的答案很好地介绍了如何获得旋转速度的近似方程式

  • w=v/(2*pi*t)
    w=v/(2*pi*f(t))
    其中:
    • w=转速
    • v=速度
    • pi=3.14
    • t=时间或f(t)=半径随时间的函数
这个方程给出了一种沿着螺旋线移动的方法,我们可以通过指定af(t)来选择我们想要的任何螺旋线。要获得黄金螺旋的正确半径函数,请查看关于黄金螺旋的wiki页面。它给出了这个等式:

  • r=a*e^(b*theta)
    或者换句话说
    f(t)=a*e^(b*t)
    其中:
    • f(t)=我们的半径函数
    • a=缩放螺旋的任意常数
    • e=欧拉常数
    • b=.0053468(如果使用弧度,则为.3063489)
    • t=时间
结论 剩下的就是将此代码合并到您的bot中,并为av选择您自己的值。v将决定机器人的速度,所以一个更大的v是一个好主意(最大值是10),因为w的最大值是8,你应该相应地缩放a,使w尽可能长地保持在0和8之间(这就是为什么我包含println)


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

要绘制螺旋,必须逐渐增加半径。但是加多少呢?多久一次?阅读我链接的帖子。我认为
x=sin(t)
y=cos(t)
,和
z=t
会形成一个螺旋。要绘制螺旋,你必须逐渐增加半径。但是加多少呢?多久一次?阅读我链接的帖子。我认为
x=sin(t)
y=cos(t)
,和
z=t
会形成一个螺旋。
    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);
      }
    }