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?
fuente
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?
La fórmula base es:
Result := ((Input - InputLow) / (InputHigh - InputLow))
* (OutputHigh - OutputLow) + OutputLow;
Tu caso:
Resultado: = (( Entrada - -1 ) / ( 1 - -1 ) * ( 255 - 0 ) + 0 ;
Desde aquí puede optimizar la conversión si sus coeficientes son estáticos, pero el compilador probablemente también lo haga por sí mismo.
Resultado: = (( Entrada - -1 ) / 2 ) * 255 + 0 ;
Resultado: = Entrada * 127.5 + 127.5 ;
El rango -1
a 1
es un rango total de 2
. Por lo tanto, debe escalarlo adecuadamente para llegar 255
. Algo como esto:
(randomPerlin + 1.0) * 127.5
Entonces agregas primero 1
, para llegar a 0..2
multiplicar luego 127.5
para obtener un rango de0..255
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:
(v - (-1.0))
v' = 0 + ---------------- * (255 - 0)
(1.0 - (-1.0))
oldRange = oldMax - oldMin
newRange = newMax - newMin
newValue = ((oldValue - oldMin) * newRange / oldRange) + newMin
Espero que esto ayude.
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
Digamos que x
es entrada original y y
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 una c
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.
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.