2012-03-08 17 views
5

Estoy teniendo un pequeño problema con algunos trigonometría básica. Estoy haciendo algunos deberes de matemáticas, y finalmente me aburrí de convertir coordenadas rectangulares a coordenadas polares y viceversa, así que decidí animar un pequeño programa de Python para ayudarme con las conversiones. Sin embargo, Math.atan() me está dando un pequeño problema. Aquí está el código:.Trig básico: Problema de 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 

En caso de que se esté preguntando por qué tengo esos if declaraciones torpes en allí, es añadir el ángulo correcto para el cuadrante de las coordenadas rectangulares están en el cuadrante 2 es de 90 grados de distancia del Cuadrante 1, y el Cuadrante 3 está a 180 grados del Cuadrante 1, etc.

Ahora, si ingreso un valor como (5, 5), todo funciona como se esperaba. Sin embargo, si ingreso (-5, 5), obtengo un valor de 7.07, 45, donde debería obtener 7.07, 135. Si ingreso (-5, -5), obtengo un valor de 7.07, 225, que se espera. Finalmente, si ingreso un valor de (5, -5), sigo obteniendo un valor de 7.07, 225. He intentado todo lo que puedo pensar, pero no está funcionando. Entonces, ¿qué me estoy perdiendo?

Respuesta

12

Debe usar atan2 para esto. Trata los cuadrantes exactamente como lo necesita. De este modo:

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 

La declaración if es lidiar con el hecho de que usted quiere resultados en el rango 0..360, pero atan2 da ángulos en el rango -180..180.

Puede hacer esto con atan utilizando el enfoque básico que ha tomado, pero aún no lo ha depurado del todo. En cualquier caso, todo el mundo usa atan2 para esto.

Además, también puede usar hypot en lugar de hacer el suyo propio.

+0

Sí, eso fue todo, gracias! Disculpas por la espera. –