2017-04-05 20 views
2

ヒルベルト曲線を6番目の順序で描く必要がありますが、私のプログラムは最初の命令に対してのみ機能します。私は何か回転(またはすべて)に間違っていると思うが、正確に何ですか?あなたの助けを借りて非常に感謝しています。再帰によってヒルベルト曲線を描く

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の計算から除外したものです。 nのパリティを分岐する代わりに、角度値90または-90を渡すことによって、HilbertCurve()の半分を1つに変換します。 (ちょうどバラエティになります)

あなたのカメのライブラリーは私が見つけたものとは異なるので、コードを適宜調整する必要があります。このような質問をするときは、あなたのカメの図書館がどこにあるのかを述べるべきです。

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); 
    } 
} 

USAGE

> java TurtleFractal 4 

OUTPUT

enter image description here

関連する問題