У меня есть одно значение, которое представляет собой процент с плавающей запятой от 0 до 100, x
и другое значение, которое является плавающей точкой от 0-1, y
, Как y
становится ближе к нулю, это должно уменьшить значение x
на логарифмической кривой.
Так, например, скажем x = 28.0f
а также y = 0.8f
, поскольку 0.8f
не так далеко от 1.0f
это должно только уменьшить ценность x
на небольшое количество, скажем, сводя его к x = 25.0f
или что-то типа того. Как y
становится ближе к нулю, это должно все более и более резко уменьшить значение x
, Единственный способ, которым я могу думать об этом, — это логарифмическая кривая. Я знаю, что я хочу, чтобы он делал, но я не могу понять, как реализовать это в C ++. Как бы этот алгоритм выглядел в C ++?
Похоже, вы хотите это:
new_x = x * ln((e - 1) * y + 1)
Я предполагаю, что у вас есть функция естественного журнала ln
и постоянная e
, Число, умноженное на x
является логарифмической функцией y
который равен 0, когда у = 0 и 1, когда у = 1.
Вот логика этой функции (это в основном математическая проблема, а не проблема программирования). Вы хотите что-то похожее на ln
функция, сначала крутой подъем, а затем выравнивание. Но вы хотите, чтобы он начинался с (0, 0), а затем проходил через (1, 1) и ln
начинается в (1, 0) и проходит через (е, 1). Это говорит о том, что, прежде чем сделать ln
Вы делаете простой линейный сдвиг, который занимает от 0 до 1 и от 1 до e: ((e - 1) * y + 1
,
Мы можем попробовать следующее предположение: нам нужна функция f (y), так что f (0) = 0 и f (1) = 1, которая следует некоторой логарифмической кривой, может быть чем-то вроде f (y) = Aвойти (B + Cy) с константами A, B и C.
f (0) = 0, поэтому B = 1
f (1) = 1, поэтому A = 1 / log (1 + C)
Так что теперь просто нужно найти значение C, чтобы f (0.8) было примерно равно 25/28. Несколько экспериментов показывают, что C = 4 довольно близко. Вы можете найти ближе, если хотите.
Таким образом, одна возможность будет: f (y) = log (1.0 + 4.0 * y) / log (5.0)