2017-04-05 100 views
2

我需要繪製六階希爾伯特曲線,但我的程序僅適用於一階。我認爲輪換(或所有事情)有問題,但究竟是什麼?將非常感謝您的幫助。通過遞歸繪製希爾伯特曲線

public class TurtleFractal { 

public static void HilbertCurve(int n, Turtle fred, double step) { 
    if (n > 0) { 
     if (n % 2 == 1) { 
      fred.left(90); 
      HilbertCurve(n - 1, fred, step); 
      fred.forward(step); 
      fred.right(90); 
      HilbertCurve(n - 1, fred, step); 
      fred.forward(step); 
      HilbertCurve(n - 1, fred, step); 
      fred.right(90); 
      fred.forward(step); 
      HilbertCurve(n - 1, fred, step); 
      fred.left(90); 
     } else { 
      fred.right(90); 
      HilbertCurve(n - 1, fred, step); 
      fred.forward(step); 
      fred.left(90); 
      HilbertCurve(n - 1, fred, step); 
      fred.forward(step); 
      HilbertCurve(n - 1, fred, step); 
      fred.left(90); 
      fred.forward(step); 
      HilbertCurve(n - 1, fred, step); 
      fred.right(90); 
     } 
    } 
} 

public static void main(String[] args) { 
    Turtle fred = new Turtle(0, 0, 0); 
    //fred can go forward or turn to any angle 
    // 0,0-initial coordinates, 0-angle 
    fred.down(); 
    int n = 2; 
    //n - curve size 

    double s = Math.pow(2, n - 2); 
    double step = 0.5/(s * 3 + (s - 1)); 

    //draw the curve 
    HilbertCurve(n, fred, step); 

} 

回答

0

HilbertCurve()你的分數維碼分叉看起來不錯,所以我猜這個問題與您在main()方法step計算做。

這裏有一個不同的方法,我已經使用worldCoordinates()來改變座標系統相匹配的問題(否則你需要知道窗口的大小 - 這一點你離開你的step計算),我也將合併將HilbertCurve()的一半分爲90或90的角度值,而不是分支n的奇偶校驗。 (只適用於多種)

您的龜圖書館與我找到的不同,因此您需要相應地調整代碼。當你問這樣的問題時,你應該說明你的龜甲圖書館在哪裏。

public class TurtleFractal { 

    public static void HilbertCurve(int n, Turtle turtle, double angle) { 
     if (n <= 0) return; 

     turtle.left(angle); 
     HilbertCurve(n - 1, turtle, -angle); 
     turtle.forward(1.0); 
     turtle.right(angle); 
     HilbertCurve(n - 1, turtle, angle); 
     turtle.forward(1.0); 
     HilbertCurve(n - 1, turtle, angle); 
     turtle.right(angle); 
     turtle.forward(1.0); 
     HilbertCurve(n - 1, turtle, -angle); 
     turtle.left(angle); 
    } 

    public static void main(String[] args) { 
     int n = Integer.parseInt(args[0]); 
     double s = Math.pow(2, n); 
     Turtle fred = new Turtle(); 

     fred.worldCoordinates(0, 0, s, s); 
     fred.up(); 
     fred.goTo(0.5, 0.5); 
     fred.down(); 
     HilbertCurve(n, fred, 90.0); 
    } 
} 

用法

> java TurtleFractal 4 

輸出

enter image description here