Ease of Motion函数(Ease to number)C++

Ease of Motion Function (Ease to number) C++

我想让某物动作流畅。想想一部电梯,当它到达所需楼层时,它不会全速运行并死机停止。它会尽可能快地移动,然后逐渐减速,直到到达所需的楼层。

我需要一个循环来输入...

int steps = 10;
int target = 100;

因此该函数将采取十个步骤来达到目标​​值 100。

理想情况下,此函数的行为应该非常类似于 PID loop

本质上,我希望有一种比创建 PID 循环更简单的方法来完成此操作。

你总是可以做一些比 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;

我需要的正是 Iluvatar 提供的...

#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;
}