Rekursion


Merowinger69

Grünschnabel
Bin gerade dabei den PythagorasBaum über ein Programm zu zeichnen. So sieht der Code bis jetzt aus:

Code:
static void zeichneQuadrat(double n){
	
		Turtle.setColor(counter);
      if(counter<8){ counter++;
 	  }else{counter=0;}
 	  
      for(int i=0;i<4;i++){
         Turtle.forward(n);
         Turtle.right(90);
      }
   }
   static void zeichnePythagorasBaum(double n){
      zeichneQuadrat(n);
      if(n>1){
         Turtle.forward(n);   
         Turtle.left(30);
         zeichnePythagorasBaum(n*0.5*Math.sqrt(3));
         Turtle.right(90);
         
          counter--;
    	  if(counter<0){ counter=8;}
 		  Turtle.setColor(counter);
 		  
         Turtle.forward(n*0.5*Math.sqrt(3));
         zeichnePythagorasBaum(n/2);
         Turtle.forward(-n*0.5*Math.sqrt(3));
         Turtle.left(60);
         Turtle.forward(-n);
      }
   }

Funktioniert auch fein doch ich will versuchen die verschiedenen Rekursionstiefen mit unterschiedlichen Farben dar zu stellen. 8 verschiedene Farben sind vorhanden.
Kann mir da jemand weiterhelfen

mfg Mero
 
Zuletzt bearbeitet:

Matze

Weltenwanderer
Ok.
Du könntest beispielsweise eine Variable anlegen, die dir als Zähler dient, den du bei jedem Rekursionsdurchlauf erhöhst.

Dann kannst du eine Methode schreiben die dir für eine bestimmte übergebene Zahl, eine bestimmte Farbe (oder random) zurückgibt.

Du kannst auch vorher eine HashMap anlegen, mit Schlüßel = eine Zahl und Wert = eine Farbe.

Am einfachsten ist es jedoch, wenn du einfach immer eine Zufallsfarbe verwendest.
 

Merowinger69

Grünschnabel
Gibtes eine solche Funktion die eine RandomFarbe ausgibt oder selbst machen?

Aber ist random schon so gut den da kann es ja sein das 2 aufeinanderfolgende Rekusionen die selbe Farbe haben und somit wär das eher kontraproduktiv.

Diese Variable müsste ich auch wieder kleiner werden lassen damit die Farben passen.
 

Matze

Weltenwanderer
Also ich arbeite noch mit Java 1.3 da gibt es keine RandomColor Funktion.
Ist aber auch einfach zu schreiben:
Du erzeugst 3 Zahlen von 0 - 255. Aus diesen 3 Zahlen (rot-grün-blau) erzeugst du eine neue Farbe new Color(rot, grün, blau).
Also bei mir waren die Farben scheinbar wircklich zufällig.

Fals du es mit der Zufallsmethode machst, brauchst du gar keinen Zähler.
Ob der wieder kleiner geht? Bestimmt. Aber wozu?
 

Merowinger69

Grünschnabel
Natürlich brauch ich einen Zähler. wenn ich nur hinaufzähl dan stimmen die Farben nicht überein. sieht so aus:



sollte aber so aussehen:

 

Matze

Weltenwanderer
Ok. Bei sowas kann ich dir leider kaum helfen, da ich nicht weiß wie dass berechnet wird.
Aber schau doch mal nach, ob es da ein Kriterium gibt, nach dem du den Zähler entweder ansteigen, oder abfallen lassen kannst.
 

Matze

Weltenwanderer
Hast du schonmal mit ner Suchmaschine nach änlichen Projekte geschaut und dort mal in den Code geschaut?
 

deepthroat

Erfahrenes Mitglied
Hi.

Am einfachsten wäre es, wenn du die Farbe bei jedem Aufruf der Funktion mit übergibst:
Java:
static void zeichnePythagorasBaum(double n, int color) {
  ...
  zeichnePythagorasBaum(n*0.5*Math.sqrt(3), (color + 1) % 8);
  ....
}
So wird für unterschiedliche Rekursionstiefen eine andere Farbe verwendet und die Farbe wird "automatisch" wieder zurückgesetzt wenn die Teil-Rekursion abgeschlossen ist (da die Variable color in der Funktion nie geändert wird).

Gruß
 

Merowinger69

Grünschnabel
Ja mach ich auch.

Code:
static void zeichneQuadrat(double n){
 	  
      for(int i=0;i<4;i++){
         Turtle.forward(n);
         Turtle.right(90);
      }
   }
   static void zeichnePythagorasBaum(double n,int color){
	   Turtle.setColor(color);
      zeichneQuadrat(n);
      if(n>1){
         Turtle.forward(n);   
         Turtle.left(30);
         zeichnePythagorasBaum(n*0.5*Math.sqrt(3),(color + 1) % 8);
 		  
         Turtle.right(90);
         Turtle.forward(n*0.5*Math.sqrt(3));
         zeichnePythagorasBaum(n/2,(color + 1) % 8);
         
         Turtle.forward(-n*0.5*Math.sqrt(3));
         Turtle.left(60);
         Turtle.forward(-n);
 
      }
   }

