2012-03-08 8 views
5

Sto avendo un piccolo problema con alcuni trig di base. Sto facendo alcuni compiti di matematica, e alla fine mi sono stufato di convertire le coordinate rettangolari in coordinate polari e viceversa, così ho deciso di creare un piccolo programma Python per aiutarmi con le conversioni. Tuttavia, Math.atan() mi sta dando un piccolo problema. Ecco il codice:.Trigger di base: math.atan() problema

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 

Nel caso in cui vi state chiedendo il motivo per cui non ho quei goffi if dichiarazioni in là, è di aggiungere l'angolo corretto per il quadrante le coordinate rettangolari sono nel quadrante 2 è di 90 gradi lontano da Quadrant 1 e il quadrante 3 è di 180 gradi rispetto al quadrante 1, ecc.

Ora, se si immette un valore come (5, 5), tutto funziona come previsto. Tuttavia, se inserisco (-5, 5), ottengo il valore di 7.07, 45, dove dovrei ottenere 7.07, 135. Se inserisco (-5, -5), ottengo un valore di 7.07, 225, che è previsto. Infine, se inserisco il valore (5, -5), ottengo ancora il valore 7.07, 225. Ho provato tutto quello che riesco a pensare, ma non funziona. Quindi, cosa mi sto perdendo?

risposta

12

Per questo è necessario utilizzare atan2. Si occupa dei quadranti esattamente come è necessario. In questo 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 dichiarazione if è quello di affrontare il fatto che si desidera che i risultati nella gamma 0..360, ma atan2 dà angoli nella gamma -180..180.

È possibile eseguire questa operazione con atan utilizzando l'approccio di base che è stato eseguito, ma non è ancora stato eseguito il debug. In ogni caso, tutti usano atan2 per questo.

Inoltre, è possibile utilizzare hypot anziché eseguire il rollover.

+0

Sì, è andata così, grazie! Ci scusiamo per l'attesa. –

Problemi correlati