20. September 2013
Aufgabe war ein Programm zu schreiben, das einen Wald generiert. Lösung 1 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
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);
}