Hast du das so gemeint?
sieht folgend aus:


Also hat es da auch noch irgendwas.Da wird eine Seite Übermalt denk ich.
 

deepthroat

Erfahrenes Mitglied
Hi.
Hast du das so gemeint?
Ja, genau.
sieht folgend aus:


Also hat es da auch noch irgendwas.Da wird eine Seite Übermalt denk ich.
Ja, sieht ja schon ganz gut aus.

Allerdings hab ich etwas Unsinn erzählt, die Farbe setzt sich nicht von allein zurück.
Du mußt nach jedem Aufruf der zeichnePythagorasBaum Methode wieder
Java:
Turtle.setColor(color);
aufrufen.

Gruß

PS: Alternativ könntest du ja den Stift auch absetzen wenn du nichts zeichnen willst.

PPS: Ich hab's grad mal mit Absetzen vom Stift implementiert. Siehe Anhang.
 

Anhänge

  • Screenshot-Turtle Graphics.png
    Screenshot-Turtle Graphics.png
    12,9 KB · Aufrufe: 58
Zuletzt bearbeitet:

Merowinger69

Grünschnabel
Also ich habs eingefügt wie du gesagt hast aber stimmt noch immer nicht ganz aber fast.



Übermalt mir den letzten Strich des Quadrats mit einer andere Farbe.
Möchte es gerne ohne absetzen schaffen.
Was mach ich da noch falsch? seltsam das er das auch nur beim ersten Quadrat macht.
 

Merowinger69

Grünschnabel
Code:
static void zeichneQuadrat(double n){
 	  
      for(int i=0;i<4;i++){
         Turtle.forward(n);
         Turtle.right(90);
      }
   }
   static void zeichnePythagorasBaum(double n,int color){
	   Turtle.setColor(color);
      zeichneQuadrat(n);
      if(n>1){
         Turtle.forward(n);   
         Turtle.left(30);
         zeichnePythagorasBaum(n*0.5*Math.sqrt(3),(color + 1) % 8);
 		 Turtle.setColor(color); 
         Turtle.right(90);
         Turtle.forward(n*0.5*Math.sqrt(3));
         zeichnePythagorasBaum(n/2,(color + 1) % 8);
         Turtle.setColor(color); 
         Turtle.forward(-n*0.5*Math.sqrt(3));
         Turtle.left(60);
         Turtle.forward(-n);
      }
   }
 

deepthroat

Erfahrenes Mitglied
Eigentlich ist das ja schon richtig. Du zeichnest immer in der aktuellen Farbe der Rekursionstiefe. Da aber auch Schritte notwendig sind, die nur zum Bewegen des Stifts führen sollen, muss man doch etwas tricksen, damit man die eben gezeichnete Linie mit genau der gleichen Farbe überschreibt.

Probier's mal so:
Java:
static void zeichnePythagorasBaum(double n,int color){
	   Turtle.setColor(color);
      zeichneQuadrat(n);
      if(n>1){
         Turtle.forward(n);   
         Turtle.left(30);
         zeichnePythagorasBaum(n*0.5*Math.sqrt(3),(color + 1) % 8);

         Turtle.right(90);
         Turtle.forward(n*0.5*Math.sqrt(3));
         zeichnePythagorasBaum(n/2,(color + 1) % 8);

         Turtle.forward(-n*0.5*Math.sqrt(3));
         Turtle.left(60);
         Turtle.setColor(color); 
         Turtle.forward(-n);
      }
Gruß
 

Merowinger69

Grünschnabel
Ah danke jetzt funktioniert eigentlich alles richtig nur beim aller ersten Quadrat übermalt er noch die letzte(linke) Seite mit einer falschen Farbe.
Verstehe ich nicht ganz warum.
 

deepthroat

Erfahrenes Mitglied
Ah danke jetzt funktioniert eigentlich alles richtig nur beim aller ersten Quadrat übermalt er noch die letzte(linke) Seite mit einer falschen Farbe.
Verstehe ich nicht ganz warum.
Das verstehe ich auch nicht. Bei den anderen Quadraten stimmt es?

Im Grunde wird doch auch nur an der linken Seite ein Rückschritt gemacht - und vorher wird die Farbe explizit gesetzt...

Gruß
 

Neue Beiträge

Forum-Statistiken

Themen
272.361
Beiträge
1.558.639
Mitglieder
187.834
Neuestes Mitglied
jordanx0206