class Knospe //************************** Knospenklasse************************ { int xNeu, yNeu; // Globale Klassenvariablen Definition int winkel; // Wachstumswinkel int abstand; // AstlŠnge int knospenNummer=0; int z = 0; // Versuchsanzahl int act; // AktivitŠt int[][] koordinaten = new int [2][50]; // Instanzierung neues 2D-Array fŸr die Punkte (Knospen) [0]= x-Wert , [1] = y-Wert Knospe(int xp, int yp, int a) // Konstruktor (Definiert durch Koordinaten und AktivtŠt) { koordinaten[0][knospenNummer] = xp; // †bergabe der Variablen (lokal zu global) koordinaten[1][knospenNummer] = yp; act = a; // AktivitŠt (ob aktiv 1 oder inaktiv 0) } void astKontrolle() // Methode zum Aufruf mehrerer anderer Methoden { // (wird in void draw() aufgerufen) naechsteKnospe(); knospenKontrolle(); } void naechsteKnospe() // Methode um nŠchsten Punkt (Knospe) zu bestimmen (neue Koordinaten) { winkel = (int)random(60,90); // Zufallswinkel (Wachstumswinkel des "Astes") abstand = (int)random(10,20); // Zufallsdistanz (LŠnge des "Astes") xNeu = (int) (abstand * cos(winkel * PI/180)); // mit cos wird die x-Wert-Differenz ausgerechnet (pi/180 um radian in winkelumzuwandeln) yNeu = (int) (sqrt (sq(abstand) - sq(xNeu))); // Phytagoras (sqrt = Wurzel)(sq = im Quadrat) if(random(1) > 0.5) // Zufallswert um links/rechts Ausschlag zu bestimmen { xNeu = -xNeu; } if(koordinaten[1][knospenNummer] > 0) // Kontrolle ob y-Wert noch im Fenster ist { knospenNummer++; // Erhšhung der "knospenNummer" um 1 koordinaten[0][knospenNummer] = koordinaten[0][knospenNummer-1] + xNeu; // Berechnung des neuen x-Wertes koordinaten[1][knospenNummer] = koordinaten[1][knospenNummer-1] - yNeu; // Berechnung des neuen y-Wertes } } void knospenKontrolle() // Methode um zu PrŸfen ob Knospe im Fenster und auf "gutem Grund" (weiss) liegt { if(koordinaten[1][knospenNummer] > 0) // falls y-Wert im Bild, dann... { int i; i = (koordinaten[1][knospenNummer]-1) * width + koordinaten[0][knospenNummer]; // Pixeldefinition, muss so sein da Bild in PixelListe eindimensional gespeichert ist if(zollverein.pixels[i] <= color (10) || koordinaten[0][knospenNummer] <= 0 || koordinaten[0][knospenNummer] >= width) // Kontrolle ob Pixel schwarz oder ausserhalb des Bildbereichs ist { if (z < 11) // falls Versuchsanzahl z kleiner als 11, dann... { knospenNummer -= 1; // zŠhle von der "knospenNummer" 1 ab z += 1; // erhšhe Versuchsanzahl z um 1 if (z == 10) // falls Versuchanzahl gleich 10, dann... { act = 0; //AktivitŠt = 0 -> Knospe ("Ast") versucht nicht mehr weiterzuwachsen } } } else // sonst.... { zeichneAst(); // wenn also alles in Ordnung ist, dann rufe Methode "zeichneAst" auf... rose(); //...und Methode "rose".... zweig(); //...und "zweig" z = 0; // setze die Versuchsanzahl zŸrŸck auf 0 } } } int checkActivity() // Methode "checkActivity" um die AktivitŠt zu ŸberprŸfen (hier Datentyp int weil eine RŸckgabe erfolgen soll { return (act); // gibt den AktivitŠtswert zurŸck (wird in "void draw" ŸberprŸft) } void zeichneAst() // Methode zeichnet einen Ast (Strich) zwischen zwei Knospenpunkten und eine Kreis am Ende des Astes { stroke(0,255,0); strokeWeight(0.5); line(koordinaten[0][knospenNummer-1],koordinaten[1][knospenNummer-1],koordinaten[0][knospenNummer],koordinaten[1][knospenNummer]); ellipseMode(CENTER); ellipse(koordinaten[0][knospenNummer],koordinaten[1][knospenNummer], 3, 3); } void rose() // Methode zeichnet "zufŠllige" Rosen (Ort (Knospe), Gršsse und Rotton per Zufall generiert) { if(random(1) > 0.7) // "Zufallsgenerator" (zeichne eine Rose oder nicht) { noStroke(); int f = (int) random(200); // Zufallsrotton fill(255,f,f); int r = (int) random(5,8); // Zufallsgršsse ellipse(koordinaten[0][knospenNummer],koordinaten[1][knospenNummer], r, r); // Rose wird gezeichnet } } void zweig() //Methode um einen Zweig zu erzwingen (Verzweigung) { if(koordinaten[1][knospenNummer]> 0) // falls y-Wert innerhalb des Fensters (Display) { if(knospenNummer >= 0) // und falls die "knospennummer gršsser oder gleich 0 ist { if(random(1) > 0.75) // und falls der Zufallswert gršsser als .... ist, dann.... { sx = koordinaten[0][knospenNummer]; // setze eine neue Startkoordinate an den momentanen x-wert sy = koordinaten[1][knospenNummer]; // setze eine neue Startkoordinate an den momentanen y-wert activity = 1; // setze die AktivitŠt auf 1 (aktiv) knospeAnMausPos(); // und rufe Methode "knospeAnMausPos" auf -> ein neuer Zweig entsteht! } } } } }