Перейти к содержимому

Уроки · 59

Угол вектора

В уроке «Расстояние» мы по x и y вектора считали его длину. А в уроке «Вращение» — наоборот: по углу через cos и sin получали x и y. Остался последний вопрос: а если угол как раз и нужен, а есть только x и y — как его найти?

Для этого в Rust есть функция, обратная cos и sin сразу — она называется atan2 и принимает y и x, а возвращает угол между ними, в радианах — той же единице, что уже встречалась в уроке «Вращение». Вызывается она как метод, тем же способом, что и в уроке «Методы»: сначала y, потом точка, потом atan2, а x — уже в скобках.

// Угол вектора (dx, dy) — в радианах.
let angle = dy.atan2(dx);

Порядок важен: первым идёт именно y, вторым — x, хотя кажется, что должно быть наоборот. Перепутал местами — получишь совсем другой угол.

Есть и обычный арктангенс, atan, но ему хватает только одного числа, отношения y к x — а значит, он не отличает противоположные направления: что вправо-вверх, что влево-вниз, отношение одно и то же. atan2 берёт y и x отдельно и сам разбирается, в какую сторону смотрит вектор, так что путаницы не будет.

(9, -6)

x = 9, y = -6 → angle = -0.59 рад (≈ -34°)

Тяни серый вектор за кончик мышью — угол под ним пересчитывается сразу по x и y. Кнопка ниже проверяет результат в обратную сторону: берёт этот самый угол и через cos/sin строит по нему вектор заново — зелёная точка должна лечь ровно на кончик серого.

  • dy.atan2(dx) — угол вектора (dx, dy), обратная функция к cos/sin из урока «Вращение»: там по углу находили x и y, здесь по x и y находим угол.
  • Результат — в радианах, от -π до π (это от −180° до 180°): вектор, направленный влево, даёт угол, близкий к границе этого промежутка, а не отрицательное число за пределами полного круга.
  • Если у вектора x и y получены через cos(angle) и sin(angle), то dy.atan2(dx) вернёт обратно тот же самый angle — ровно это и проверяет кнопка в демке.
  • Длина вектора на угол не влияет: atan2 смотрит только на направление, а не на то, насколько далеко вектор тянется.