10. November 2010
Die Einführung der rekursiven Funktionen erlauben es uns baumartige Strukturen darzustellen oder fraktalartige Strukturen zu konstruieren. Hierbei ruft sich eine Funktion beliebig oft selbst mit angepassten Parametern selbst auf. basierend auf einer einfachen Vorlage habe ich mir hier vorgenommen die Verästelung organischer zu programmieren. Von einer Verzweigung aus richten sich die weiterlaufenden Äste am Anfangspunkt auf denselben Kontrollpunkt aus, wodurch diese aus einem einzelnen Punkt herauszuwachsen scheinen. Um Strukturen selbst wachsen zu lassen, kann die Random-Funktion benutzt werden, welche eine Zufallszahl aus einem angegebenen Range zurückgibt. Der beste Weg, um sich selbst zu überraschen.(int)random(-150,150)UNTEN: Einzelner Strang mit aneinander gehängten Beziér-Kurven. Um Ecken zu verhindern sind die Kontrollpunkte zwischen den Kurven angeglichen, sodass sich "organische" Linien ergeben. Um die Beziérkurven einanderanzugleichen übergebe ich den zweiten Kontrollpunkt den "Child-Elementen" (depth++), bei welchen dieser invertiert als erster Kontrollpunkt verwendet wird. Somit liegt der zweite Kontrollpunkt der "Parentkurve" und der erste Kontrollpunkt der "Childkurven" auf einer Geraden. Lots of ... Beispiel für Aufbau Beziérkurve: http://processing.org/learning/curves/code/try_curve/index.html
int depth = 6; int branches = 10; void setup() { size(800,800); // def. fenstergroesse randomSeed(millis()); // seed random smooth(); // aktiviere antialiasing strokeWeight(1); // linienbreite stroke(0,0,0); stroke(0); noLoop(); // draw() only called once } void draw() { background(255); pushMatrix(); translate(mouseX,mouseY); wurzel(depth, (int)random(-150,150), (int)random(-150,150)); popMatrix(); } void mousePressed() { redraw(); } // funktion void wurzel(int tiefe, int controlX, int controlY) { if(tiefe <=0) // teste ob das ende erreicht worden ist { // end of line pushStyle(); int clr = (int)random(100,255); stroke(clr,0,0,190); strokeWeight(2); fill(clr,0,0,190); beginShape(); // draw hook vertex(0, 0); // starting point bezierVertex(controlX/2, controlY/2, 10, 10, 10, 10); bezierVertex(10, 10, controlX, controlY, 0, 0); endShape(); popStyle(); return; } int x; int y; int count = (int)random(1,branches); int childControlX = 0; int childControlY = 0; for(int i = 0; i < count;i++) { x = (int)random(-150,150); y = -(int)random(50,150); noFill(); beginShape(); vertex(0, 0); // starting point bezierVertex(controlX, controlY, controlX, controlY, x, y); endShape(); // matching point beziers pushStyle(); stroke(201); ellipse(x,y,10,10); popStyle(); //store controllpoints for children childControlX = x-controlX; childControlY = y-controlY; // call children pushMatrix(); translate(x,y); scale(random(.5,.95)); wurzel(tiefe-1,childControlX,childControlY); popMatrix(); } }