Основной триг: math.atan () проблема - PullRequest
5 голосов
/ 09 марта 2012

У меня небольшая проблема с некоторыми базовыми триггерами.Я делаю некоторую домашнюю работу по математике, и мне наконец надоело преобразовывать прямоугольные координаты в полярные и наоборот, поэтому я решил создать небольшую программу на Python, чтобы помочь мне с преобразованиями.Однако Math.atan () доставляет мне небольшие неприятности.Вот код:

def rect_to_polar_input(x, y):
    hypotenuse = math.sqrt((x * x) + (y * y))
    tangent = float(y / x);
    angle = round(math.degrees(math.atan(tangent)));

    if x <= 0:
        if(y >=0):
            angle += 90

        if(y <= 0):
            angle+= 180

    if x >= 0:
        if(y<0):
            angle+=270

    return hypotenuse, angle

Если вам интересно, почему у меня есть эти неуклюжие операторы if, нужно добавить правильный угол для квадранта, в котором находятся прямоугольные координаты. Квадрант 2 равен 90градусов от квадранта 1, а квадрант 3 - на 180 градусов от квадранта 1 и т. д.

Теперь, если я введу значение типа (5, 5), все будет работать, как и ожидалось.Однако, если я введу (-5, 5), я получу значение 7.07, 45, где я должен получить 7.07, 135.Если я введу (-5, -5), я получу значение 7.07, 225, что ожидается.Наконец, если я введу значение (5, -5), я все равно получу значение 7.07, 225.Я перепробовал все, что мог придумать, но это не работает.Итак, что мне не хватает?

1 Ответ

13 голосов
/ 09 марта 2012

Вы должны использовать atan2 для этого.Он работает с квадрантами именно так, как вам нужно.Например:

def rect_to_polar_input(x, y):
    hypotenuse = math.hypot(x, y)
    angle = round(math.degrees(math.atan2(y, x)))
    if angle<0:
        angle += 360
    return hypotenuse, angle

Оператор if имеет дело с тем фактом, что вы хотите получить результаты в диапазоне 0..360, но atan2 дает углы в диапазоне -180..180.

Вы можете сделать это с помощью atan, используя базовый подход, который вы выбрали, но вы еще не совсем отладили его.В любом случае, для этого все используют atan2.

Кроме того, вы также можете использовать hypot вместо того, чтобы бросать свои собственные.

...