У меня возникли проблемы с пониманием Math.tan()
и Math.atan()
и Math.atan2()
.
У меня есть базовые знания по тригонометрии, но использование SIN, COS, TAN и т. Д. Для разработки игр является для меня совсем новым.
Я читаю некоторые учебные пособия и вижу, что, используя тангенс, мы можем получить угол, на который нужно повернуть один объект, на сколько на него обращено другое лицо, например, моя мышь. Так почему же нам все еще нужно использовать atan или atan2?
mathematics
sutoL
источник
источник
Ответы:
Касательная формула такова:
tan(angle) = opposite/adjacent
Обратитесь к этому рисунку:
Где
a
соседняя сторона,o
это противоположная сторона иtheta
это угол. Аналогично, синус и косинус - это sin (ang) = o / h, а cos (ang) = a / h гдеh
длинная сторона: http://www.mathwords.com/s/sohcahtoa.htmМежду тем
atan
(сокращение от арктангенса , также известного как обратный тангенс ) является обратнымtan
, примерно так:atan(opposite/adjacent) = angle
Таким образом, если вы знаете значения как противоположных, так и соседних сторон (например, вычитая координаты объекта из координат мыши), вы можете получить значение угла с помощью
atan
.Однако в разработке игр может случиться так, что соседняя сторона равна 0 (например, координата x вектора равна 0). Помните, что
tan(angle) = opposite/adjacent
вероятность катастрофической ошибки деления на ноль должна быть очевидной. Так много библиотек предлагают функцию с именемatan2
, которая позволяет определить какx
иy
параметры, чтобы избежать деления на ноль для вас и дать угол в правом квадранте.(диаграмма любезно предоставлена Гаретом, пожалуйста, проголосуйте и за его ответ)
Использование тригонометрии в разработке игр довольно распространено, особенно с векторами, но обычно библиотеки скрывают работу тригонометрии для вас. Вы можете использовать sin / cos / tan для множества задач, которые включают геометрические манипуляции, чтобы найти значение из треугольника. Все, что вам нужно, это 3 значения (длина стороны / угловые значения), чтобы найти другие значения прямоугольного треугольника, так что это весьма полезно.
Вы даже можете использовать "циклическую" природу функций синуса и косинуса для особого поведения в игре, например, я видел, как cos / sin много использовал, чтобы объект поворачивался вокруг другого.
источник
источник
Вот немного другой способ мышления о функциях триггера - включая atan () и atan2 () - который я считаю полезным (объяснения в терминах «противоположный / смежный» просто почему-то меня смущают).
Вы можете добраться из одной точки в другую, перемещая x единиц по горизонтали и y единиц по вертикали (так называемые прямоугольные или декартовы координаты) или перемещая расстояние r под углом Ɵ (так называемые полярные координаты в 2D).
Скажем, у нас есть полярная координата (r, Ɵ), и мы хотим преобразовать ее в (x, y).
cos (Ɵ) дает вам пропорцию r, которая лежит вдоль оси x :
Аналогично, грех (Ɵ) дает вам пропорцию r, которая лежит вдоль оси y :
Как насчет преобразования прямоугольной координаты (x, y) в полярную координату (r, Ɵ)?
r - гипотенуза прямоугольного треугольника, образованного x и y , поэтому:
tan (Ɵ) задает наклон - подъем над трассой - линии длиной r . Так:
Однако при выполнении y / x вычисление 3/4 дает тот же ответ, что и вычисление -3 / -4. Аналогично -3/4 дает тот же ответ, что и 3 / -4. Таким образом, у нас есть atan2 (y, x), который правильно обрабатывает отдельные знаки и предотвращает ошибку деления на ноль / бесконечность.
источник
Джесси и Сид в основном правы, но я подозреваю, что вы действительно разбираетесь в проблеме.
Atan2 () необходим, так как atan () не говорит вам угол от горизонтали, который вам нужен, поскольку он не справляется с квадрантами.
Это означает, что использование atan для векторов (-2,2) и (2, -2) даст одинаковое значение. Затем вы должны включить знак ваших аргументов и добавить пи к результату. Кроме того, у вас есть особый случай деления на ноль, чтобы учесть, что упоминал Джесси. Также atan2 () работает лучше, чем atan, когда x близко к 0
Так что вы, если вы хотите угол вектора между -pi и пи
или же
источник
y==0
то, чтобы потом делитьсяx
на другую ветку.Я поясню несколько вещей в сжатой форме. Пожалуйста, обратитесь к учебным пособиям по тригонометрии для подробного объяснения.
Позвольте быть угол. Тогда tan (a) = tan (a + 2 * pi).
atan - обратный загар, то есть дает угол, заданный загаром. Когда вы звоните atan (tan (a + 2 * pi)), ответ будет a. Это будет недостаточно для вашего приложения.
atan2 примет 2 аргумента, чтобы помочь этим точным ситуациям. atan принимает x и y, которые в основном являются cos (a) и sin (a).
atan2 (sin (a), cos (a)) = aan2 (sin (a + 2 * pi), cos (a + 2 * pi)) = a + 2 * pi / * sin и cos имеет разные знаки, ведущие на другой ответ * /
Пожалуйста, найдите некоторые учебники, чтобы объяснить, почему это так.
Ваш код должен быть примерно таким:
источник
tan(a) = - tan(-a)
, уравнение, которое вы хотели выразить, было возможноtan(a) = tan(pi+a)
Одно из применений, которое
atan2
я нашел в своем коде, - «угол со знаком».Обычно способ нахождения угла между двумя векторами
Но это не говорит вам, какой из них «ведет» (т. Е. Находится «дальше вперед по часовой стрелке», чем другой). Эта информация может быть важна для отслеживания жестов.
Вы можете найти угол от оси x
(1,0)
для обоих векторов, но есть одна неприятная проблема неоднозначности: вектор с углом 315 градусов возвращает 45 градусов, используяcos
метод, описанный выше, и угол 45 градусов. Вы можете сделать проверку подписи,y
чтобы исправить это, или вы можете использоватьatan2
.источник
Обратите внимание, что Атан не сломан. обратное arctan или tan является функцией только между -PI / 2 и PI / 2. Он повторяет этот шаблон, но тогда это не та функция, которая является проблемой для компьютера, поскольку он не обрабатывает несколько ответов.
Это то же самое, что и между -PI / 2 и PI / 2 и acos между 0 и PI. Это самые простые диапазоны для возникновения функции. Для атана и асина он идет от самого негативного к самому позитивному. Для acos это идет от его самого положительного до его самого отрицательного. (это помогает в интерполяции более точных ответов)
так asin, acos и atan - математические функции.
atan2, однако, гораздо более полезен для программирования, поскольку обеспечивает полный оборот (PI в радианах или 360 градусах или 400 градусах). Обратите внимание, что они произвели только один загар, а не грех или соз. Tan - единственный, который использует горизонтальный и вертикальный (x, y)
источник