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.

Wald

20. September 2013

Unsere Aufgabe war es einen zufälligen Wald zu zeichnen. Zuerst habe ich eine Funktion erstellt, mit welcher ein Baum gezeichnet wird. Damit der Wald etwas abwechslungsreich erscheint, habe ich zwei Baumvarianten definiert. Einen Apfelbaum und eine Tanne. Dazu wird die grüne Farbe der Blätter per Zufall generiert. Die Bäume werden mit den Funktionen pushMatrix() und popMatrix() ebenfalls zufällig verteilt. Dies hat den Vorteil, dass man einen Baum mit allen Elementen als ganzes verschieben kann. Das Resultat sah nicht sehr realistisch aus, da die Baumstämme teilweise über den Baumkronen abgebildet wurden. Um dieses Problem zu verhindern habe ich die Y-Position in Abhängigkeit von der Variable i gestellt. Was dazu führt, dass der Wald von hinten nach vorne gezeichnet wird. Um das ganze Programm zu erweitern, versuchte ich auf dem Horizont Windräder zu zeichnen und diese zu animieren. Dazu musste ich die noLoop() Funktion entfernen und den Wald im setup() generieren lassen. Der Horizont wird über draw() laufend neu gezeichnet. Das rotieren der Windräder geschieht auch mit pushMatrix() und popMatrix().
int horizont = 150; // horizonthoehe
int windFR = 1; // windstaerke
float moveCounter = 1; // wird fuer die rotation benutzt

void setup() {
  background(255);
  size(600, 400);
  smooth();

  draw_forest();
}

void draw() {
  draw_windrad();
}

void draw_forest() {

  noStroke();

  // wiese
  fill(color(69, 188, 30));
  rect(0, horizont, width, 350);

  // wald
  for (int i = 0; i < 200; i++) {
    pushMatrix();
      translate(random(-20, width), i+horizont);
      scale(random(1, 0.7));
      tree((int) (random(0, 1)+0.5));
    popMatrix();
  }
}

/**
* baum: 2 versionen
*/
void tree(int type) {
  // stamm
  noStroke();
  smooth();

  switch (type) {
    case 0:
      // apfelbaum
      fill(color(75, 44, 44));
      rect(22, 40, 5, 20);

      fill(color(30, random(90, 150), 25));
      ellipse(15, 29, 30, 30);
      ellipse(25, 15, 30, 30);
      ellipse(35, 31, 30, 30);
    break;

    case 1:
      // tanne
      fill(color(75, 44, 44));
      rect(18, 30, 5, 20);

      fill(color(30, random(90, 150), 25));
      int y = 0;
      for (int i = 0; i < 3; i++) {
        pushMatrix();
          translate(0, y);
          triangle(0, 20, 20, 0, 40, 20);
        popMatrix();
        y += 10;
      }

    break;

  }
}

void draw_windrad() {

  // hintergrund
  fill(color(29, 138, 224));
  rect(0, 0, width, horizont);

  // windraeder
  for (int i = 0; i < 3; i++) {
    pushMatrix();
      translate((i+1)*150, horizont-120);
      windrad();
    popMatrix();
  }
}

void windrad() {
  int radlength = 120;

  noStroke();
  fill(221);

  // pfosten
  beginShape();
    vertex(0, 122);
    vertex(8, 20);
    vertex(12, 20);
    vertex(20, 122);
    vertex(0, 122);
  endShape();

  fill(240);

  pushMatrix();
    translate(10, 20);
    rotate(radians(moveCounter));

    pushMatrix();
       rect(-3, -(radlength/2), 6, radlength);
    popMatrix();

    pushMatrix();
       rotate(radians(90));

       rect(-3, -(radlength/2), 6, radlength);
    popMatrix();

    moveCounter += windFR/10;
  popMatrix();

}

void keyPressed() {
  switch (key) {
    case 'q':
      windFR += 5;
    break;
    case 'a':
      windFR -= 5;
    break;
    case 's':
      save("screenShot.jpg");
    break;

  }
  println(windFR);
  // QframeRate(windFR);
}
screenShot