2012-07-09 22 views
10

Qual è l'inverso della funzioneinverso di math.atan2?

math.atan2 

Io uso questo in lua dove posso trovare l'inverso di math.atan da math.tan.
Ma io sono perso qui.

EDIT

OK mi permetta di dare maggiori dettagli.

avevo bisogno di calcolare l'angolo tra 2 punti (x1, y1) e (x2, y2) ho fatto

local dy = y1-y2 
    local dx = x1-x2 
    local angle = atan2(dy,dx)* 180/pi 

Ora Se ho l'angolo, è possibile tornare dy e dx?

risposta

15

Dato solo l'angolo, è possibile derivare solo un vettore unità che punta a (dx, dy). Per ottenere l'originale (dx, dy) devi conoscere anche la lunghezza del vettore (dx, dy), che chiamerò len. Devi anche convertire l'angolo che hai ricavato da gradi in radianti e quindi usare le equazioni trigtiche menzionate altrove in questo post. Cioè avete:

local dy = y1-y2 
    local dx = x1-x2 
    local angle = atan2(dy,dx) * 180/pi 
    local len = sqrt(dx*dx + dy*dy)

Dato angle (in gradi) e la lunghezza del vettore, len, è possibile derivare dx e dy da:

local theta = angle * pi/180 
    local dx = len * cos(theta) 
    local dy = len * sin(theta)
+0

Ah Grazie! Ora la risposta sembra ovvia. Mi sento un idiota! La mia matematica è TROPPO arrugginito, immagino. Grazie ancora! :) – SatheeshJM

+0

In Lua puoi usare 'math.deg' e' math.rad' per convertire tra gradi e radianti. – lhf

+0

@lhf: Grazie. Non ho mai fatto nulla a Lua, quindi ho pensato che questo approccio sarebbe stato sicuro. – andand

4

A quanto pare, qualcosa di simile a ciò contribuirà a:

x = cos(theta) 
y = sin(theta) 

semplice ricerca su Google ha gettato questo in su, e il ragazzo che ha fatto la domanda ha detto che risolto.

+0

Sì, l'ho visto anche io.Sai cosa indicano i valori xey (calcolati per sin e cos) rispetto alla mia domanda (ho aggiornato la domanda)? – SatheeshJM

+0

Assicuratevi che 'theta' sia in radianti, Il codice dato dall'OP si converte in gradi. – lhf

0

Secondo this reference:

Restituisce la tangente di y/x (in radianti), ma utilizza i segni di entrambi i parametri per trovare il quadrante del risultato. (Gestisce anche correttamente il caso di x essere pari a zero.)

Quindi credo che è possibile utilizzare per invertire math.tan anche.

1

Probabilmente otterrete i numeri sbagliati, se si uso:

Se si utilizza il sistema di coordinate in cui y diventa più grande scendendo lo bene allora si dovrebbe usare:

local dy = y1 - y2 
local dx = x2 - x1 
local angle = math.deg(math.atan2(dy, dx)) 
if (angle < 0) then 
    angle = 360 + angle 
end 

Il motivo che si desidera utilizzare questo è perché atan2 in lua vi darà un numero compreso tra -180 e 180. Sarà corretto fino a colpire 180 allora come dovrebbe andare al di là 180 (es 187) lo invertirà in un numero negativo scendendo da -180 a 0 man mano che ci si avvicina a 360. Per correggere ciò verifichiamo se l'angolo è minore di 0 e se lo è aggiungiamo 360 per darci il angolo corretto.