Si sé que una relación de dos variables de entrada "a/b" tiene un rango de [1;2] Y si quiero que mi valor de salida de "y" tenga un rango de [ymin;ymax] de mi elección, según en el rango de "a/b":
¿Hay alguna fórmula que pueda vincular esos dos rangos para que siempre pueda encontrar el valor de y, cualquiera que sea el valor de "a/b" (sabiendo que siempre estará entre 1 y 2)?
Prácticamente:
Tengo una cuadrícula que puedo hacer zoom. No se puede predecir el número de pasos de zoom, pero sé que la escala final dividida por la escala inicial siempre estará entre 1 y 2. Y de acuerdo con ese rango predecible, me gustaría generar proporcionalmente un valor de opacidad para mis líneas de cuadrícula. desde un valor mínimo hasta un valor máximo de mi elección.
Digamos que me gustaría que mis valores de opacidad oscilaran entre 0,12 y 0,38 (es solo un ejemplo) según el nivel de zoom:
La fórmula asegurará que si la relación de escala es 1, la opacidad será 0,12 y si la relación de escala es 2, la opacidad será 0,38. Y todos los valores de opacidad intermedios permanecerían "proporcionales" (un aumento de escala del 50% = un aumento de opacidad del 50%, etc.). Y eso debería funcionar para cualquier rango de salida de mi elección.
Así que me pregunto si buscar una fórmula para lograr esto es razonable o si es más difícil de calcular de lo que parece.
Algo como esto
let opacity[from desired min to max] = (endScale/startScale)[from 1 to 2] * something + opacityMin;Pero eso es lineal y probablemente no se ajuste a mis necesidades...
Traté de trazar algunos puntos en papel para averiguarlo, pero la curva no es lineal y no sé cómo encontrar su fórmula algebraica, si es que hay una.
Esto es lo que tracé con el ejemplo de 0.12 a 0.38, considerando la misma progresión dentro del rango de entrada y el rango de salida:
Input Output percentage multiplier -------------------------------------------- 1 0.12 0% (* 0.12) 1.25 0.185 25% (* 0.148) 1.5 0.25 50% (* 0.166..) 1.75 0.315 75% (* 0.18) 2 0.38 100% (* 0.19)Si predigo la salida que necesito usando algunos valores de entrada entre 1 y 2, los coeficientes no coinciden, por supuesto. Así que no sé cómo vincular esos dos rangos. .
Cualquier ayuda sería apreciada. Al menos para orientarse un poco.
No encontré otra manera, era un poco raro.
const range = (props) => { const { rangeInput, rangeOutPut, input } = props if(rangeInput.length && rangeOutPut.length && input){ const BindingMinInput = rangeInput[0] const BindingMaxInput = rangeInput[1] const BindingMin = rangeOutPut[0] const BindingMax = rangeOutPut[1] const outPutMax = (function(){ if(rangeInput.includes(input)){ return input } const test = BindingMaxInput - input return BindingMax * test }()) return outPutMax } else { throw new Error('Props is undefined, or badly formatted props') } } range({ rangeInput:[ 1, 2 ], rangeOutPut:[ 0.12, 0.38 ], input:2 })No estoy seguro de si existe un buen algoritmo para eso, pero a partir de su descripción del problema, puedo recomendar hacer algo así:
const zoomMin = 1; const zoomMax = 2; const opacityMin = 0.12; const opacityMax = 0.38; function getOpacityLevel(zoomLevel) { const zoomRange = (zoomMax - zoomMin); const opacityRange = (opacityMax - opacityMin); const zoomLevelPercent = (zoomLevel - zoomMin) / zoomRange; const opacityLevel = (opacityRange * zoomLevelPercent) + opacityMin; return opacityLevel; } console.log(getOpacityLevel(1.0)); console.log(getOpacityLevel(1.25)); console.log(getOpacityLevel(1.5)); console.log(getOpacityLevel(1.75)); console.log(getOpacityLevel(2.0));si quieres hacerlo al azar.
var float = Math.random().toFixed(2) console.log(1 + parseFloat(float))