Там я предполагаю, что вектор скорости ОТ 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.
Посмотрите наследующий рисунок:
Также, как видно из рисунка, тригонометрические вычисления вообще не нужны.
Вы можете просто получить компоненты 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.Это важно в случае арифметики с плавающей запятой.