Algorithm 将一个连续数据范围非线性映射到另一个连续数据范围

Algorithm 将一个连续数据范围非线性映射到另一个连续数据范围,algorithm,math,mapping,Algorithm,Math,Mapping,很抱歉标题含糊不清。我不知道如何简明扼要地说出我要问的问题。这更像是一个数学/算法问题,而不是一个编程问题 在我正在开发的一个应用程序中,我们有一个值可以在0和预定的最大值之间波动(在测试中,它通常徘徊在100左右,所以我们就说100)。这个数据范围是连续的,这意味着有无限多个可能的值-只要它在0到100之间,这是可能的 现在,由此返回的任何值都被映射到一个不同的连续范围——从1000到200。如果第一个集合的值是100,我将它映射到200,如果第一个集合的值是0,它将映射到1000。当然还有中

很抱歉标题含糊不清。我不知道如何简明扼要地说出我要问的问题。这更像是一个数学/算法问题,而不是一个编程问题

在我正在开发的一个应用程序中,我们有一个值可以在0和预定的最大值之间波动(在测试中,它通常徘徊在100左右,所以我们就说100)。这个数据范围是连续的,这意味着有无限多个可能的值-只要它在0到100之间,这是可能的

现在,由此返回的任何值都被映射到一个不同的连续范围——从1000到200。如果第一个集合的值是100,我将它映射到200,如果第一个集合的值是0,它将映射到1000。当然还有中间的一切。这是代码的样子:

-(float)mapToRange:(float)val withMax:(float)maxVal{
    // Establish range constants.
    const int upperBound = 1000;
    const int lowerBound = 200;
    const int bandwidth = upperBound - lowerBound;

    // Make sure we don't go above the calibrated maximum.
    if(val > maxVal)
        val = maxVal;

    // Scale the original value to our new boundaries.
    float scaled = val/maxVal;
    float ret = upperBound - scaled*bandwidth;

    return ret;
}

现在,我要做的是使较高的原始值(接近100)以比较低的原始值(接近0)更大的增量增加。也就是说,如果我开始以稳定的速率从100慢慢地减少到0,那么从200开始的新值开始会快速地向1000移动,但越接近1000,增量越小。做这件事的最佳方法是什么?

你的值
缩放
基本上是范围
0-1
中表示的
0-100
值,因此使用它很好。尝试将其提高到整数次方,结果将在
1
附近增加得更快,在
0
附近增加得更慢。功率越高,效果越大。比如:

float scaled = val/maxVal;
float bent = scaled*scaled*scaled*scaled;  // or however you want to write x^4
float ret = upperBound - bent*bandwidth;
下面是这个想法的草图:

也就是说,span
A到B
映射到较小的span
A到B
,而span
C到D
映射到较大的span
C到D
。多项式的幂越大,曲线弯曲到右下角的次数就越多

使用
0
1
范围的优点是,当
x
0
1
时,端点保持固定,但这当然不是必需的,因为任何东西都可以通过适当的移位和缩放进行补偿

还要注意的是,这张地图不是对称的(虽然我的画看起来有点对称),当然可以选择对称曲线。如果要以另一种方式弯曲曲线,请选择小于1的幂