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

Aufgabe war ein Programm zu schreiben, das einen Wald generiert. Lösung 1 screen-0003 In meinem ersten Lösungsansatz zeichnete ich Bäume mit einer Zufallsfarbe an einer zufälliger Position auf der gesamten Zeichenoberfläche. Mit der Taste '5' wird das Bild neu generiert, mit der Taste '1' kann das Bild als .tiff gespeichert werden. Die Bäume werden nach hinten kleiner, indem ich die Skalierung und y-Position von einer zufälligen Variabel abhängig machte.

void setup() {
  size (600, 600);
  smooth();
  background(200);
  noLoop(); // nur einmal wird gezeichnet
}

void draw() { 
  wald();
}

void keyPressed() {  
  if (key == '1') { 
    saveFrame(); // Bild wird als .tiff gespeichert
  } else if (key == '5') { 
    neuerWald(); // neuer Wald wird generiert
  }
}

void neuerWald() {
  background(200);
  redraw();
}

float number1;

void wald() {
  for (int i = 0; i < 200; i = i + 1) {
    number1 = random(0.1, 2); // definition einer zufälligen Variabel
    pushMatrix();
    translate(random(0, 600), number1 * random(180, 600)); //y-Koordinate ist abhängig von der zufälligen Variabel 'number1'
    scale(number1); //Skalierung erfolgt abhängig von der zufälligen Variabel 'number1' und korreliert somit mit der y-Koordinate (je kleiner y, desto kleiner die Skalierung)
    baum();
    popMatrix();
  }
}

void baum() {
  stroke(255); // def. zeichenfarbe
  strokeWeight(3); // linienbreite
  //strokeJoin(MITER); // default
  //strokeJoin(BEVEL);
  strokeJoin(ROUND);
  fill(color(random(0, 255), random(0, 255), random(0, 255)));

  beginShape();
  vertex(20, 20);
  vertex(0, 20);
  vertex(0, 0);
  vertex(-30, 0);
  vertex(0, -40);
  vertex(-20, -40);
  vertex(0, -60);
  vertex(-10, -60);
  vertex(10, -80);
  vertex(30, -60);
  vertex(20, -60);
  vertex(40, -40);
  vertex(20, -40);
  vertex(50, 0);
  vertex(20, 0);
  endShape(CLOSE);
}

Lösung 2 screen-0002 In einem zweiten Schritt wollte ich, dass die Bäume bei einem kleinen y in einer hinteren Ebene gezeichnet werden. Zudem sollten es hinten mehr Bäume sein als vorne. Schwierigkeiten hatte ich vor allem, eine Funktion zu finden, welche die Bedingung erfüllt bei einem kleinen i (der i.Baum) exponentiell mehr Bäume zu zeichnen. Mit einer Cosinus-Funktion konnte ich dies lösen. Ich musste allerdings i, welches als 'int' definiert war, zuerst in eine Float-Zahl umrechnen, ansonsten wurde der Wert '0' ausgegeben.

void setup() {
  size(600, 600);
  smooth();
  background(random(0,255), random(0,255), random(0,255));
  noLoop();
}

void draw() {
  fill(random(0,255), random(0,255), random(0,255));
  noStroke();
  rect(-1, -1, 601, 55);
  wald();
  
}

void keyPressed() {  
  if (key == '1') {
    saveFrame();
  } else if (key == '5') {
    neuerWald();
  }
}

void neuerWald() {
  background(200);
  redraw();
}

void wald() {  
  int numberOfBaum = 500; // Definition Anzahl Bäume
  for (int i = 0; i < numberOfBaum; i = i + 1) {
    pushMatrix();
    translate(random(0, 600), (cos((float(i)/(numberOfBaum/PI) - PI)) + 1)*210 + 100); // je kleiner y desto mehr Bäume werden gezeichnet, mit Cosinus Funktion ist diese Bedingung erfüllt. Damit Zahl nicht als Integer ausgespielt wird -> float(i), gibt i als float aus. +1 Damit die Cosinus Funktion nicht negativ wird.
    scale(2 * float(i) / numberOfBaum);
    baum();
    popMatrix();
  }
}

void baum() {
  stroke(255); // def. zeichenfarbe
  strokeWeight(3); // linienbreite
  //strokeJoin(MITER); // default
  //strokeJoin(BEVEL);
  strokeJoin(ROUND);
  fill (color(random(0, 255), random(0, 255), random(0, 255)));
  beginShape();
  vertex(20, 20);
  vertex(0, 20);
  vertex(0, 0);
  vertex(-30, 0);
  vertex(0, -40);
  vertex(-20, -40);
  vertex(0, -60);
  vertex(-10, -60);
  vertex(10, -80);
  vertex(30, -60);
  vertex(20, -60);
  vertex(40, -40);
  vertex(20, -40);
  vertex(50, 0);
  vertex(20, 0);
  endShape(CLOSE);
}