簡體   English   中英

斐波那契螺旋-Robocode

[英]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);
      }
    }

說明

要繞圈運動(平緩的螺旋運動),請保持恆定的速度 (機器人移動的速度 )和恆定的旋轉速度 (機器人旋轉的速度 )。 從這種微不足道的螺旋運動到更有趣的事情,有幾種方法。 螺旋運動的最簡單方法是保持恆定速度並改變轉速。 從游戲開發交流答案通過提供有關如何獲得轉速近似方程好走。

  • w = v / (2*pi*t)w = v / (2*pi*f(t))其中:
    • w =轉速
    • v =速度
    • pi = 3.14 ...
    • t =時間或f(t) =半徑隨時間的函數

該方程式提供了一種沿着螺旋運動的方式,我們可以通過指定f(t)來選擇所需的任何螺旋。 要獲取黃金螺旋正確的半徑功能,看看這個 wiki頁面對黃金螺旋。 它給出了以下等式:

  • 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的原因。

[注意:我想不出一種簡單的方法來在機器人的路徑上疊加金色螺旋,以檢查其准確性。 因此,盡管它顯然是對數螺旋,但我不確定它在多大程度上接近所需的黃金螺旋]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM