FLash AS3 - Как выразить разницу между двумя координатами xy в виде числа от 0 до 1? - PullRequest
0 голосов
/ 08 ноября 2010

Я создал класс ролик-ролика и аниматора, который анимирует видеоклипы вдоль набора точек x, y.Я использовал TweenMax Гринсока для выполнения анимации и установил скорость в 1 секунду между каждой точкой.Проблема в том, что когда расстояние между двумя точками мало, оно выглядит слишком медленным.

Что я хотел бы сделать, так это как-то вычислить расстояние между двумя точками и вывести скорость в диапазоне от 0 до 1 секундытак что скорость должна быть правильной для более коротких расстояний, а также для более длинных расстояний.

Любая помощь или совет будет принята с благодарностью.

Спасибо,

eb_dev

Ответы [ 3 ]

1 голос
/ 08 ноября 2010

Я думаю, вам нужна минимальная скорость для меньшего расстояния.

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);

для большого расстояния 1,0 <расстояние / MIN_SPEED, а продолжительность будет установлена ​​на 1,0 [сек]для небольшого расстояния 1,0> расстояние / MIN_SPEED, и длительность будет установлена ​​для движения с некоторой скоростью, определенной MIN_SPEED.

1 голос
/ 08 ноября 2010

Я второй, что Матти сказал, но это можно сделать быстрее - за 48–64 бит (примерно столько !!!)

var dX:Number = x1 - x2;
var dY:Number = y1 - y2;
var dist:Number = Math.sqrt(dX * dX + dY * dY);
var animTime = dist / state.stageWidth;

И объяснить, что по запросу eb Dev квадратный корень является частью теоремы Пифагора:

a^2 + b^2 = c^2

Линии на осях X и Y можно рассматривать как две ветви прямоугольного треугольника, и поэтому гипотенуза будет расстоянием между двумя конкретными точками (которые нам нужны).

Сначала вычитаем точки (x1 - x2, y1 - y2). У нас все еще есть две точки, однако прямоугольная часть треугольника теперь находится в 0, 0 - точке пересечения осей X и Y. Чтобы можно было применить это к теореме Пифагора, давайте посмотрим, какие размеры будут a и b - длина ноги a - это расстояние между 0, 0 и точкой 1. Вычитание 0, 0 все равно оставит нас с точкой 1 - однако мы знаем, что это будет где-то на оси X - поэтому его Y будет 0. Мы можем сказать, что длина a равна X части пункта 1.

То же самое относится к b ноге и точке 2. На этот раз, однако, мы получаем только часть Y.

И для вычисления c мы сначала суммируем вторые степени a и b (a ^ 2 + b ^ 2). Теперь у нас есть c ^ ​​2, поэтому, чтобы получить c - гипотенузу, мы рассчитаем его квадратный корень (то есть Math.sqrt () в AS3.0).

c - это расстояние.

Надеюсь, это объясняет это.

1 голос
/ 08 ноября 2010

То, что вы хотите сделать, это рассчитать расстояние между двумя точками и иметь время относительно этого. Как именно вы определяете отношение, зависит. Это анимация за одну секунду, когда предмет перемещается с одного конца сцены на другой или что-то еще. Это будет ваша базовая линия, и все анимации будут относиться к ней.

Итак, скажем, анимация по всей ширине сцены составляет одну секунду, и все, что короче, относится к этой одной секунде.

dist = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
animTime = dist / state.stageWidth;

UPDATE: Math.sqrt просто берет квадратный корень из разницы между точками. Вам не обязательно делать это, так как вас интересует только расстояние относительно размера сцены, а не фактическое расстояние. Причина этого в том, чтобы вернуть расстояние в том же масштабе, что и stage.stageSize. Обратите внимание, что (x1-x2)*(x1-x2) возводит в квадрат расстояние между x1 и x2 координатами, т.е. равно Math.pow(x1-x2,2).

...