2010-06-18 9 views
6

¿Cómo puedo convertir una longitud en un valor en el rango de -1.0 a 1.0?¿Convierte la longitud arbitraria a un valor entre -1.0 a 1.0?

Ejemplo: mi etapa tiene 440px de longitud y acepta eventos de mouse. Me gustaría hacer clic en el medio del escenario, y en lugar de una salida de X = 220, me gustaría que fuera X = 0. Del mismo modo, me gustaría que el X = 0 real se convierta en X = -1.0 y el X = 440 real en X = 1.0.

No tengo acceso al escenario, así que no puedo simplemente registrarlo en el centro, lo que haría que este proceso sea mucho más fácil. Además, no es posible cambiar dinámicamente el tamaño real de mi escenario, por lo que estoy buscando una fórmula que traduzca la coordenada X real del escenario para que encaje uniformemente dentro de un rango de -1 a 1.

Respuesta

11
-1 + (2/440)*x 

donde x es la distancia

lo tanto, para generalizar, si el valor mínimo normalizado es a y el valor máximo normalizado es b (en su ejemplo a = -1.0, b = 1.0 y el valor máximo posible es k (en su ejemplo k = 440) :

a + x*(b-a)/k 

donde x es >= 0 y <= k

+0

Perfecto! Gracias. –

1

(x - 220)/220 = nuevo X

es eso lo que está buscando?

1

Necesita cambiar el origen y normalizar el rango. Por lo que la expresión se convierte en

(XCoordinate - 220)/220.0 
4

Se trata esencialmente de dos pasos:

  1. centro del rango de 0, así que por ejemplo un rango de 400 a 800 se mueve por lo que es de -200 a 200. hágalo, restando el centro (promedio) del mínimo y máximo del rango
  2. Divida por el valor absoluto de los extremos del rango para convertirlo de un rango -n to n a un rango . En el ejemplo de -200 a 200, que le divide por 200
1

Usted tiene un intervalo [a,b] que desea asignar a un nuevo intervalo [c,d], y un valor x en las coordenadas originales que es bastante desea mapear al y en las nuevas coordenadas. Entonces:

y = c + (x-a)*(c-d)/(b-a) 

Y por su ejemplo con [a,b] = [0,440] y [c,d] = [-1,1], con x=220:

y = -1 + (220-0)*(1 - -1)/(440-0) 
    = 0 

y así sucesivamente.

Por cierto, esto funciona incluso si x está fuera de [a,b]. Así que mientras sepa cualquier dos valores en ambos sistemas, puede convertir cualquier valor en cualquier dirección.

1

manejar anchos etapa arbitrarias (ni idea de si tiene roscas a tener en cuenta, lo que podría requerir mutex o similares, dependiendo de su idioma?)

stageWidth = GetStageWidth(); // which may return 440 in your case 
clickedX = MouseInput(); // should be 0 to 440 
x = -1.0 + 2.0 * (clickedX/stageWidth); // scale to -1.0 to +1.0 

también puede limitar el rango de x [ -1,1] aquí?

if (x < -1) x = -1.0; 
if (x > 1) x = 1.0; 

o proporcionar algún tipo de respuesta/alerta/error si el fuera de límites (sólo si realmente cuestiones y simplemente encajándolo al rango [-1,1] no es lo suficientemente bueno).

3

no responde a tu pregunta, pero para los futuros empleados de Google en busca de una función continua monotone que se asigna a todos los números reales (-1, 1), cualquier sigmoid curve va a hacer, como por ejemplo atan o una logistic curve:

 
f(x) = atan(x)/(pi/2) 
f(x) = 2/(1+e-x) - 1 

(image alt text)