2012-01-04 101 views
5

我有一个JavaScript滑块,根据它的位置输出0到1之间的值。我想将该值转换为100至1000之间的另一个比例值,但是基于100到1000之间的一组数据点的分布。JavaScript滑块加权值

这里的用例是我希望滑块是当数字非常接近时,对变化不太敏感。如...让我们说,在规模的值是:

100, 200, 300, 500, 1000 

值100-500可能占用,比如说,滑块的前80%,由于其分布接近,因此更容易选择它们之间。

显然有一个数学函数来计算它,可能涉及标准偏差和系数。有人知道这是什么吗?

回答

2

上大规模使用值之间的线性插值,像

var bigValues = [100, 200, 300, 500, 1000]; 
var input; /* will vary in the range [0.0..1.0] */ 
var idx; /* index of nearest entry in bigValues below input */ 
var frac; /* fraction [0.0..1.0) in interval in bigValues */ 
var output; 
/* try some test values for input */ 
for (var i = 0; i<=20; i++) { 
    input = i * 0.05; 
    idx = Math.floor(input * (bigValues.length - 1)); 

    frac = (input - (idx)/(bigValues.length - 1)) * (bigValues.length - 1); 
    if (frac == 0) { /* no need to calculate */ 
     output = bigValues[idx]; 
    } 
    else { 
     output = bigValues[idx] + (bigValues[idx+1] - bigValues[idx]) * frac; 
    }; 
    document.write(input + ', ' + output + '<br />'); 
} 
+0

谢谢,T他的工作很好。逆转这种计算的最佳方法是什么? – 2012-02-03 17:54:02

1

我会认为,任何形式的多项式方程,使用滑块值作为独立变量将工作。具体的等式将取决于您的具体需求/分布。

例如,-1 * (X^2)会给你,如果X = 10 * [slider value]

1

为任意值,我会提出某种形式的样条插值的甚至倒抛物线。将您的值设置为一组点,其中第二个坐标是在“滑块刻度”的:

(100, 0.0), (200, 0.25), (300, 0.5), (500, 0.75), (1000, 1.0) 

现在只需使用您的选择创建平滑曲线的样条插值,并且一旦你的曲线你可以得到100-1000的数值。

如果您不想实现任何复杂的样条插值,可以采用线性插值,这意味着对于0.0到0.25之间的任何滑块点,可以在100和200之间进行线性插值,插值在0.25和0.5之间200至300之间等等。

0

(我不知道礼仪什么要求相对原来的问题在a comment,但我会添加它作为一个附加的应答,以适应代码)

my previous answer继续,以声明为前所有变量:

document.write('The other way round:<br />'); 

function findIntervalStart(n) { 
    for (var i = 1; i < bigValues.length; i++) if (n < bigValues[i]) return i-1; 
} 
/* try some test values */ 
for (var i = 1; i <= 21; i++) {  
    output = i * 50; 
    if (output >= bigValues[bigValues.length - 1]) { 
     input = 1; 
    } 
    else if (output <= bigValues[0]) { 
     input = 0; 
    } 
    else { 
    idx = findIntervalStart(output); 
     frac = (output - bigValues[idx])/(bigValues[idx + 1] - bigValues[idx]); 
     input = (idx + frac)/(bigValues.length - 1); 
    }; 

    document.write(output + ', ' + input + '<br />'); 
}