23. September 2013
Der Mechanismus hinter den rekursiven Funktionen sollte uns anhand eines Programmierbeispiels verständlich gemacht werden. Bei diesem Beispiel wird ein Baum generiert. Wir erhielten den Auftrag, dieses Beispiel zu erweitern oder ein neues Programm mit rekursiven Funktionen zu erstellen. Ich wollte etwas neues machen und hatte zuerst die Idee, ein sich zufällig ausbreitendes Feuerwerk darzustellen. Diese Idee habe ich aber wieder verworfen, weil ich mich lieber mit dem entstehen eines Gewitters mit Blitzen auseinander setzen wollte. Mittels einer Klasse Thunderbolt kann ich einen Blitz generieren. Die Stärke eines Blitzes wird dabei zufällig gewählt. Damit der Blitz realistisch erscheint, habe ich eine weitere Klasse erstellt, welche eine Zufalls-Linie anhand eines Startpunktes und einer bestimmten Länge erstellt. Je nach Stärke des Blitzes, endet dieser an einer unterschiedlichen Stelle. Trifft der Blitz auf den Erdboden, erscheint dort eine simple Explosions-Zeichnung.void setup() { size(1000,600); // def. fenstergroesse randomSeed(millis()); // seed random smooth(); // aktiviere antialiasing strokeWeight(1); // linienbreite noLoop(); } void draw() { background(#051229); stroke(255); for (int i = 0; i < random(1, 3); i++) { new Thunderbolt((int)random(200, width-200), 4); } } class Thunderbolt { Thunderbolt (int xStart, int energy) { stroke(255); RandomLine randomLine = new RandomLine(xStart, 0, 100, energy); this.draw(randomLine.xCurrent, randomLine.yCurrent, energy); } void draw(int x, int y, int lineWidth) { if (y < height &amp;&amp; lineWidth > 0) { int count = (int) random(1, 3); // anzahl äste int length; for (int i = 0; i < count; i++) { length = (int) random(100, 150); // line länge float m = map(lineWidth, 0, 4, 50, 255); stroke(255, m); RandomLine randomLine = new RandomLine(x, y, length, lineWidth--); if (randomLine.yCurrent < height) { this.draw(randomLine.xCurrent, randomLine.yCurrent, lineWidth); } else { this.explosion(randomLine.xCurrent); } } // endfor } // endif } void explosion(int xPosition) { fill(#FFF6C6); noStroke(); println(xPosition); pushMatrix(); translate(xPosition-30, height-35); beginShape(); vertex(20, 40); vertex(0, 20); vertex(20, 30); vertex(10, 10); vertex(25, 20); vertex(30, 0); vertex(35, 20); vertex(50, 10); vertex(40, 30); vertex(60, 20); vertex(40, 40); endShape(CLOSE); popMatrix(); } // void explosion() } // class Thunderbolt() class RandomLine { int xStart; int yStart; int xCurrent; int yCurrent; int length; int xBuffer; int yBuffer; RandomLine (int xStart, int yStart, int length, int size) { this.xStart = xStart; this.yStart = yStart; this.xCurrent = xStart; this.yCurrent = yStart; this.length = length; strokeWeight(size); this.drawLine(); } void drawLine() { this.xBuffer = this.xCurrent; this.yBuffer = this.yCurrent; this.xCurrent += (int)random(-20,20); this.yCurrent += (int)random(5,10); if (this.yCurrent > height) { this.yCurrent = height; } line(this.xBuffer,this.yBuffer,this.xCurrent,this.yCurrent); int distance = (int) dist(xStart, yStart, xCurrent, yCurrent); // println(distance); if (distance < length &amp;&amp; this.yCurrent < height) { this.drawLine(); } } // void drawLine() } // class RandomLine void keyPressed() { if (key == 'r') { redraw(); } }