我发现遵循 1 / bc 模式的函数会产生漂亮的曲线,可以很好地与插值函数耦合。
我使用该函数的方式是将“c”视为变化值,即 0 和 1 之间的插值值,同时改变“锐度”的 b。我用它来计算 0 到 1 之间的插值,所以一般我使用的函数是这样的:
float interpolationvalue = 1 - 1/pow(100,c);
linearinterpolate( val1, val2, interpolationvalue);
到目前为止,我一直在使用一种黑客方法来使其“工作”,因为当插值值 = 1 时,该值非常接近但不完全是 0。
所以我想知道,是否有一个 或 one 形式的函数可以重现与 1 / bc 产生的曲线相似的曲线,其中 c = 0 结果 = 1 且 c = 1 结果 = 0。
或者甚至 C = 0,结果 = 0 且 C = 1 结果 = 1。
感谢您的帮助!
对于插值,提供最大灵活性的方法是使用样条线,在您的情况下,二次样条线似乎就足够了。维基百科页面包含大量数学内容,但您可以在谷歌上找到改编的描述。
1 - c ^ b
的 b
值较小?另一种选择是使用三次多项式并指定 0 和 1 处的斜率。
您可以使用
A - 1 / b^(c + a)
形式的类似曲线,选择 A
和 a
的值来匹配您的约束。所以,对于c = 0, result = 1
:
1 = A - 1/b^a => A = 1 + 1/b^a
对于
c = 1, result = 0
:
0 = A - 1/b^(1+a) => A = 1/b^(1+a)
结合这些,我们可以用
a
来求 b
:
1 + 1/b^a = 1/b^(1+a)
b^(1+a) + b = 1
b * (b^a - 1) = 1
b^a = 1/b - 1
所以:
a = log_b(1/b - 1) = log(1/b - 1) / log(b)
A = 1 + 1/b^a = 1 / (1-b)
在数学家使用的实数中,您指定的形式的函数不会返回 0,除法不能做到这一点。 (1/x)==0 没有实数解。 在浮点算术中,计算机使用的实际算术关系很差,您可以编写 1/(MAX_FP_VALUE^1) ,这将为您提供尽可能接近 0 的值(实际上,它可能会给您一个 NaN 或IEEE 754 允许的其他奇数回报之一)。
而且,我相信您已经注意到,1/(b^0) 始终返回 1,因为根据 0 次方的定义,b^0 始终为 1。
因此,c = 0 的函数不会产生 0 的结果。
对于 c = 1,结果 = 1,设置 b = 1
但我想这只是部分答案,我不太确定我理解你想要做什么。