/*
* 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++;
}
}
}