Я часто сглаживаю значения, смешивая проценты и обратные проценты со следующим:
current_value = (current_value * 0.95f) + (goal_value * 0.05f)
Я сталкиваюсь с ситуацией, когда я хотел бы выполнить это действие n раз, а n — это значение с плавающей запятой.
Как правильно выполнить вышесказанное, скажем, 12,5 раз, например?
Один из способов сделать это — обработать целое число, а затем приблизить оставшееся количество. Например (я предполагаю допустимые входные данные, вы хотели бы проверить для них):
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
Я ценю помощь! Я пробовал несколько вещей, связанных с сложным интересом, и я думаю, что, возможно, решил это с помощью следующего. Моя конечная цель (которая на самом деле не была указана здесь) состояла в том, чтобы сделать это с очень небольшой итеративной обработкой. 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 является (числом шагов)