Pregunta

Tratamiento tiene una gran función que utilizo todo el tiempo:

map(value, low1, high1, low2, high2)

http://processing.org/reference/map_.html

Se vuelve a asignar value (que tiene un rango esperado de low1 a high1) en un rango objetivo de low2 a high2).

Quiero entender las matemáticas detrás de él para que pueda utilizarlo en otros idiomas. quiero que nadie me tire un hueso y me ayude a técnicas de ingeniería inversa? Entiendo que es un lerp que ha sido re-escalado y volver a compensar ... sintiendo clínicamente muerto esta mañana.

¿Fue útil?

Solución

A partir de su descripción, que debería estar haciendo esto, ¿verdad?

low2 + (value - low1) * (high2 - low2) / (high1 - low1)

Para saber lo lejos que están en el primer rango, la escala de esa distancia por la relación de tamaños de los rangos, y eso es lo lejos que debe ser en el segundo rango.

Otros consejos

Tratamiento es de código abierto. Puede ver la función map() aquí .

static public final float map(float value,
                                float start1, float stop1,
                                float start2, float stop2) {
    float outgoing =
      start2 + (stop2 - start2) * ((value - start1) / (stop1 - start1));
    String badness = null;
    if (outgoing != outgoing) {
      badness = "NaN (not a number)";

    } else if (outgoing == Float.NEGATIVE_INFINITY ||
               outgoing == Float.POSITIVE_INFINITY) {
      badness = "infinity";
    }
    if (badness != null) {
      final String msg =
        String.format("map(%s, %s, %s, %s, %s) called, which returns %s",
                      nf(value), nf(start1), nf(stop1),
                      nf(start2), nf(stop2), badness);
      PGraphics.showWarning(msg);
    }
    return outgoing;
  }

En concreto, se está buscando esta línea de código:

float outgoing =
      start2 + (stop2 - start2) * ((value - start1) / (stop1 - start1));

Me gustaría añadir que a veces es útil para encontrar el factor entre el LOW1 y High1 para que pueda modular con una curva antes de usar el factor como una t de Lerp.

Por lo tanto, t = (valor-LOW1) / (High1-LOW1) para obtener la posición relativa de valor en la línea LOW1 a High1.

A continuación, puede modular t con algún filtro curva por ejemplo, gamma, el sesgo, la ganancia, etc Como también sujetar el t entre 0 y 1 si a restringir los valores que van sobre los mínimos establecidos y máximos.

y luego usar la t para la Lerp entre BAJO2 y ALTA2 como: finalvalue = BAJO2 * (1-t) + ALTA2 * t

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top