2012-01-04 37 views
5

Tengo un control deslizante de JavaScript que genera un valor entre 0 y 1 según su posición. Quiero convertir ese valor a un valor en otra escala entre, por ejemplo, 100 y 1000, pero según la distribución de un conjunto de puntos de datos entre 100 y 1000.valores ponderados del control deslizante de javascript

El caso de uso aquí es que quiero que el control deslizante sea menos sensible a los cambios cuando hay un conjunto de números muy cercano. Por ejemplo ... digamos que los valores de la escala son:

100, 200, 300, 500, 1000 

Los valores 100-500 podrían tomar hasta, digamos, el primer 80% de la corredera debido a su distribución más cerca, por lo tanto haciendo que sea más fácil para seleccionar entre ellos.

Claramente hay una función matemática para calcular esto, quizás involucrando desviación estándar y coeficientes. Alguien sabe lo que es?

Respuesta

2

mediante interpolación lineal entre los valores en la gran escala, algo así como

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

Gracias, t el suyo está funcionando bien. ¿Cuál es la mejor manera de revertir este cálculo? –

1

Creo que cualquier tipo de ecuación polinomial, usando los valores del control deslizante como la variable independiente funcionaría. La ecuación específica dependería de sus necesidades/distribución específicas.

Por ejemplo, -1 * (X^2) le daría una parábola invertida, incluso si X = 10 * [slider value]

1

Para valores arbitrarios Me propongo algún tipo de interpolación spline. Convertir el conjunto de valores de un conjunto de puntos, donde la segunda coordenada se encuentra en la "escala deslizante":

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

Ahora sólo tiene que utilizar la interpolación spline de su elección para crear una curva suave, y una vez que tenga la curva puede obtener valores en su escala 100-1000.

Si no desea implementar ninguna interpolación spline complicada, puede tomar una línea lineal, lo que significa que para cualquier punto de su control deslizante entre 0.0 y 0.25 usted interpola linealmente entre 100 y 200, entre 0.25 y 0.5 interpola entre 200 y 300 y así sucesivamente.

0

(no sé lo que la etiqueta es para pedir a la opuesta a la pregunta original en a comment, pero voy a añadir como una respuesta adicional para ajustarse al código en)

Continuando desde my previous answer, con todas las variables declaradas como antes:.

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 />'); 
} 
Cuestiones relacionadas