Del flash de AS3 - ¿Cómo expresar la diferencia entre dos coordenadas xy como un número entre 0 y 1?
-
29-09-2019 - |
Pregunta
He creado una clase de reproductores clip de película y animador de clases que animan clips de película a lo largo de un conjunto de x, puntos y. He usado TweenMax de Greensock para llevar a cabo la animación y he puesto la velocidad a ser de 1 segundo entre cada punto. El problema es que cuando la distancia entre dos puntos es pequeña se ve demasiado lento.
Lo que me gustaría hacer es de alguna manera calcular la distancia entre los dos puntos y la salida una velocidad en el rango de 0 a 1 segundos, por lo que la velocidad es ser correcta para las distancias más cortas, así como las distancias más largas.
Cualquier ayuda o consejo sería muy apreciada.
Gracias,
eb_dev
Solución
Me lo segundo Matti Dicho esto, pero se puede hacer más rápido - por un costo de alrededor de 48 a 64 bits de memoria (Whoah tanto !!! ...)
var dX:Number = x1 - x2;
var dY:Number = y1 - y2;
var dist:Number = Math.sqrt(dX * dX + dY * dY);
var animTime = dist / state.stageWidth;
Y para explicar que el eb Dev 's solicitud, la raíz cuadrada no es una parte del teorema de Pitágoras:
a^2 + b^2 = c^2
Líneas de ejes X e Y se puede ver como dos catetos de un triángulo en ángulo recto, y por lo tanto la hipotenusa sería la distancia entre dos puntos específicos (que necesitamos).
En primer lugar restar los puntos (x1 - x2, y1 - y2). Todavía tenemos dos puntos, sin embargo, la parte de ángulo recto del triángulo se encuentra ahora en 0, 0 - el punto en ejes X e Y cruz. Para poder aplicar esto a teorema de Pitágoras, vamos a ver qué tamaño son a y b va a ser - la longitud de la pierna a es la distancia entre 0, 0 y el punto 1. Restando 0, 0 todavía nos deja con el punto 1 solo - sin embargo, sabemos que va a estar en algún lugar en el eje X - Y por lo tanto su será 0. podemos decir que la longitud de iguales X parte del punto 1.
Lo mismo va para b de la pierna y el punto 2. Esta vez, sin embargo, se obtiene simplemente Y parte de ella.
Y para calcular c , primero resumir las segundas potencias de a y < em> b (a ^ 2 + b ^ 2). Ahora tenemos c ^ 2, por lo que para obtener el c -. hipotenusa, vamos a calcular su raíz cuadrada (que es Math.sqrt () en AS3.0)
c es la distancia.
Espero que esto explica esto.
Otros consejos
Creo que desea que la velocidad mínima para la distancia más pequeña.
const MIN_SPEED:Number = ???// adjust this value
var distance:Number = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
var duration:Number = Math.min(1.0, distance / MIN_SPEED);
para larga distancia 1,0 para la pequeña distancia 1.0> distancia / MIN_SPEED, y la duración se establecerá a moverse a una cierta velocidad definida por MIN_SPEED.
Lo que se quiere hacer es calcular la distancia entre los dos puntos y tener el tiempo sea en relación con eso. ¿Cómo es exactamente lo que define la relación depende. Es un uno segundos de animación en la que lo mueve de un extremo de la etapa a la otra o qué. Esta será su línea de base y todas las animaciones será relativa a la misma.
Así que digamos que una animación en todo el ancho de la etapa es de un segundo, y todo lo que es más corto que en relación con ese segundo.
dist = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
animTime = dist / state.stageWidth;
ACTUALIZACIÓN:
El Math.sqrt sólo toma la raíz cuadrada de la diferencia entre los puntos. Usted no necesariamente tiene que hacer esto ya que sólo está interesado en la distancia relativa a no el tamaño etapa la distancia real. La razón es que hay que conseguir la vuelta distancia en la misma escala que el stage.stageSize
. Observe que el (x1-x2)*(x1-x2)
se cuadrando la distancia entre el x1
y coordenadas x2
, es decir. igual a Math.pow(x1-x2,2)
.