2017-04-05 1 views
2

Ich muss Hilbert-Kurve um sechste Ordnung zeichnen, aber mein Programm funktioniert nur für die erste Ordnung. Ich denke, etwas stimmt nicht mit der Rotation (oder allem), aber was genau? Wird sehr geschätzt für Ihre Hilfe.Zeichnen Sie eine Hilbert-Kurve durch Rekursion

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

} 

Antwort

0

Ihre fraktale Code Bifurkation in HilbertCurve() sieht gut aus, so vermute ich, das Problem hat mit der Berechnung von step im main() Verfahren zu tun.

Hier ist ein anderer Ansatz, wo ich worldCoordinates() verwendet, um das Koordinatensystem zu ändern, um das Problem anzupassen (sonst müssen Sie die Größe des Fensters kennen - etwas, das Sie aus Ihrer step Berechnung ausgelassen haben.) Hälften von HilbertCurve() zu einem durch einen Winkel von 90 oder -90 statt Verzweigung aus der Parität von n. (Nur für Abwechslung.)

Ihre Schildkröten-Bibliothek unterscheidet sich von der, die ich gefunden habe, so dass Sie den Code entsprechend anpassen müssen. Sie sollten angeben, wo Sie Ihre Schildkrötenbibliothek haben, wenn Sie eine Frage wie diese stellen.

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

Verwandte Themen