math mapping numbers interpolation linear

math - Matemáticas-mapeo



mapping numbers (7)

Además de la respuesta de @PeterAllenWebb, si desea retroceder el resultado, use lo siguiente:

reverseX = (B-A)*(Y-C)/(D-C) + A

¿Cómo puedo mapear números, linealmente, entre a y b para ir entre c y 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


Cada intervalo de unidad en el primer rango ocupa (dc) / (ba) "espacio" en el segundo rango.

Seudo:

var interval = (d-c)/(b-a) for n = 0 to (b - a) print c + n*interval

Cómo manejas el redondeo depende de ti.


Como un lado, este es el mismo problema que el clásico convertido a farenheit en el que desea mapear un rango numérico que equivale a 0 - 100 (C) a 32 - 212 (F).


Divide para obtener la proporción entre los tamaños de los dos rangos, luego resta el valor inicial de tu rango inicial, multiplica por la razón y agrega el valor inicial de tu segundo rango. En otras palabras,

R = (20 - 10) / (6 - 2) y = (x - 2) * R + 10

Esto distribuye uniformemente los números del primer rango en el segundo rango.


Sería bueno tener esta funcionalidad en la clase java.lang.Math , ya que es una función muy necesaria y está disponible en otros idiomas. Aquí hay una implementación simple:

final static double EPSILON = 1e-12; public static double map(double valueCoord1, double startCoord1, double endCoord1, double startCoord2, double endCoord2) { if (Math.abs(endCoord1 - startCoord1) < EPSILON) { throw new ArithmeticException("/ 0"); } double offset = startCoord2; double ratio = (endCoord2 - startCoord2) / (endCoord1 - startCoord1); return ratio * (valueCoord1 - startCoord1) + offset; }

Estoy poniendo este código aquí como una referencia para mí en el futuro y puede ser que ayude a alguien.


Si su número X cae entre A y B, y desea que Y caiga entre C y D, puede aplicar la siguiente transformación lineal:

Y = (XA) / (BA) * (DC) + C

Eso debería darte lo que quieres, aunque tu pregunta es un poco ambigua, ya que también puedes mapear el intervalo en la dirección opuesta. Solo ten cuidado con la división por cero y deberías estar bien.


int srcMin = 2, srcMax = 6; int tgtMin = 10, tgtMax = 20; int nb = srcMax - srcMin; int range = tgtMax - tgtMin; float rate = (float) range / (float) nb; println(srcMin + " > " + tgtMin); float stepF = tgtMin; for (int i = 1; i < nb; i++) { stepF += rate; println((srcMin + i) + " > " + (int) (stepF + 0.5) + " (" + stepF + ")"); } println(srcMax + " > " + tgtMax);

Con controles en dividir por cero, por supuesto.