我经常通过将百分比和反百分比混合到下面来平滑值:
current_value = (current_value * 0.95f) + (goal_value * 0.05f)
我遇到了我想要执行此操作n次的情况,n是浮点值。
执行上述操作的正确方法是什么,例如12.5次?
答案 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]