Estoy haciendo generación de terreno y tengo una biblioteca perlin que me da números aleatorios entre -1 y +1. Quiero convertir esto a la escala de 0-255. ¿Cuál es la forma apropiada de hacer esto?
mathematics
Thraka
fuente
fuente
El rango
-1
a1
es un rango total de2
. Por lo tanto, debe escalarlo adecuadamente para llegar255
. Algo como esto:Entonces agregas primero
1
, para llegar a0..2
multiplicar luego127.5
para obtener un rango de0..255
fuente
A través del poder de escala y sesgo.
De su valor, reste el valor mínimo de su rango. Eso le dará un valor en el rango [0..2].
Divida eso por el ancho del rango de origen, dándole un valor en el rango [0..1].
Multiplique eso por el ancho del rango objetivo, dándole un valor en el rango [0..255].
Agregue la base del rango objetivo para obtener un valor en el rango objetivo, que para este caso es el mismo que el paso anterior.
En resumen:
fuente
Espero que esto ayude.
fuente
Traduzca el rango de entrada para que obtengamos el mínimo a cero agregando 1 (el valor negativo de la entrada mínima) -1 .. 1 -> 0 .. 2
Como el rango de salida comienza con cero, no haga nada por eso.
Escale el nuevo rango de entrada para que se ajuste al rango de salida, esto es fácil ya que ahora ambos comienzan en cero: multiplique el valor por 255/2 0..2 * 2/255 -> 0..255
¡Hecho!
Ejemplo:
0.5 irá: (0.5 + 1) * 127.5 = 191.25 -0.5 irá: (-0.5 + 1) * 127.5 = 63.75
fuente
Digamos que
x
es entrada original yy
salida esperada. Tenemos al menos dos puntos (x, y) (-1, 0) (1, 255)Como queremos hacer una interpolación lineal , podemos ver la ecuación de la forma
y = m*x + c
Con los dos puntos anteriores, podemos resolver
m
y unac
vez hecho esto, obtienes la ecuación de transformación.Tenga en cuenta que este método también funciona para otros tipos de ecuaciones. Por ejemplo, si desea una interpolación exponencial o cuadrática.
fuente
v = (1-a)*x + (a)*y
. No veo cómo esta respuesta tiene mucha relevancia para la pregunta formulada, ya que todo lo que quiere es un mapeo de rango.