Как повернуть вектор без погрешности? Есть следующие элементы:
Вектор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, то погрешность увеличивается.
Подскажите, пожалуйста, в чём причина и как избавиться от этой ошибки? Может быть стоит использовать другой способ поворота координаты? Какой?

21 Авг 2019 в 06:16
173 +1
0
Ответы
1

Проблема возникает из-за того, что при каждом повороте вектора, вы используете новые значения a.x и a.y, которые были изменены предыдущим поворотом, а не оригинальные значения. Для сохранения точности вам нужно использовать временные переменные для вычисления новых значений a.x и a.y.
Вот исправленный код функции поворота:

function rotateangleangleangle {
var newX = a.x * Math.cosangleangleangle - a.y * Math.sinangleangleangle;
var newY = a.x * Math.sinangleangleangle + a.y * Math.cosangleangleangle;
a.x = newX;
a.y = newY;
}

Таким образом, вы сохраняете оригинальные значения и избегаете потери точности при повороте вектора.

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

function rotateangleangleangle {
var cos = Math.cosangleangleangle;
var sin = Math.sinangleangleangle;
var newX = a.x * cos - a.y * sin;
var newY = a.x * sin + a.y * cos;
a.x = newX;
a.y = newY;
}

Этот способ также позволяет избежать потери точности при повороте вектора.

20 Апр 2024 в 13:21
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир