AS3 - Y Скорость 6.123031769111886E-17 - PullRequest
       2

AS3 - Y Скорость 6.123031769111886E-17

1 голос
/ 15 сентября 2011

При задании от 0,0 до 0,5 скорость y становится этим числом и нарушает мой код. Я знаю, что я сделал что-то не так, просто скопировав и вставив код (так как я ужасно разбираюсь в математике) ..

Вот как я вычисляю числа:

var radian = Math.atan2(listOfNodes[j].y - listOfNodes[i].y,listOfNodes[j].x - listOfNodes[i].x);
var vy = Math.cos(radian);
var vx = Math.sin(radian);

Спасибо

1 Ответ

5 голосов
/ 15 сентября 2011

Там я предполагаю, что вектор скорости ОТ 0,0 ДО 0,5.И 0,0 - это i, а 0,5 - это j.

. В этом случае вектор скорости находится только вдоль y, а компонент y должен быть равен 5, а компонент x равен 0. Это происходит как противоположность, потому что

cos(radian) каков x компонент скорости и sin(radian) компонент y.

И число 6.123031769111886E-17 фактически возвращается вместо 0.

Посмотрите наследующий рисунок:
enter image description here

Также, как видно из рисунка, тригонометрические вычисления вообще не нужны.
Вы можете просто получить компоненты x и y следующим образом:

// y2 - y1
var vy = listOfNodes[j].y - listOfNodes[i].y;
// x2 - x1
var vx = listOfNodes[j].x - listOfNodes[i].x;

Это позволит избежать неточностей с плавающей запятой, вызванных триггерами, из-за которых вы видите 6.123031769111886E-17 вместо 0.
Вам нужно использовать atan2 только если вам действительно нужен уголθ в вашем коде.

Обновление: Ну, если вам нужны только единичные (нормализованные) компоненты вектора, вы можете разделить vx и vy на длину исходного вектора.Например:

// y2 - y1
var vy = listOfNodes[j].y - listOfNodes[i].y;
// x2 - x1
var vx = listOfNodes[j].x - listOfNodes[i].x;
// vector magnitude
var mag = Math.sqrt(vx * vx + vy * vy);

// get unit vector components
vy /= mag;
vx /= mag;

Используя вышеописанное, вы получите точно такие же результаты, как и функции trig sin и cos.

Но если вам все еще нужно использовать исходный код и вы хотите сравнить 6.12 ... E-17 с 0, вы можете использовать технику epsilon для сравнения чисел с плавающей запятой.Таким образом, вы можете сравнить любое значение в диапазоне epsilon от 0, используя следующий код:

function floatCompare(a:Number, b:Number, epsilon:Number):Boolean{
    return (a >= (b - epsilon) && a <= (b + epsilon));
}
// To check for zero use this code, here i'm using 0.0001 as epsilon
if(floatCompare(vx, 0, 0.0001)){
    // code here
}

Так что любое отклонение в диапазоне [b-epsilon, b+epsilon] будет успешно сравниваться с b.Это важно в случае арифметики с плавающей запятой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...