Algorithm 将一个连续数据范围非线性映射到另一个连续数据范围
很抱歉标题含糊不清。我不知道如何简明扼要地说出我要问的问题。这更像是一个数学/算法问题,而不是一个编程问题 在我正在开发的一个应用程序中,我们有一个值可以在0和预定的最大值之间波动(在测试中,它通常徘徊在100左右,所以我们就说100)。这个数据范围是连续的,这意味着有无限多个可能的值-只要它在0到100之间,这是可能的 现在,由此返回的任何值都被映射到一个不同的连续范围——从1000到200。如果第一个集合的值是100,我将它映射到200,如果第一个集合的值是0,它将映射到1000。当然还有中间的一切。这是代码的样子:Algorithm 将一个连续数据范围非线性映射到另一个连续数据范围,algorithm,math,mapping,Algorithm,Math,Mapping,很抱歉标题含糊不清。我不知道如何简明扼要地说出我要问的问题。这更像是一个数学/算法问题,而不是一个编程问题 在我正在开发的一个应用程序中,我们有一个值可以在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;
下面是这个想法的草图:
也就是说,spanA到B
映射到较小的spanA到B
,而spanC到D
映射到较大的spanC到D
。多项式的幂越大,曲线弯曲到右下角的次数就越多
使用0
到1
范围的优点是,当x
为0
或1
时,端点保持固定,但这当然不是必需的,因为任何东西都可以通过适当的移位和缩放进行补偿
还要注意的是,这张地图不是对称的(虽然我的画看起来有点对称),当然可以选择对称曲线。如果要以另一种方式弯曲曲线,请选择小于1的幂