public static void nextW_DeltaSearch() {
   if (!userRequestedW.isEmpty()) {
     w = userRequestedW.pollFirst();
     return;
   }
   if (!wasFract[0]) {
     w = leftW;
     wasFract[0] = true;
     return;
   } else if (!wasFract[wasFract.length - 1]) {
     w = rightW;
     wasFract[wasFract.length - 1] = true;
     return;
   } else {
     for (int i = maxFractPow2; i > 0; i--) {
       for (int j = 0; (1 << (i - 1)) + j * (1 << i) < wasFract.length; j++) {
         float tmp =
             leftW + (rightW - leftW) * (1 + 2 * j) / (float) (1 << (maxFractPow2 + 1 - i));
         if (!wasFract[(1 << (i - 1)) + j * (1 << i)]
             && tmp >= chosenLeftW
             && tmp <= chosenRightW) {
           w = tmp;
           wasFract[(1 << (i - 1)) + j * (1 << i)] = true;
           return;
         }
       }
     }
   }
   frame.stop();
   JOptionPane.showMessageDialog(frame, "Максимальная точность на данном отрезке достигнута");
 }
 private static void refresh() {
   place = a = V = 0;
   time = 0;
   graphSpring.clear();
   frame.jSliderdY2.setValue(2);
   maxA = minA = 0;
   periodCount = 0;
   graph2X0 = 0;
   idleProcess = false;
   idleTime = 0;
   frame.setDone(0);
   curExtremumCount = 0;
 }
  public static void count(float dt) {
    if (idleProcess) {
      idleTime -= dt;
      if (idleTime < 0) {
        refresh();
        if (searchType == SearchType.DELTA) {
          nextW_DeltaSearch();
        } else {
          nextW_TernarySearch();
        }
        saveToFile();
        frame.setW(w);
      }
    }
    if (m == 0) {
      return;
    }
    try {
      a = -k * place - V * b + (float) ex.count();
    } catch (Exception exc) {
      log("Exception while changing \'a\' value", exc);
    }
    if (!idleProcess && V >= 0 && V + a * dt <= 0 && a * dt != 0
        || V <= 0 && V + a * dt >= 0 && a * dt != 0) {
      extremums[curExtremumCount++] = place;
      int T = checkForDone();
      frame.setDone(periodCount);
      if (T > 0) {
        minA = maxA = extremums[curExtremumCount - 1];
        for (int i = 1; i < T; i++) {
          minA = Math.min(minA, extremums[curExtremumCount - 1 - i]);
          maxA = Math.max(maxA, extremums[curExtremumCount - 1 - i]);
        }
      }
    }
    V += a * dt;
    place += V * dt;
    if (showHOGraph) {
      graphSpring.addLast(new Vector2f(time, place));

      while (2 * place / graph2dY > height2) {
        frame.jSliderdY2.setValue(frame.jSliderdY2.getValue() + 1);
      }
    }
    if (updateCount == 0) {
      updateCount++;
      averageDT = dt;
    } else {
      averageDT = (averageDT * updateCount + dt) / (updateCount + 1);
      updateCount++;
    }
    if (!idleProcess && (periodCount >= maxPeriodsNeeded || skipW)) {
      if (!skipW) {
        if (maxA - minA > EPS) {
          add(w, (maxA - minA) / 2);
        } else {
          add(w, Math.abs(maxA));
        }
      } else {
        skipW = false;
      }
      if (searchType == SearchType.TERNARY) {
        if (Float.isNaN(A1_tern)) {
          A1_tern = (maxA - minA) / 2;
        } else {
          A2_tern = (maxA - minA) / 2;
        }
      }
      idleTime = startIdleTime;
      idleProcess = true;
    }
    skipW = false;
  }