Есть следующие элементы:
Вектор
a = {x: 1, y: 0}
Функция поворота координаты
function rotate(angle) {
a.x = a.x * Math.cos(angle) - a.y * Math.sin(angle);
a.y = a.x * Math.sin(angle) + a.y * Math.cos(angle);
}
Которая вызывается такая образом
rotate(1 * Math.PI / 180);
Проблема в том, что с каждым поворотом теряется точность. Это можно обнаружить если проверить длину вектора.
Math.sqrt( Math.pow(a.x, 2) + Math.pow(a.y, 2) )
Изначально длина равна 1
через 10 вызовов - 0.9999671067997294
через 100 - 0.9831222411821932
И так дальше. При чём если увеличить угол поворота при вызове rotate, то погрешность увеличивается.
Подскажите, пожалуйста, в чём причина и как избавиться от этой ошибки? Может быть стоит использовать другой способ поворота координаты? Какой?