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.

Gewitter

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. thunderbolt 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 && 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 && this.yCurrent < height) {
      this.drawLine();
    }

  } // void drawLine()

} // class RandomLine

void keyPressed() {
  if (key == 'r') {
    redraw();
  }
}