23. September 2013
Mit den Wissen zu Schleifen und dem Verschieben, Rotieren und Skalieren von Koordinatensystemen, habe ich einen Wald programmiert. Er besteht aus mehreren übereinanderliegenden Ebenen. Das Übereinanderliegen der gezeichneten Ebenen wird im Codetext dadurch erzielt, dass man die Objekte nacheinander auflistet. 1. Himmel mit Farbverlauf 2. Unterholz 3. erste Baumgruppe (in der Mitte des Bildes) 4. zweite Baumgruppe (über die x-Achse verteilt) 5. Reh und Fritz der Jäger Was mich hier gefragt wurde ist, ob ich das Reh und den Fritz als Bild hineingeladen habe. Dem ist nicht so. Sie sind beide mit abgeschrägten Rechtecken und Ellipsen gezeichnet. Dies mag aufwändig erscheinen, doch durch Copy+Paste geht das ziemlich rasch und ich habe damit eine coole Comic-Ästhetik hingekriegt. Bei jedem Klick wiederholt sich der Draw-Vorgang. Das heisst die oberen Punkte 2 - 5 werden nochmals gezeichnet. Die Blätterfarben, Baumstammpositionen, -längen und -farben, Postion von Fritz und dem Reh werden in bestimmten Schrankten zufällig verändert. Hier gibt es noch eine kleine Finesse: Fritz erscheint nur, wenn sein x-Koordinate um einen gewissen Wert kleiner ist, als die vom Reh. So ist er immer hinter dem Reh, um es überhaupt jagen zu können. Download_Wald// K O N S T A N T E N int breite = 1200; // KONST: Fenstergrösse definieren int hoehe = 900; int Y_AXIS = 1; // KONST: Konstanten für den Himmel-Farbverlauf color c1, c2; float x_achste = random(0,breite); float stamm_min = 10; // KONST: Dicke vom Baumstamm float stamm_max = 30; // S E T U P void setup() { size (breite, hoehe); smooth(); c1 = color(50,80,150); // KONST: Farben für den Himmel definieren: c2 = color(220,220,250); noLoop(); } // D R A W void draw() { // Himmel: setGradient(0, 0, breite, hoehe, c1, c2, Y_AXIS); // Unterholz: for (int i=0; i<=200; i++) { noStroke(); fill(50,200,50,100); ellipse(i*30,hoehe,random(100,200),random(100,200)); } //BAUMGRUPPE 001: // Baumstamm: for(int i=0; i <= 20; i++) { float R_anteil = random(30,100); // RGB - Anteile an der Farbe des Baumstamms float G_anteil = random(20,60); float B_anteil = random(5,50); color stamm_farbe = color(R_anteil,G_anteil,B_anteil); // Farbe vom Baumstamm stroke(stamm_farbe); float stammdicke = random(stamm_min,stamm_max); strokeWeight(stammdicke); float baum_spitze = random(2*(hoehe/6),3*(hoehe/6)); // wo liegt die Baumspitze --> y-Achse float x_achse = random((breite/4),(breite/4)*3); // wo auf der x-Achse liegt der Baumstamm line(x_achse,hoehe,x_achse,baum_spitze); // Baumkrone: noStroke(); float gruen_anteil = random(100,200); // Farbe der Baumkrone float transp_krone = random(100,200); float kronen_breite = random(7*stammdicke,9*stammdicke); // Grösse der Baumkrone float kronen_hoehe = random(7*stammdicke,20*stammdicke); fill(50,gruen_anteil,50,transp_krone); ellipse(x_achse,baum_spitze,kronen_breite, kronen_hoehe); // leicht transparenter Teil der Baumkrone ellipse(x_achse+(kronen_breite/3),(baum_spitze + (kronen_hoehe/4)),kronen_breite,kronen_breite); ellipse(x_achse-(kronen_breite/3),(baum_spitze + (kronen_hoehe/4)),kronen_breite,kronen_breite); ellipse(x_achse+(kronen_breite/3),baum_spitze,0.75*kronen_breite,0.75*kronen_breite); ellipse(x_achse-(kronen_breite/3),baum_spitze,0.75*kronen_breite,0.75*kronen_breite); fill (0,gruen_anteil,0); // untransparenter Teil der Baumkrone float skalierungs_zahl = 0.75; ellipse(x_achse, baum_spitze ,skalierungs_zahl * kronen_breite,skalierungs_zahl * kronen_hoehe); ellipse(x_achse+(kronen_breite/3),(baum_spitze + (kronen_hoehe/4)),skalierungs_zahl * kronen_breite, skalierungs_zahl * kronen_breite); ellipse(x_achse-(kronen_breite/3),(baum_spitze + (kronen_hoehe/4)),skalierungs_zahl * kronen_breite,skalierungs_zahl * kronen_breite); ellipse(x_achse+(kronen_breite/3),baum_spitze, skalierungs_zahl * 0.75*kronen_breite, skalierungs_zahl * 0.75*kronen_breite); ellipse(x_achse-(kronen_breite/3),baum_spitze, skalierungs_zahl * 0.75*kronen_breite, skalierungs_zahl * 0.75*kronen_breite); } //BAUMGRUPPE 002: // Baumstamm: for(int i=0; i <= 20; i++) { float R_anteil = random(30,50); float G_anteil = random(10,25); float B_anteil = random(5,30); color stamm_farbe = color(R_anteil,G_anteil,B_anteil); // KONST: Farbe vom Baumstamm stroke(stamm_farbe); float stammdicke = random(stamm_min,stamm_max); strokeWeight(stammdicke); float baum_spitze = random(4*(hoehe/6),5*(hoehe/6)); // wo liegt die Baumspitze --> y-Achse float x_achse = random(0,breite); // KONST: wo auf der x-Achse liegt der Baumstamm line(x_achse,hoehe,x_achse,baum_spitze); // Baumkrone: noStroke(); float transp_krone = random(100,200); float gruen_anteil = random(50,150); fill(0,gruen_anteil,0,transp_krone); float kronen_breite = random(7*stammdicke,9*stammdicke); // Grösse der Baumkrone float kronen_hoehe = random(7*stammdicke,20*stammdicke); ellipse(x_achse,baum_spitze,kronen_breite, kronen_hoehe); // leicht transparenter Teil der Baumkrone ellipse(x_achse+(kronen_breite/3),(baum_spitze + (kronen_hoehe/4)),kronen_breite,kronen_breite); ellipse(x_achse-(kronen_breite/3),(baum_spitze + (kronen_hoehe/4)),kronen_breite,kronen_breite); ellipse(x_achse+(kronen_breite/3),baum_spitze,0.75*kronen_breite,0.75*kronen_breite); ellipse(x_achse-(kronen_breite/3),baum_spitze,0.75*kronen_breite,0.75*kronen_breite); fill (0,gruen_anteil,0); // untransparenter Teil der Baumkrone float skalierungs_zahl = 0.75; ellipse(x_achse, baum_spitze ,skalierungs_zahl * kronen_breite,skalierungs_zahl * kronen_hoehe); ellipse(x_achse+(kronen_breite/3),(baum_spitze + (kronen_hoehe/4)),skalierungs_zahl * kronen_breite, skalierungs_zahl * kronen_breite); ellipse(x_achse-(kronen_breite/3),(baum_spitze + (kronen_hoehe/4)),skalierungs_zahl * kronen_breite,skalierungs_zahl * kronen_breite); ellipse(x_achse+(kronen_breite/3),baum_spitze, skalierungs_zahl * 0.75*kronen_breite, skalierungs_zahl * 0.75*kronen_breite); ellipse(x_achse-(kronen_breite/3),baum_spitze, skalierungs_zahl * 0.75*kronen_breite, skalierungs_zahl * 0.75*kronen_breite); } // FRITZ und REH float x_Reh = random(50,breite-50); float x_Fritz = random(50,breite-50); if(x_Fritz < (x_Reh-50)) { //Fritz der Jäger color hautfarbe = color(255,203,139); color tarnfarbe1 = color(75,121,26); color tarnfarbe2 = color(66,103,26); color tarnhut1 = color(39,75,2); color tarnhut2 = color(32,57,6); color tarnhut3 = color(100,129,70); color nase = color(#AD7D42); noStroke(); fill(5,5,5); rect(x_Fritz,hoehe-20,10,20); // Stiefel 1 rect(x_Fritz,hoehe-5,13,5,1,3,1,1); rect(x_Fritz+20,hoehe-20,10,20); // Stiefel 2 rect(x_Fritz+20,hoehe-5,13,5,1,3,1,1); fill(tarnhut1); rect(x_Fritz,hoehe-40,13,20); // Hosenbein 1 rect(x_Fritz+20,hoehe-40,13,20); // Hosenbein 2 rect(x_Fritz,hoehe-40,33,5); fill(tarnfarbe2); rect(x_Fritz,hoehe-80,33,40,5,1,1,1); // Oberkörper fill(30,30,30); // Gurt rect(x_Fritz,hoehe-45,33,5); fill(245,227,30); // Gürtelschnalle rect(x_Fritz+20,hoehe-45,5,5); fill(30,30,30); rect(x_Fritz+21,hoehe-44,2.5,2.5); fill(tarnfarbe1); // Arm 1 rect(x_Fritz-3,hoehe-80,10,20,5,1,1,3); rect(x_Fritz,hoehe-70,16,10); fill(hautfarbe); // Hand 1 rect(x_Fritz+16,hoehe-70,4,8,1,1,3,1); rect(x_Fritz+16,hoehe-70,7,2,1,1,3,1); fill(tarnfarbe1); // Arm 2 rect(x_Fritz+33,hoehe-72,8,8,1,1,10,1); fill(hautfarbe); // Hand 2 rect(x_Fritz+41,hoehe-72,6,4,1,1,20,1); fill(90,60,20); // Gewehr, hölzerner Teil // rect(x_Fritz-8,hoehe-74,8,8,2,1,1,8); // hinterer Teil des Gewehrs rect(x_Fritz+10,hoehe-76,7,6); rect(x_Fritz+16,hoehe-78,4,8,6,1,1,1); rect(x_Fritz+19,hoehe-78,35,6); fill(180,180,180); // Lauf des Gewehrs rect(x_Fritz+19,hoehe-78,45,2); fill(20); // Visier des Gewehrs rect(x_Fritz+30,hoehe-82,9,2); rect(x_Fritz+32,hoehe-80,5,2,2,2,2,2); rect(x_Fritz+60,hoehe-81,2,2); fill(hautfarbe); rect(x_Fritz+10,hoehe-105,15,20,1,3,10,1); // Kopf rect(x_Fritz+10,hoehe-105,7,25); // Hals rect(x_Fritz+6,hoehe-100,5,5,6,1,1,6); // Ohr fill(255); ellipse(x_Fritz+15,hoehe-97,4,4); // Auge 1 fill(0); ellipse(x_Fritz+15,hoehe-97,2,2); fill(255); // Auge 2 ellipse(x_Fritz+25,hoehe-97,4,4); fill(0); ellipse(x_Fritz+25,hoehe-97,2,2); fill(0); // Mund rect(x_Fritz+15,hoehe-90,8,1.5); fill(nase); // Nase rect(x_Fritz+20,hoehe-102,1,7); rect(x_Fritz+20,hoehe-95,3,1); rect(x_Fritz+23,hoehe-95,1,3); fill(0); rect(x_Fritz+21,hoehe-102,5,1.5); rect(x_Fritz+12,hoehe-102,5,1.5); fill(tarnhut1); rect(x_Fritz+10,hoehe-115,15,10,1,3,1,1); // Hut fill(tarnhut2); rect(x_Fritz+10,hoehe-107,20,3,1,1,3,1); fill(tarnhut3); rect(x_Fritz+8,hoehe-115,8,10,10,3,6,6); rect(x_Fritz+15,hoehe-118,2,2,3,4,1,1); } //Reh: noStroke(); fill(90,21,21); rect(x_Reh,hoehe-50,10,50,1,1,3,1); // Bein 1 fill(90,15,15); rect(x_Reh+15,hoehe-50,10,50,1,1,3,1); // Bein 2 fill(90,21,21); rect(x_Reh+40,hoehe-50,10,30,1,1,5,1); // Bein 3 rect(x_Reh+35,hoehe-30,10,10,3,1,1,1); fill(0); // Hufe rect(x_Reh+34,hoehe-29,3,8,3,1,1,1); fill(90,15,15); rect(x_Reh+55,hoehe-50,10,50); // Bein 4 fill(90,21,21); rect(x_Reh,hoehe-100,65,50,9,1,1,1); // Körper fill(255,255,255,160); // weisser Bauch rect(x_Reh+10,hoehe-55,30,5,8,1,1,1); rect(x_Reh+50,hoehe-55,5,5,8,8,1,1); fill(90,21,21); triangle(x_Reh+2,hoehe-75,x_Reh+2,hoehe-60,x_Reh-10,hoehe-60); //Schwänzchen fill(255,255,255,180); triangle(x_Reh,hoehe-65,x_Reh,hoehe-60,x_Reh-10,hoehe-60); fill(90,21,21); rect(x_Reh+50,hoehe-120,15,20); // Hals rect(x_Reh+50,hoehe-130,20,20,1,20,1,1); // Kopf rect(x_Reh+69,hoehe-120,10,10,1,20,20,1); fill(0); rect(x_Reh+75,hoehe-120,5,5,20,20,20,20); // Schnauze fill(90,21,21); //Ohren rect(x_Reh+50,hoehe-140,5,10,1,6,1,1); rect(x_Reh+60,hoehe-140,5,10,1,6,1,1); fill(255); rect(x_Reh+50,hoehe-138,2,8,1,6,1,1); rect(x_Reh+60,hoehe-138,2,8,1,6,1,1); fill(255); // Auge ellipse(x_Reh+58,hoehe-125,5,5); fill(0); ellipse(x_Reh+58,hoehe-125,2,2); } // F U N K T I O N E N // Wenn die Maus gedrückt wird, wiederholt sich das DRAW: void mousePressed() { redraw(); } // Funktion für den Himmel-Farbverlauf: void setGradient(int x, int y, float w, float h, color c1, color c2, int axis ) { noFill(); if (axis == Y_AXIS) { // Top to bottom gradient for (int i = y; i <= y+h; i++) { float inter = map(i, y, y+h, 0, 1); color c = lerpColor(c1, c2, inter); stroke(c); line(x, i, x+w, i); } } }