private ShootInfo evaluateShoot(double power, double angle, double angleVert) {
   TrajectoryMasia trajectory =
       new TrajectoryMasia(
           currentSituation.ballPosition(), Constants.getVelocidadRemate(power), angle, angleVert);
   double fitness = 0, f;
   for (int i = 0; i < trajectory.length; i++) {
     if (i == 0) {
       f =
           calculateFitness(
               trajectory.positions[i],
               trajectory.z[i],
               i + 1,
               currentSituation.ballPosition(),
               0);
     } else {
       f =
           calculateFitness(
               trajectory.positions[i],
               trajectory.z[i],
               i + 1,
               trajectory.positions[i - 1],
               trajectory.z[i - 1]);
     }
     fitness += f;
     if (f > 1 || f == -1) {
       break;
     }
   }
   return new ShootInfo(angle, angleVert, fitness);
 }
 private boolean isShootSituation(double power) {
   double factor =
       Math.abs(Math.sin(currentSituation.ballPosition().angle(Constants.centroArcoSup)));
   factor = 1 - (1 - factor) * (1 - factor);
   return currentSituation.ballPosition().distance(Constants.centroArcoSup)
       <= THRESHOLD
           * factor
           * Constants.getVelocidadRemate(power)
           / Constants.REMATE_VELOCIDAD_MAX;
 }