21. Oktober 2011
Um mir den Code verständlicher zu machen, habe ich bei dieser Aufgabe zuerst alles durchkommentiert. Dann habe ich einzelne Parameter abgeändert und die Resultate studiert. Als nächstes habe ich ein JPG von einem Ahornblatt genommen und in Illustrator vektorisiert. Dieses habe ich dann als SVG gespeichert und über PShape in das Dokument importiert. Ich habe damit die runden Blätter ersetzt. Über PShape kann man keine PNG-Dateien importieren. Habe zuerst versucht, das JPG in Illustrator zu kopieren und dann als SVG zu speichern, was nicht funktioniert hat. Ich musste das JPG in Pfade umwandeln. Die Matrix-Funktionen sind mir jetzt verständlicher.//PShape loadMaple; void setup() // Grundeinstellung des Dokuments { size(600,600); // Fenstergroesse randomSeed(millis()); // seed random ?? smooth(); // aktiviere antialiasing strokeWeight(7); // linienbreite stroke(0,0,0,150); // Der Alpha(Transparenz)-Wert aller Linien (Äste) wird definiert. 0,0,0 = Schwarz noLoop(); // Der Code läuft nicht einfach durch, sondern wird über mousePressed ausgeführt //loadMaple = loadShape("maple.svg"); } void draw() { background(255); // Hintergrundfarbe pushMatrix(); // Speichern momentaner Stand des Grids und Definition von neuen Werten translate(width *.5,height - 20); // Das Grid wird in die Mitte gesetzt und um 20 nach unten ?? wurzel(6); // die Funktion Wurzel wird aufgerufen und der Parameter 7 wird weitergegeben popMatrix(); // Der Zustand des Grids wird zurückgesetzt } void mousePressed() // auf Mausklick wird etwas ausgelöst { redraw(); // draw wird erneut ausgeführt und damit auch die Funktion "Wurzel" } void keyPressed() { switch(key) { case 's': saveFrame("screenshot-##.png"); println("Saved screenshot-##.png"); break; } } // funktion void wurzel(int tiefe) // Funktionsdefinition mit der Variable "tiefe". Tiefe wird von der "draw" Funktion weitergegeben. Tiefe = wie oft läuft die Funktion durch. { if(tiefe <=0) // teste ob das ende erreicht worden ist { // zeichne Blueten pushStyle(); // Momentaner Style-Stand wird gespeichert. Neue Styles werden definiert. Mittels popStyle werden die Styles wieder zurückgesetzt. int clr = (int)random(100,255); // Definition der Variable 'clr'. Wert der Variable ist ein zufälliger Wert zwischen 100 und 255 (Rottöne) stroke(clr,0,0,190); // Die Variable 'clr' wird weitergegeben. Ein Transparenzwert von 190 wird gesetzt. fill(clr,0,0,190); // Füllung der Blätter wird definiert //shape(loadMaple, -30, -15, 50, 50); ellipse(0,0,50,50); // Blätter. 0,0 = Startpunkte, 50,50 = Endpunkte popStyle(); // Zurücksetzen der mit pushStyle gesetzten Stylestände return; //?? } // zeichne zweige int x; // Definition Variabel ohne Wert ?? int y; // Definition Variabel ohne Wert ?? int count = (int)random(1,8); // Definition Variabel "count" mit zufälligem Wert zwischen 1 und 8. for(int i = 0; i < count;i++) // Beginn "For"-Schlaufe. { x = (int)random(-100,100); // zufällig gewählter Wert für die x-Position der Linie (des Asts) y = -(int)random(10,150); // zufällig gewählter Wert für die y-Position line(0,0,x,y); // Eine Linie wird vom Nullpunkt ausgezeichnet zu einem zufällig gewählten Endpunkt (siehe oben) pushMatrix(); // scho wieder dä translate(x,y); // Die Matrix verschiebt sich um den zufällig generierten Wert scale(random(.3,0.95)); // Zufällig generierter Wert zwischen .3 und .95 , mit dem die ??? verkleinert werden wurzel(tiefe-1); // Rekursives Aufrufen der Funktion i.e. die Funktion ruft sich selber auf. popMatrix(); // Der Zustand des Grids wird zurückgesetzt } }