Math.Atan2 дает неправильное значение при конвертации в градусы
Я пытаюсь измерить угол между двумя точками относительно оси X в градусах.
Просматривая другие сообщения о переполнении стека, я использовал следующий код:
private double GetAngleBetweenTwoPoints(double x1, double y1, double x2, double y2)
{
return Math.Atan2(y2 - y1, x2 - x1) * 180.0 / Math.PI;
}
Проблема в том, что для некоторых значений это работает нормально, но не для других. Например, передача (0, 0, 1, 1) правильно возвращает значение 45. Однако, передача в (0, 0, 2, 1) возвращает 26.565051177078, когда я ожидаю 22,5.
Что я делаю неправильно?
2 ответа
Обратная касательная 0,5 составляет 26,565 градусов, а не 22,5 градусов.
Это можно увидеть, взяв тангенс 26,565 градусов, что дает число, очень близкое к 0,5, тогда как тангенс 22,5 градусов составляет примерно 0,414.
(NB, поскольку тангенс циклический, существует бесконечное число других значений x
для которого tan x
0,5, но это не относится к этому вопросу.)
Линия половинного угла для угла в (1,1)
это биссектриса угла, который проходит через середину (1,1)
а также (sqrt(2),0)
которые оба находятся на окружности с радиусом sqrt(2)
, Таким образом, вы ищете точку (0.5+\sqrt(0.5), 0.5)
для угла 22.5°
,