Как повернуть вектор без погрешности? Есть следующие элементы:
Вектор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
154 +1
0
Ответы
1

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

function rotate(angle) {
var newX = a.x * Math.cos(angle) - a.y * Math.sin(angle);
var newY = a.x * Math.sin(angle) + a.y * Math.cos(angle);
a.x = newX;
a.y = newY;
}

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

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

function rotate(angle) {
var cos = Math.cos(angle);
var sin = Math.sin(angle);
var newX = a.x * cos - a.y * sin;
var newY = a.x * sin + a.y * cos;
a.x = newX;
a.y = newY;
}

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

20 Апр в 13:21
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 436 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир