2017-03-31 3 views
1

Ich versuche Turtle Graphics zu verwenden, um ein Fraktal über Rekursion zu machen, aber aus irgendeinem Grund scheint mein Code die Turtle nicht zum Ursprung zurückzubringen. Mein Code ist wie folgtFehler in Turtle Rekursion

public static void sun(Turtle t, double radius) { 
for (int i = 0; i < 360; i++) { 
    t.forward(radius * .0174); 
    t.left(1); 
} 
    t.penup(); 
    t.left(90); 
    t.forward(radius); 
    //t.fill(); 
    t.pendown(); 
for (int i = 0; i < 8; i++) { 
    t.forward(2*radius); 
    t.backward(2*radius); 
    t.left(45); 
} 
t.penup(); 
t.backward(radius); 
t.right(90); 
t.pendown(); 
} 

public static void fractalSun(Turtle t, double r, int level) { 
int color; 
if (level == 0) { 
    t.color(255, 0, 0); 
    sun(t, r); 
} 
else { 
    sun(t, r); 
    t.left(90); 
    t.forward(r); 
    t.right(90); 
    t.forward(r * 2); 
    t.right(90); 
    fractalSun(t, r/4, level -1); 
    t.left(90); 
    t.backward(r * 2); 
} 
} 

Der Code erfolgreich kompiliert, aber produziert dieses Bild: Screenshot

Mein Ziel wäre für die Schildkröte in die Mitte jeder ‚Sonne‘ zurückzukehren, aber etwas isn‘ t arbeiten.

Antwort

0

Ihre 8-Speichen-Schleife lässt den Stift nach jeder Speiche in der Mitte der Figur stehen. Am Ende der Schleife, in der Mitte ausgehend, führen Sie diese Sequenz:

t.penup(); 
t.backward(radius); 
t.right(90); 
t.pendown(); 

Insbesondere Sichern eines Radius; Ich denke, das ist der Punkt, an dem du deinen beabsichtigten Punkt erreichst. Lass die Linie fallen, überprüfe deine gewünschte Richtung und ich denke, es wird dir gut gehen.

+0

@willizen, ich konnte das nicht wie beschrieben funktionieren lassen - oder? Diese Änderung behält das ursprüngliche Problem bei, in der Rückkehr zum Mittelpunkt zu versagen, und erfordert Modifikationen an dem anderen Unterprogramm. Ich glaube, dass das Problem mehr als nur eine Richtung ist, d. H. Es gibt eine fehlende "r/4" -Einheitseinheit bei der Berechnung der Rückkehrfahrt. – cdlane

0

Obwohl die Methode sun() die Schildkröte dorthin zurückbringt, wo sie gestartet wurde, lässt die Methode fractalSun() die Schildkröte in der Mitte der Abbildung zurück. Also, ob fractalSun() sich selbst oder sun() nennt, muss es Anpassungen vornehmen. Hier ist ein Update fix mit weniger Änderungen (meist Löschungen):

Ändern Sie diese letzte Codeblock in sun():

t.penup(); 
t.backward(radius); 
t.right(90); 
t.pendown(); 

zu sein, nur eine Erklärung:

// t.penup(); 
// t.backward(radius); 
t.right(90); 
// t.pendown(); 

Tropfen drei Zeilen Code von fractalSun() und ändern Sie die Argumente zum endgültigen Funktionsaufruf:

public static void fractalSun(Turtle t, double r, int level) { 

    if (level == 0) { 
     t.color(255, 0, 0); 

     sun(t, r); 
    } else { 
     sun(t, r); 

     // t.left(90); 
     // t.forward(r); 
     // t.right(90); 

     t.forward(r * 2); 
     t.right(90); 
     fractalSun(t, r/4, level - 1); 
     t.left(90); 
     t.backward(r * 2 + r/4); // added a term to the equation 
    } 
} 

OUTPUT

enter image description here

Anmerkung: Ich simulierte dies mit Python Schildkröte, so dass Sie meinen Java-Code optimieren müssen, wenn es nicht in Ordnung ist.

+0

Ah, ok! Vielen Dank! – willizen

+0

@willizen, Ich habe diese Antwort aktualisiert, um näher an Ihrem Original im Design mit meist Linien entfernt und eine Kalkulation modifiziert zu sein. – cdlane