¿Cómo mapeo números, linealmente, entre ayb para ir entre cy d.
Es decir, quiero que los números entre 2 y 6 se asignen a números entre 10 y 20 ... pero necesito el caso generalizado.
Mi cerebro está frito.
¿Cómo mapeo números, linealmente, entre ayb para ir entre cy d.
Es decir, quiero que los números entre 2 y 6 se asignen a números entre 10 y 20 ... pero necesito el caso generalizado.
Mi cerebro está frito.
Respuestas:
Si su número X se encuentra entre A y B, y desea que Y esté entre C y D, puede aplicar la siguiente transformación lineal:
Eso debería darle lo que desea, aunque su pregunta es un poco ambigua, ya que también podría mapear el intervalo en la dirección inversa. Solo tenga cuidado con la división por cero y debería estar bien.
fuente
Y=f(X)=m*X+b
, donde myb se han determinado simultáneamente a partir de las siguientes dos ecuaciones de restricción que resultan de la sustitución de los valores de X e Y en los puntos finales requeridos:C=m*A+b
yD=m*B+b
X=A+(A-B)*t
para demostrar la igualdad entre este enfoque y el de Peter. Es esencialmente una no dimensionalización de X. (t=(X-A)/(A-B)
)Divida para obtener la proporción entre los tamaños de los dos rangos, luego reste el valor inicial de su rango inicial, multiplique por la proporción y agregue el valor inicial de su segundo rango. En otras palabras,
Esto distribuye uniformemente los números del primer rango en el segundo rango.
fuente
Sería bueno tener esta funcionalidad en la
java.lang.Math
clase, ya que es una función muy requerida y está disponible en otros idiomas. Aquí hay una implementación simple:Estoy poniendo este código aquí como referencia para el futuro y puede que ayude a alguien.
fuente
Aparte, este es el mismo problema que el clásico convertir celcius a farenheit donde desea mapear un rango de números que equivale 0 - 100 (C) a 32 - 212 (F).
fuente
Cada intervalo de unidad en el primer rango ocupa (dc) / (ba) "espacio" en el segundo rango.
Seudo:
La forma en que maneja el redondeo depende de usted.
fuente
Con cheques en dividir por cero, por supuesto.
fuente
si su rango de [a a b] y desea mapearlo en [c ad] donde x es el valor que desea mapear, use esta fórmula (mapeo lineal)
fuente
https://rosettacode.org/wiki/Map_range
fuente
Además de la respuesta de @PeterAllenWebb, si desea revertir el resultado, use lo siguiente:
fuente