Шаг Независимое Сглаживание

Я часто сглаживаю значения, смешивая проценты и обратные проценты со следующим:


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

Я сталкиваюсь с ситуацией, когда я хотел бы выполнить это действие n раз, а n — это значение с плавающей запятой.

Как правильно выполнить вышесказанное, скажем, 12,5 раз, например?

0

Решение

Один из способов сделать это — обработать целое число, а затем приблизить оставшееся количество. Например (я предполагаю допустимые входные данные, вы хотели бы проверить для них):

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

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

Я ценю помощь! Я пробовал несколько вещей, связанных с сложным интересом, и я думаю, что, возможно, решил это с помощью следующего. Моя конечная цель (которая на самом деле не была указана здесь) состояла в том, чтобы сделать это с очень небольшой итеративной обработкой. 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]
0

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