步骤独立平滑

时间:2013-12-01 06:13:13

标签: c++ math percentage blending smoothing

我经常通过将百分比和反百分比混合到下面来平滑值:

current_value = (current_value * 0.95f) + (goal_value * 0.05f)

我遇到了我想要执行此操作n次的情况,n是浮点值。

执行上述操作的正确方法是什么,例如12.5次?

2 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是处理整数金额,然后估算剩余金额。例如(我假设有效输入,你想检查那些):

void Smooth(float& current, float goal, float times, float factor){
    // Handle the integer steps;
    int numberIterations = (int)times;
    for (int i = 0; i < numberIterations; ++i){
        current = (factor * current) + (goal * (1 - factor));
    }

    // Aproximate the rest of the step
    float remainingIteration = times - numberIterations;
    float adjusted_factor = factor + ((1 - factor) * (1 - remainingIteration));
    current = (adjusted_factor * current) + (goal * (1 - adjusted_factor));
}

运行以下值,我得到:

当前= 1目标= 2因子= 0.95

12.0次 - 1.45964

12.5次 - 1.47315

13.0次 - 1.48666

答案 1 :(得分:0)

我很感激帮助!我一直在尝试与复利有关的几件事,我相信我可能用以下方法解决了这个问题。我的最终目标(这里实际上没有说明)是用很少的迭代处理实际做到这一点。 powf()可能是最耗时的部分。

float blend_n(float c, float g, float f, float n)
{
    if (g != 0.0f)
        return c + ((g - c) / g) * (g - g * powf(1.0f - f, n));
    else
        return c * powf(1.0 - f, n);
}

现在已经很晚了,而且我的redbull正在磨损,所以可能会有一些部分可以用掉。

用法是将c设置为blend_n ...

的返回值

再次感谢!

[编辑] 我应该在这里解释一下,c是(当前)值,g是(目标)值,f是(因子),n是(步数) [/编辑]

[EDIT2] 必须对目标值为0进行例外处理,因为它将导致NaN(非数字)...对上面的代码进行了更改 [/ EDIT2]