SerafimArts
@SerafimArts
Senior Notepad Reader

Как решить проблему поворота вектора в сторону заданных координат?

Доброго времени суток. Существует простенький алгоритм нахождения угла поворота вектора в сторону заданных координат:

// class Unit

lookTo(x, y) {
        return Math.atan2(y - this.position.y, x - this.position.x);
}


Высчитывается всё верно, но проблема в том, что требуется находить угол минимальный между текущим и конечным. Например дельта угла поворота между 3.14 (налево) и -3.14 (так же налево) - PI * 2, хотя по факту между PI и -PI дельта нулевая - это один и тот же угол поворота. Так же как между PI и -2.14 дельта 5.14, хотя в реальности она равна 1.

Из-за этой проблемы объекты при повороте к заданным координатам (в случае анимации, например) делают полный оборот вокруг своей оси, вместо небольшого поворота.

Гуглёж помог лишь в получении информации в какую сторону нужно вращать объект:
ccw(x, y) {
    return this.position.x * y - this.position.y * x;
}


Но как то это не слишком помогает в решении проблемы.

Можете пожалуйста предложить решение этой задачи или ключевые слова в гугле, с помощью которых я могу найти способ решения или мысль для решения задачи? Спасибо.
  • Вопрос задан
  • 421 просмотр
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
sin(x^y) = x×y / (|x|·|y|)       (1-й курс института, но легко выводится и самостоятельно)
cos(x^y) = (xy) / (|x|·|y|)      (школа)

x, y — векторы в 2D
x^y — угол между векторами
x×y — косое произведение векторов
(xy) — скалярное произведение векторов
|x| — евклидова длина (модуль, 2-норма) вектора

Отсюда x^y = atan2( (xy), x×y ).
Возможно, где-то упустил знак и у меня получился не x^y, а y^x.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Комментировать
@abcd0x00
Но как то это не слишком помогает в решении проблемы.

Так а в чём проблема?
Угол лежит в промежутке от 0 до Пи. Если угол получился больше Пи, нужно взять оставшуюся часть и поменять у неё знак.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы