修改对数曲线上的值
Modifying a value on a logarithmic curve
我有一个值是 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
的对数函数,y=0时为0,y=1时为1。
这是该函数背后的逻辑(这基本上是一个数学问题,而不是编程问题)。您需要看起来像 ln
函数的东西,首先急剧上升然后趋于平稳。但是你想让它从 (0, 0) 开始,然后通过 (1, 1),而 ln
从 (1, 0) 开始,然后通过 (e, 1)。这表明在执行 ln
之前,您需要执行一个简单的线性移位,将 0 转换为 1,将 1 转换为 e:((e - 1) * y + 1
.
我们可以尝试以下假设:我们需要一个函数 f(y) 使得 f(0)=0 和 f(1)=1 遵循一些对数曲线,可能类似于 f(y) =Alog(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)
我有一个值是 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
的对数函数,y=0时为0,y=1时为1。
这是该函数背后的逻辑(这基本上是一个数学问题,而不是编程问题)。您需要看起来像 ln
函数的东西,首先急剧上升然后趋于平稳。但是你想让它从 (0, 0) 开始,然后通过 (1, 1),而 ln
从 (1, 0) 开始,然后通过 (e, 1)。这表明在执行 ln
之前,您需要执行一个简单的线性移位,将 0 转换为 1,将 1 转换为 e:((e - 1) * y + 1
.
我们可以尝试以下假设:我们需要一个函数 f(y) 使得 f(0)=0 和 f(1)=1 遵循一些对数曲线,可能类似于 f(y) =Alog(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)