Willkommen auf unserem Seminar-Blog

Immer auf dem aktuellen Stand bleiben

Dieser Seminar-Blog befindet sich noch im Aufbau und wird in den kommenden Tagen entsprechend verfeinert.

Member Login

Lost your password?

Registration is closed

Sorry, you are not allowed to register by yourself on this site!

You must either be invited by one of our team member or request an invitation by email at viad.info {at} zhdk {dot} ch.

4. Rekursive Funktion – Trunk, Branches, Leaves

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.

Kreise kennzeichnen Anfang/Ende der einzelnen Beziérkurven.

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 ...

Verzweigungen werden in dieselbe Richtung aufgeteilt.

Kurven teilen sich in zwei "Büschel" auf.

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();
  }
}