/* * verschiebt die Eckpunkte des Polygons * auf der Geraden zwischen jeweils 2 benachbarten Punkten * und optimiert den aktuellen Punkt nach der Fitness * * * */ class Mutate { float t1,movingPtX,movingPtY,startPtX,startPtY,newX,newY; // Variablen floats int n = ourNewPolygon.polyPoints.size(); // Grösse der Arrayliste PolygonPunkte int a,b; FitnessCalculator makeMeFit = new FitnessCalculator(); float mutFitness, currMutFitness; boolean betterFitness = false; boolean direction; int j,c,moreLess,i; Mutate() { } void mutatePoints () { int chooseBeginPt = int(random(0,n-1)); //if (stopMutation) {break;}; mutFitness = makeMeFit.calculateFitness(); // Fitness der PolygonForm errechnen //println("Fitness = "+mutFitness); if (i < (n-1)) { j = i+1; } // wenn i kleiner als der grösste Polygonpunkt... j = der jeweils nächste Punkt if (i == n-1) { j=0; } // wenn i = der grösste Polygonpunkt... j= der erste Punkt der Liste Vec movingPt = (Vec)ourNewPolygon.polyPoints.get(j); // der Punkt der verschoben wird ist der jeweils nächste movingPtX = movingPt.getX(); // Koordinate X movingPtY = movingPt.getY(); // Koordinate Y Vec startPt = (Vec)ourNewPolygon.polyPoints.get(i); // Anfangspunkt startPtX = startPt.getX(); // Koordinate X startPtY = startPt.getY(); // Koordinate Y int updown = int(random(1,3)); // Zufällig 1 oder 2 nehmen if (updown == 1) { a = 50; b = 100; } if (updown == 2) { a = 100; b = 150; } int t = a; while (!betterFitness && (t <= b)) // Schleife lässt den movingPoint jeweils von der Mitte zwischen den Beiden punkten { // ...bis Korrdinaten Moving Pt plus halbe Länge der Strecke startPt-movingPt wandern t1 = (float)t/100; newX = startPtX + t1 * (movingPtX-startPtX); newY = startPtY + t1 * (movingPtY-startPtY); ourNewPolygon.movePoint(newX, newY, j); allRays.calculateRays(emitterCenter, ourNewPolygon); currMutFitness = makeMeFit.calculateFitness(); if (currMutFitness < mutFitness) { betterFitness = true; stroke(255,0,0); ellipse(newX, newY,5,5); //println("betterFitness = "+currMutFitness); currFitness = currMutFitness; //println(i+" i; j= "+j); } if ((t == b) && !(currMutFitness < mutFitness)) { ourNewPolygon.movePoint(movingPtX, movingPtY, j); allRays.calculateRays(emitterCenter, ourNewPolygon); currMutFitness = makeMeFit.calculateFitness(); } t++; } } }