c++ math hlsl normalize

c++ - Normalizando de[0.5-1] a



math hlsl (6)

× 2 - 1

debería hacer el truco

Estoy un poco atascado aquí, supongo que es un poco un enigma. Si tengo números en el rango entre 0.5 a 1, ¿cómo puedo normalizar que esté entre 0 a 1?

Gracias por cualquier ayuda, quizás sea un poco lento ya que he estado trabajando durante las últimas 24 horas seguidas O_O


Otros te han proporcionado la fórmula, pero no el trabajo. Así es como abordas un problema como este. Puede que encuentres esto mucho más valioso que simplemente conocer la respuesta.

Para mapear [0.5, 1] a [0, 1] buscaremos un mapa lineal de la forma x -> ax + b . Requeriremos que los puntos finales se asignen a los puntos finales y que el orden se mantenga.

Método uno: el requisito de que los puntos finales se asignen a los puntos finales y que el orden se conserve implica que 0.5 se asigna a 0 y 1 se asigna a 1

a * (0.5) + b = 0 (1) a * 1 + b = 1 (2)

Este es un sistema simultáneo de ecuaciones lineales y se puede resolver multiplicando la ecuación (1) por -2 y agregando la ecuación (1) a la ecuación (2) . Al hacer esto obtenemos b = -1 y sustituyendo esto de nuevo en la ecuación (2) obtenemos que a = 2 . Así, el mapa x -> 2x - 1 hará el truco.

Método dos: la pendiente de una línea que pasa por dos puntos (x1, y1) y (x2, y2) es

(y2 - y1) / (x2 - x1).

Aquí usaremos los puntos (0.5, 0) y (1, 1) para cumplir con el requisito de que los puntos finales se asignen a los puntos finales y que el mapa conserve el orden. Por lo tanto la pendiente es

m = (1 - 0) / (1 - 0.5) = 1 / 0.5 = 2.

Tenemos que (1, 1) es un punto en la línea y, por lo tanto, por la forma punto-pendiente de una ecuación de una línea tenemos que

y - 1 = 2 * (x - 1) = 2x - 2

así que eso

y = 2x - 1.

Una vez más vemos que x -> 2x - 1 es un mapa que hará el truco.


Para agregar otra respuesta genérica.

Si desea asignar el rango lineal [A..B] a [C..D], puede aplicar los siguientes pasos:

Cambie el rango para que el límite inferior sea 0. (subract A de ambos límites:

[A..B] -> [0..B-A]

Escala el rango para que sea [0..1]. (dividir por el límite superior):

[0..B-A] -> [0..1]

Escale el rango para que tenga la longitud del nuevo rango que es DC. (multiplica con DC):

[0..1] -> [0..D-C]

Cambie el rango para que el límite inferior sea C. (agregue C a los límites):

[0..D-C] -> [C..D]

Combinando esto a una sola fórmula, obtenemos:

(D-C)*(X-A) X'' = ----------- + C (B-A)

En su caso, A = 0.5, B = 1, C = 0, D = 1 usted obtiene:

(X-0.5) X'' = ------- = 2X-1 (0.5)

Tenga en cuenta que si tiene que convertir una gran cantidad de X en X '', puede cambiar la fórmula a:

(D-C) C*B - A*D X'' = ----- * X + --------- (B-A) (B-A)

También es interesante echar un vistazo a los rangos no lineales. Puede seguir los mismos pasos, pero necesita un paso adicional para transformar el rango lineal en un rango no lineal.


Resta 0.5 (te da un nuevo rango de 0 - 0.5) luego multiplica por 2.

double normalize( double x ) { // I''ll leave range validation up to you return (x - 0.5) * 2; }


Siempre puede usar la abrazadera o la saturación dentro de su matemática para asegurarse de que su valor final esté entre 0 y 1. Algunos se saturan al final, pero también lo he visto durante un cálculo.


Respuesta de Lazyweb: Para convertir un valor x de [minimum..maximum] [floor..ceil] :

Caso general:

normalized_x = ((ceil - floor) * (x - minimum))/(maximum - minimum) + floor

Para normalizar a [0..255]:

normalized_x = (255 * (x - minimum))/(maximum - minimum)

Para normalizar a [0..1]:

normalized_x = (x - minimum)/(maximum - minimum)