2016-03-03 3 views
0

Я попытался реализовать в повороте JavaScript вокруг точки, используя матрицу вращения, но по какой-то причине я получил неожиданные результаты - вместо перемещения вокруг точки моя фигура двигалась вдоль линии , Здесь я предоставляю полностью воспроизводимый пример, который демонстрирует, что после изменения расстояния вращения между точкой вращения и центром изменяется. Вот он:Точность числа с плавающей запятой или алгоритмическая ошибка в JavaScript

var alpha = 0.10146071845187077; 
var cos_ = Math.cos(alpha); 
var sin_ = Math.sin(alpha); 
var center = [4861165.687852355,7606554.432771027]; 
var pointBefore = [4847712.770874163, 7610682.032298427]; 
var dist1, dist2, x1, y1, x2, y2, pointAfter = []; 
// 1. substract + 2. rotate + 3. get back 
// 1. 
x1 = pointBefore[0] - center[0]; 
y1 = pointBefore[1] - center[1]; 
// 2. 
x2 = cos_ * x1 - sin_ * y1; 
y2 = sin_ * x1 + cos_ * y1; 
// 3. 
pointAfter[0] = x2 + center[0]; 
pointAfter[1] = y2 + center[1]; 
// Check distances 
dist1 = Math.sqrt(Math.pow(x1, 2) + Math.pow(y1, 2)); 
dist2 = Math.sqrt(Math.pow(pointAfter[0] - center[0], 2) + 
     Math.pow(pointAfter[1] - center[1], 2)); 
console.log(JSON.stringify({dist1: dist1, dist2: dist2})); 
// -> {"dist1":14071.888753138577,"dist2":14071.88875313881} 

Надеюсь, я допустил некоторые ошибки в математике, но я не вижу их.

+0

Каков ожидаемый результат? И, как вы можете видеть, расстояние до того же расстояния, что и расстояние, так что вы фактически вращаетесь, а не двигаетесь по линии. – Bergi

ответ

0

Неточность связана с тем, как числа с плавающей запятой сохраняются: Is floating point math broken?

В принципе, это невозможно хранить иррациональные числа и высокой точность вещественных числа в фиксированном пространстве 64bits так будет ошибки округления, которые становятся после многих операций. Подумайте о количестве 2/3, вы не можете точно представлять его независимо от точности.

Возможное решение состоит в том, чтобы либо вычислить целые числа только по возможности, либо округлить результаты после каждой операции.

Смежные вопросы