//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX //XXXXXXXXX GROWING ROPES XXXXXXXXX //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX //----- GLOBALE VARIABLEN ----------- //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX PImage img; color black = color(0,0,0); color gray = color(128,128,128); int drahtmax=200; // Maximal Anzahl an der Intanzen der Klasse Draht int drahtnummer=0; // Bestehende Anzahl Linien Draht[] myDraht =new Draht[drahtmax]; int mousecontrol = 1; // Mouse aktiv = 1 int sx, sy; // Startpunkt des Drahtes int drahtLaengeMin = 40; int drahtLaengeMax = 80; int drahtWinkelMin = 30; int drahtWinkelMax = 89; int astMinGl = 4; // min Anzahl Knoten ab der Verästelung auftritt int astMaxGl = 8; // max Anzahl Knoten ab der Verästelung auftritt int limiter = 5; // Framerate begrenzer ( frameRate/limiter ) int limCount = 0; float chanceGl = 0.7; //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX //------- VOID SETUP ------- //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX void setup() { frameRate(30); img = loadImage("fassade_test.jpg"); // lade Bild // img = loadImage("judihui.jpg"); // lade Bild width = img.width; // Ÿbergebe Gršsse des Bildes an Gršsse des Aplets height = img.height; size(width,height); image(img, 0, 0); loadPixels(); } //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX //------- VOID DRAW ------- //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX void draw() { // println(drahtnummer); if (limCount < limiter ) //Ausführen von Framerate begrenzer ( frameRate/limiter ) für Klasse Draht { limCount ++; } else { for (int i = 0 ; i < drahtnummer; i++ ) { myDraht[i].drahtControl(); limCount =0; } } } //-------------------------------------------------------- //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX //XXXXXXXXX PROGRAM XXXXXXXXX //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX //-------------------------------------------------------- //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX //--------- VOID --------- //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX //-------------------------------------------------------- //------ MOUSE STEUERUNG ------- //-------------------------------------------------------- void mouseReleased() { if (mousecontrol == 1 && keyPressed) { if (keyCode == SHIFT) { sx=mouseX; sy=mouseY; DrahtCreation(); } } else if (mousecontrol == 1 ) { sx=mouseX; sy=height; DrahtCreation(); } } //-------------------------------------------------------- //------ RESTART ------- //-------------------------------------------------------- void keyPressed() { if (key == 'r') { updatePixels(); drahtnummer=0; redraw(); } } //-------------------------------------------------------- //------ DRAHT ERSTELLUNG ------- //-------------------------------------------------------- void DrahtCreation() { if (drahtnummer < drahtmax) { if (drahtnummer > 0) { if (myDraht[drahtnummer-1].ast == 1) { myDraht[drahtnummer] = new Draht(color(0,0,255), sx, sy, 1, random(drahtWinkelMin,drahtWinkelMax), drahtLaengeMin, drahtLaengeMax, astMinGl, astMaxGl, 2, chanceGl); // Instanzierung der Klasse Draht myDraht[drahtnummer-1].ast = 0; myDraht[drahtnummer].astCount = myDraht[drahtnummer-1].astCount; drahtnummer ++; } else{ myDraht[drahtnummer] = new Draht(color(0,255,0), sx, sy, 1, random(drahtWinkelMin,drahtWinkelMax), drahtLaengeMin, drahtLaengeMax, astMinGl, astMaxGl, 2, 0.5); // Instanzierung der Klasse Draht myDraht[drahtnummer].astCount = (int)random(myDraht[drahtnummer].astMin,myDraht[drahtnummer].astMax) ; drahtnummer ++; } } else{ myDraht[drahtnummer] = new Draht(color(0,255,0), sx, sy, 1, random(drahtWinkelMin,drahtWinkelMax), drahtLaengeMin, drahtLaengeMax, astMinGl, astMaxGl, 2, 0.5); // Instanzierung der Klasse Draht myDraht[drahtnummer].astCount = (int)random(myDraht[drahtnummer].astMin,myDraht[drahtnummer].astMax) ; drahtnummer ++; } } } //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX //------ KLASSEN ------- //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX //-------------------------------------------------------- //------ DRAHT ------- //-------------------------------------------------------- class Draht { //------ Variablen ------- color drahtFarbe; // Drahtsfarbe int dx, dy; // relativer Abstand int drahtStaerke; // Drahtstaerke float drahtWinkel; // Winkel in RAD float drahtLaenge; // Drahtlaenge int drahtLaMin, drahtLaMax; // DrahtLaengeMax/Min int drahtLaMinSave, drahtLaMaxSave; // speichert Generierungswert fŸr DrahtLaengeMax/Min float chance; int drahtLaengeFaktor = 5; int pointNumber = 0; // Punktnummern Drahtknoten int maxPoint = 30; int[][] koordinaten = new int [2][maxPoint]; // Array Koordinaten: [0][] = X-Wert / [1][] = Y-Wert int start = 5; // Zur Abfrage ob Draht Controler Ausgeführt wird und gleichzeitig die Anzahl versuche bei Treden von FEnster und Rand int astMin; int astMax; int astFaktor; int astCount; int ast = 0; // bei "1" wurde gerade verŠstelt //------ Instanzierung ------- Draht(color dFarbe, int xP1, int yP1, int dStaerke, float dWinkel, int dLaengeMin, int dLaengeMax, int astMi, int astMa, int astFa, float ch) { drahtFarbe = dFarbe; // WertŸbergabe von lokalen zu globalen Variablen koordinaten[0][pointNumber] = xP1; koordinaten[1][pointNumber] = yP1; drahtStaerke = dStaerke; drahtWinkel = dWinkel; drahtLaMin = dLaengeMin; drahtLaMax = dLaengeMax; drahtLaMinSave = dLaengeMin; drahtLaMaxSave = dLaengeMax; astMin = astMi; astMax = astMa; astFa = astFaktor; chance = ch; } //-------------------------------------------------------- //------ Draht Controler ------- void drahtControl() { if(start >= 1) { position(); // Kontrolle Position ankerKontrolle(); ast(); } } //-------------------------------------------------------- //------ Berechnung der nŠchsten Punktes ------- void position() { drahtWinkel = random(drahtWinkelMin,drahtWinkelMax); // Random Wert für Winkel drahtLaenge = random(drahtLaMin,drahtLaMax); // Random Wert für Länge dx = (int)(drahtLaenge * cos(drahtWinkel*PI/180)); // Berechnung des neuen X-Koordinate dy = (int)(sqrt(sq(drahtLaenge) - sq(dx))); // Berechnung des neuen Y-Koordinate float zufallsZahl = random(1); // Random Wert für links/rechts Ausschlag if (zufallsZahl > chance) // Links/Rechts Ausschlag anwenden { dx = -dx; } if (koordinaten[1][pointNumber] > 0) // Abfrage ob Punkt noch innerhalb des Bildes liegt { if (pointNumber < maxPoint-1) // Abfrage ob maximalzulässige Punktzahl erreicht ist { println("Punkt "+ pointNumber+" x: " +koordinaten[0][pointNumber] +" y: " + koordinaten[1][pointNumber]); pointNumber++; koordinaten[0][pointNumber] = koordinaten[0][pointNumber-1] + dx; // Zuweisen der neuen X-Coordinate koordinaten[1][pointNumber] = koordinaten[1][pointNumber-1] - dy; // Zuweisen der neuen Y-Coordinate } } } //-------------------------------------------------------- //------ Kontrolle des nŠchsten Punktes ------- void ankerKontrolle() { if(koordinaten[1][pointNumber] > 0) { int i; i = (koordinaten[1][pointNumber]-1)*width + koordinaten[0][pointNumber]; if(img.pixels[i] == black || koordinaten[0][pointNumber] <= 0 || koordinaten[0][pointNumber] >= width ) // Kontrolle ob Fenster im Weg (Fenster > kein Anker) { keinAnker(); } else if(img.pixels[i] == gray) // versucht Ÿber graues Fenster zu springen { huepfDrueber(); } else { start = 5; drawDraht(); drahtLaMax = drahtLaMaxSave; drahtLaMin = drahtLaMinSave; } } } //-------------------------------------------------------- //------ ???? ------- void keinAnker() { start -= 1; if(pointNumber > 0) // Springe einen Punkt zurueck und versuche nochmals { pointNumber -= 1; println("= width) ) // gibt 5 neue Versuche { start = 5; println("SPECIAL"); } } void huepfDrueber() { drahtLaMax += drahtLaengeFaktor; drahtLaMin += drahtLaengeFaktor; if(pointNumber > 0) { println("GRRR"); pointNumber -= 1; } else { pointNumber = 0; } } //---------------------- void ast() { if (koordinaten[1][pointNumber] > 0) { if (pointNumber == astCount) { sx= koordinaten[0][pointNumber] ; sy= koordinaten[1][pointNumber] ; ast = 1; DrahtCreation(); chance = (1-chanceGl); if (astMin > 0) { astMin -= astFaktor; astMax -= astFaktor; astCount += (int)random(astMin,astMax) ; } else { astCount += (int)random(astMin,astMax) ; } } } } //---------------------- void drawDraht() // zeichnet Draht { stroke(drahtFarbe); strokeWeight(drahtStaerke); line(koordinaten[0][pointNumber-1], koordinaten[1][pointNumber-1], koordinaten[0][pointNumber], koordinaten[1][pointNumber]); ellipseMode(CENTER); ellipse(koordinaten[0][pointNumber], koordinaten[1][pointNumber], 5, 5); } }