2012-07-09 22 views
10

nghịch đảo của hàmnghịch đảo của math.atan2?

math.atan2 

tôi sử dụng này trong lua nơi tôi có thể nhận được nghịch đảo của math.atan bởi math.tan là gì.
Nhưng tôi bị lạc ở đây.

EDIT

OK tôi xin trình bày thêm chi tiết.

tôi cần phải tính toán góc giữa 2 điểm (x1, y1) và (x2, y2) tôi đã làm

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

Bây giờ Nếu tôi có góc, là nó có thể để lấy lại dy và dx?

Trả lời

15

Chỉ cho góc mà bạn chỉ có thể lấy được một vector đơn vị trỏ đến (dx, dy). Để có được bản gốc (dx, dy) bạn cũng cần phải biết chiều dài của vector (dx, dy), mà tôi sẽ gọi len. Bạn cũng phải chuyển đổi góc mà bạn bắt nguồn từ độ trở lại radian và sau đó sử dụng các phương trình trig được đề cập ở nơi khác trong bài viết này. Đó là bạn phải:

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

Với angle (ở độ) và độ dài vector, len, bạn có thể lấy được dxdy bởi:

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

Ah Cảm ơn! Bây giờ câu trả lời có vẻ hiển nhiên. Tôi cảm thấy như một thằng ngốc! Toán học của tôi là quá gỉ tôi đoán. Cảm ơn bạn một lần nữa! :) – SatheeshJM

+0

Trong Lua bạn có thể sử dụng 'math.deg' và' math.rad' để chuyển đổi giữa các độ và radian. – lhf

+0

@lhf: Cảm ơn. Tôi đã không bao giờ làm bất cứ điều gì trong lua, vì vậy tôi nghĩ rằng cách tiếp cận này sẽ được an toàn. – andand

4

Rõ ràng, một cái gì đó như thế này sẽ giúp:

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

đơn giản tìm kiếm Google đã ném này lên, và anh chàng người hỏi những câu hỏi nói nó giải quyết nó.

+0

Vâng tôi cũng thấy điều đó.Bạn có biết giá trị x và y (được tính bởi sin và cos) cho biết liên quan đến câu hỏi của tôi không (tôi đã cập nhật câu hỏi)? – SatheeshJM

+0

Hãy chắc chắn rằng 'theta' là trong radian, Mã được đưa ra bởi OP chuyển đổi thành độ. – lhf

0

Theo this reference:

Trả về tang arc của y/x (theo radian), nhưng sử dụng các dấu hiệu cả các thông số để tìm ra góc phần tư của kết quả. (Nó cũng xử lý chính xác trường hợp của x bằng không.)

Vì vậy, tôi đoán bạn có thể sử dụng math.tan để đảo ngược nó.

1

Bạn sẽ nhận được những con số sai lầm nếu bạn sử dụng:

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

Nếu bạn đang sử dụng hệ tọa độ nơi y lớn hơn xuống màn hình và x trở nên lớn hơn ngay sau đó bạn nên sử dụng:

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

Lý do bạn muốn sử dụng này là bởi vì atan2 trong lua sẽ cung cấp cho bạn một số từ -180 và 180. Nó sẽ được chính xác cho đến khi bạn nhấn 180 thì như nó phải vượt qua 180 (tức là 187) nó sẽ đảo ngược nó thành một số âm giảm từ -180 xuống 0 khi bạn tiến gần hơn đến 360. Để sửa lỗi này, chúng ta kiểm tra xem góc có nhỏ hơn 0 và nếu chúng ta thêm 360 để cung cấp cho chúng ta góc đúng.