//--------------------Deklarationen-------------- import processing.pdf.*; ArrayList numberOfBranch = new ArrayList(); PImage bild; //--------------------Fenster------------- int fensterX = 1000; int fensterY = 715; int ausgabeX = 680; int ausgabeY = 665; int abstand = (fensterY - ausgabeY)/2; int ausgabeXpos = fensterX - (ausgabeX + abstand); //-------------------Variablen zur Steuerung---------- float astDicke = 2; // Dicke beim ersten Stamm int anzahlBaeume = 1; // Anzahl BŠume int endPunktVariante = 0; // Astende: 1 = zwei kleine Zweige 2 = Kreise int branchType = 1; // Typ 1 = Standard, 2 = einfache Verzweigung, 3 = 2fach Rekursive Verzweigung int anzahlPunkte = 25; // Verzweigungsgrad float d = 30; // StammlŠnge float verkuerzung = 0.94; float schwindFaktor = 0.9; float angle = PI/8; //--------------------AbhŠngige Variablen--------- float punktRadius = astDicke+astDicke; // Radius der Kreise (Class Branch) int distance = ausgabeX / (anzahlBaeume+1); // Distanz der BŠume int j =0; float longestList = 1; int vorlage = 0; int pdf =0; void setup() { smooth(); size(fensterX,fensterY); // beginRecord(PDF, "output.pdf"); // pdf file background(0); drawLayoutFix(); // Menu wird gezeichnet aus dem Tab _LAYOUT } void draw() { drawLayoutChangeable(); // Menubuttons werden gezeichnet aus dem Tab _LAYOUT strokeWeight(1); noFill(); stroke(50); rect(ausgabeXpos, abstand,ausgabeX,ausgabeY); stroke(255); //---------------------GENERIEREN DER B€UME--------------------------------- if (longestList > j) { for (int c = 0; c < anzahlBaeume; c++) { Branch newBranch = new Branch(anzahlPunkte,branchType); // Baum wird definiert Point punkt0 = new Point(ausgabeXpos + (c+1)*distance,height-abstand-astDicke); // Position der ersten 2 Punkte abhŠngig von AnzahlbŠume Point punkt1 = new Point(ausgabeXpos + (c+1)*distance+random(-d/10,d/10), height-abstand-random(9*d/10,d)); // Sind gleichmŠssig an unterer Seite des Ausgabefeldes verteilt Edge edge1 = new Edge(punkt0,punkt1,astDicke,newBranch); // Erste Kannte (Baumstamm) wird definiert newBranch.makeOtherEdges(edge1); // Methode, die das Erstellen der BŠume steuert wird aufgerufen numberOfBranch.add(newBranch); // Kompletter Baum wird in Baumliste geschrieben } println(j); //----------------------AUSGABE B€UME------------------------- for (int b = 0; b < anzahlBaeume; b++) // Von allen BŠumen wird jeweils eine Kannte gezeichnet { Branch currentBranch = (Branch)numberOfBranch.get(b); // BŠume werden aus der numberOfBrunch (Liste aller BŠume) gelesen int c = currentBranch.printList.size(); if (c > j ){ // Eine Kannte wird aus dem Baum gelesen und gezeichnet Edge testEdge = (Edge)currentBranch.printList.get(j); testEdge.drawMe(255,255,255); if (endPunktVariante > 0) // Blattyp wird gezeichnet falls endPunktVariante 1 oder 2 { if (endPunktVariante == 1) { if (currentBranch.endingList.size() > j+1) { testEdge = (Edge)currentBranch.endingList.get(j); testEdge.drawMe(255,255,255); // Kleine Zweige werden gezeichnet } } if (endPunktVariante == 2) { if (j < currentBranch.endingList.size()-1) { testEdge = (Edge)currentBranch.endingList.get(j); testEdge.drawMe(punktRadius,punktRadius,255,255,255, j); // Methode die Ellipsen zeichnet wird aufgerufen } } } } //saveFrame(); Branch firstBranch = (Branch)numberOfBranch.get(0); // ist zum Stoppen der prozedur wenn alles gezeichnet ist longestList= firstBranch.printList.size(); // herausfinden, welcher baum die meisten Kannten hat for ( int d = 0; d < anzahlBaeume; d++) { firstBranch = (Branch)numberOfBranch.get(d); if (firstBranch.printList.size() > longestList) { longestList = firstBranch.printList.size(); } } } println(longestList); if (j < longestList) { j++; } else { //noLoop(); } } if (pdf == 1) { beginRecord(PDF, "output.html"); // pdf file if (vorlage ==1) { deleteWindow(); displayImage(); } else { deleteWindow(); } reOutput (); pdf =0; endRecord(); } } void mousePressed() { if (mouseButton == LEFT) { if (mouseX > 85 && mouseX < 130) // NEU { if (mouseY > 175 && mouseY < 220) { newAutput(); } } if (mouseX > 85 && mouseX < 125) // TYP { if (mouseY > 285 && mouseY < 325) { if (branchType < 5) { branchType = branchType + 1; } else { branchType = 1; anzahlPunkte = 25; } if (branchType == 4 || branchType == 5) { anzahlPunkte = 7; } newAutput(); } } if (mouseX > 55 && mouseX < 115) // ANZAHL { if (mouseY > 350 && mouseY < 400) { if (anzahlBaeume < 12) { anzahlBaeume = anzahlBaeume +1; } else { anzahlBaeume = 1; } distance = ausgabeX / (anzahlBaeume+1); newAutput(); } } if (mouseX > 55 && mouseX < 120) // VORLAGE { if (mouseY > 425 && mouseY < 480) { if (vorlage == 0) { vorlage = 1; deleteWindow(); displayImage(); reOutput (); } else { vorlage = 0; deleteWindow(); reOutput (); } } } if (mouseX > 140 && mouseX < 205) // GR…SSE { if (mouseY > 220 && mouseY < 270) { if (d < 130) { d = d+20; astDicke = astDicke + 3/2; punktRadius = astDicke+astDicke; } else { d = 30; astDicke = 2; punktRadius = astDicke+astDicke; } newAutput(); } } if (mouseX > 138 && mouseX < 205) // BL€TTER { if (mouseY > 310 && mouseY < 355) { if (endPunktVariante < 2) { endPunktVariante = endPunktVariante +1; } else { endPunktVariante = 0; } punktRadius = astDicke+astDicke; newAutput(); } } if (mouseX > 138 && mouseX < 205) // WINKEL { if (mouseY > 385 && mouseY < 430) { if (angle > PI/18) { angle = angle - PI/18; } else { angle = PI/4; } newAutput(); } } if (mouseX > 144 && mouseX < 245) // VERK†RZUNG { if (mouseY > 455 && mouseY < 515) { if (verkuerzung > 0.87) { verkuerzung = verkuerzung - 0.03; } else { verkuerzung = 1; } newAutput(); } } if (mouseX > 45 && mouseX < 110) // SICHERN { if (mouseY > 520 && mouseY < 590) { if (pdf == 0) { pdf =1; } } } if (mouseX > 130 && mouseX < 182) // QUIT { if (mouseY > 575 && mouseY < 620) { exit(); } } } } //-------------Funktion, welche erneut neue BŠume generiert void newAutput() { j =0; fill(0); noStroke(); rect(ausgabeXpos -5, abstand -5,ausgabeX +10,ausgabeY +10); if (vorlage == 1) { float hoehe = bild.height; float breite = bild.width; float scaleX = ausgabeX/breite; //filter(INVERT); image(bild, ausgabeXpos, fensterY-abstand-hoehe*scaleX, breite*scaleX, hoehe*scaleX); //filter(INVERT); } noFill(); stroke(50); strokeWeight(1); longestList = 1; punktRadius = astDicke+astDicke; rect(ausgabeXpos, abstand,ausgabeX,ausgabeY); numberOfBranch.clear(); } //-------Funktion, welche Bild platziert void displayImage() { bild = loadImage("vorlage.html"); float hoehe = bild.height; float breite = bild.width; println(hoehe); println(breite); float scaleX = ausgabeX/breite; println(scaleX); //filter(INVERT); image(bild, ausgabeXpos, fensterY-abstand-hoehe*scaleX, breite*scaleX, hoehe*scaleX); //filter(INVERT); noFill(); stroke(50); strokeWeight(1); rect(ausgabeXpos, abstand,ausgabeX,ausgabeY); } //-------Lšscht Ausgabefeld void deleteWindow() { fill(0); noStroke(); rect(ausgabeXpos -5, abstand -5,ausgabeX +10,ausgabeY +10); noFill(); stroke(50); strokeWeight(1); rect(ausgabeXpos, abstand,ausgabeX,ausgabeY); } //----Gibt BŠume erneut wieder void reOutput () { for (int b = 0; b < anzahlBaeume; b++) // Von allen BŠumen wird jeweils eine Kannte gezeichnet { Branch currentBranch = (Branch)numberOfBranch.get(b); // BŠume werden aus der numberOfBrunch (Liste aller BŠume) gelesen int c = currentBranch.printList.size(); for (int k=0; k < c; k++) { Edge testEdge = (Edge)currentBranch.printList.get(k); testEdge.drawMe(255,255,255); if (endPunktVariante > 0) // Blattyp wird gezeichnet falls endPunktVariante 1 oder 2 { if (endPunktVariante == 1) { if (currentBranch.endingList.size() > k+1) { testEdge = (Edge)currentBranch.endingList.get(k); testEdge.drawMe(255,255,255); // Kleine Zweige werden gezeichnet } } if (endPunktVariante == 2) { if (k < currentBranch.endingList.size()-1) { testEdge = (Edge)currentBranch.endingList.get(k); testEdge.drawMe(punktRadius,punktRadius,255,255,255, k); // Methode die Ellipsen zeichnet wird aufgerufen } } } } } }