2012-07-09 12 views
10

Co jest odwrotnością funkcjiodwrotność math.atan2?

math.atan2 

Używam tego w Lua gdzie mogę uzyskać odwrotność math.atan przez math.tan.
Ale jestem tutaj zagubiony.

EDIT

OK podam więcej szczegółów.

Musiałem obliczyć kąt między 2 punkty (x1, y1) i (x2, y2) zrobiłem

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

Teraz Jeśli mam kąt, jest to możliwe, aby wrócić dy oraz dx?

Odpowiedz

15

Podając tylko kąt, można wyprowadzić wektor jednostkowy wskazujący na (dx, dy). Aby uzyskać oryginalny kod (dx, dy), musisz również znać długość wektora (dx, dy), który nazwałbym len. Konieczne jest również przekształcenie uzyskanego kąta ze stopni na radiany, a następnie użycie równania triggitów wspomnianego w innym miejscu tego wpisu. Czyli masz:

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

Biorąc angle (w stopniach) oraz długość wektora, len można czerpać dx i dy przez:

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

Ah Dzięki! Teraz odpowiedź wydaje się oczywista. Czuję się jak idiota! Moja matematyka jest zbyt zardzewiała, tak myślę. Jeszcze raz dziękuję! :) – SatheeshJM

+0

W Lua możesz użyć 'math.deg' i' math.rad' do zamiany między stopniami a radiianami. – lhf

+0

@lhf: Dzięki. Nigdy nie robiłem nic w lua, więc pomyślałem, że to podejście będzie bezpieczne. – andand

4

Widocznie coś w tym pomogą:

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

Proste wyszukiwanie Google wyrzucił to do góry, a facet, który zadał pytanie powiedział, że rozwiązać go.

+0

Tak, też to widziałem.Czy wiesz, jakie wartości x i y (obliczone przez grzech i cos) wskazują w odniesieniu do mojego pytania (zaktualizowałem pytanie)? – SatheeshJM

+0

Upewnij się, że 'theta' jest w radianach. Kod podany przez OP zamienia się na stopnie. – lhf

0

Według this reference:

Zwraca arcus tangens y/x (w radianach), ale wykorzystuje znaki obu parametrów znaleźć kwadratu wyniku. (Obsługuje również poprawnie przypadek x oznacza zero.)

Więc myślę, że można użyć math.tan odwrócić go również.

1

Będziesz prawdopodobnie uzyskać niewłaściwych numerów jeśli ciebie używać:

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

Jeśli używasz układu współrzędnych, w którym Y dostaje większe zejście ekran robi się coraz większy i x przechodząc do prawo to należy użyć:

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

Powodem chcesz używać to właśnie dlatego atan2 w Lua daje liczbę pomiędzy -180 i 180. Będzie to poprawne, aż trafisz 180 potem jak powinno wykraczać poza 180 (tj 187) odwróci ją do liczby ujemnej spadającej z -180 do 0, gdy zbliżysz się do 360. Aby to poprawić, sprawdzamy, czy kąt jest mniejszy od 0, a jeśli dodamy 360, to dajemy nam poprawny kąt.

Powiązane problemy