Уроки · 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 отдельно и сам разбирается, в какую сторону
смотрит вектор, так что путаницы не будет.
Попробуй сам
Заголовок раздела «Попробуй сам»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смотрит только на направление, а не на то, насколько далеко вектор тянется.