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°,

Другие вопросы по тегам