Функция простоты движения (простота нумерации) Переполнение стека

Я хочу заставить что-то двигаться плавным движением. Подумайте о лифте, он не идет на полной скорости и не останавливается, когда достигает желаемого этажа. Он идет так быстро, как может, и постепенно замедляется, пока не достигнет желаемого этажа.

Мне нужен цикл, который вводит …

int steps = 10;
int target = 100;

Таким образом, функция сделает десять шагов, чтобы достичь целевого значения 100.

В идеале эта функция должна действовать очень похоже на Петля PID.

По сути, я надеюсь, что есть более простой способ добиться этого, чем создание цикла PID.

1

Решение

Вы всегда можете сделать что-то попроще, чем PID, отрегулировав свою скорость в зависимости от того, насколько вы близки (петля P, если хотите). Конечно, с фиксированным количеством шагов, вам придется пройти весь путь до последнего, но если он достаточно мал, это не должно иметь большого значения.

Это равносильно прохождению фиксированного процента от расстояния, пройденного каждым шагом, и процент зависит от того, насколько быстро вы хотите замедлиться. В вашем примере вы можете сделать что-то вроде 40%:

{0., 40., 64., 78.4, 87.04, 92.224, 95.3344, 97.2006, 98.3204, 98.9922}
{0, 40, 64, 78, 87, 92, 95, 97, 98, 100} after rounding

Код для начала с 0 и перехода к целевому значению N будет тогда

#include <math.h>
...
int steps[NUM_STEPS];
for (int i = 0; i < NUM_STEPS - 1; i++) {
steps[i] = N - N * pow(.6, i);
}
steps[NUM_STEPS - 1] = N;
2

Другие решения

Что мне нужно, именно любезность Илуватара …

#include <math.h>
using namespace std;

int main()
{
void smooth(int, int, float);

smooth(10, 100, 0.6);

return 0;
}

void smooth(int steps, int target, float increment) {
for (int i = 0; i < steps - 1; i++) {
int num = target - target * pow(increment, i);
cout << num << endl;
}
cout << target << endl;
}
1

По вопросам рекламы [email protected]