Math atan2 là gì

Sự khác biệt giữa atan và atan2 trong C++ là gì?

std::atan2 cho phép tính arctangent của cả bốn góc phần tư. std::atan chỉ cho phép tính toán từ góc phần tư 1 và 4.

Từ toán học ở trường, chúng ta biết rằng tiếp tuyến có định nghĩa

tan(α) = sin(α) / cos(α)

và chúng tôi phân biệt giữa bốn góc phần tư dựa trên góc mà chúng tôi cung cấp cho các hàm. Dấu hiệu của sin, cos và tan có mối quan hệ sau (trong đó chúng ta bỏ qua bội số chính xác của π/2):

Quadrant Angle sin cos tan ------------------------------------------------- I 0 < α < π/2 + + + II π/2 < α < π + - - III π < α < 3π/2 - - + IV 3π/2 < α < 2π - + -

Cho rằng giá trị của tan(α) là dương, chúng ta không thể phân biệt được, góc đó là góc phần tư thứ nhất hay thứ ba và nếu nó âm, nó có thể đến từ góc phần tư thứ hai hoặc thứ tư. Vì vậy, theo quy ước, atan() trả về một góc từ góc phần tư thứ nhất hoặc thứ tư (tức là -π/2 <= atan() <= π/2), bất kể đầu vào ban đầu cho tiếp tuyến.

Để lấy lại thông tin đầy đủ, chúng tôi không được sử dụng kết quả của phép chia sin(α) / cos(α) mà chúng tôi phải xem xét riêng các giá trị của sin và cosin. Và đây là những gì atan2() làm. Phải mất cả hai, sin(α) và cos(α) và giải quyết tất cả bốn góc phần tư bằng cách thêm π vào kết quả của atan() bất cứ khi nào cosin âm.

Ghi chú : Hàm atan2(y, x) thực sự có một đối số y và x, là hình chiếu của một vectơ có độ dài v và góc α trên trục y và x, nghĩa là.

y = v * sin(α) x = v * cos(α)

cung cấp cho các mối quan hệ

y/x = tan(α)

Kết luận :atan(y/x) được giữ lại một số thông tin và chỉ có thể giả sử rằng đầu vào đến từ góc phần tư I hoặc IV. Ngược lại, atan2(y,x) lấy tất cả dữ liệu và do đó có thể giải quyết góc chính xác.

Một điều khác cần đề cập là atan2 ổn định hơn khi tính toán các tiếp tuyến sử dụng biểu thức như atan(y / x) và x là 0 hoặc gần bằng 0.

Các giá trị thực tế được tính bằng radian nhưng để giải thích chúng theo độ sẽ là:

  • atan = đưa ra giá trị góc trong khoảng từ -90 đến 90
  • atan2 = đưa ra giá trị góc giữa -180 và 180

Đối với công việc của tôi liên quan đến việc tính toán các góc độ khác nhau như tiêu đề và khả năng điều hướng, atan2 trong hầu hết các trường hợp thực hiện công việc.

atan (x) Trả về giá trị chính của tiếp tuyến cung của x, được biểu thị bằng radian.

atan2 (y, x) Trả về giá trị chính của tiếp tuyến cung của y/x, được biểu thị bằng radian.

Lưu ý rằng do sự không rõ ràng của dấu hiệu, một hàm không thể xác định chắc chắn trong đó góc phần tư chỉ rơi bởi giá trị tiếp tuyến của nó (một mình atan). Bạn có thể sử dụng atan2 nếu bạn cần xác định góc phần tư.

Tôi đoán câu hỏi chính cố gắng tìm ra: "khi nào tôi nên sử dụng cái này hay cái kia", hay "tôi nên sử dụng cái nào" hay "Tôi có nên sử dụng đúng không"?

Tôi đoán rằng điểm quan trọng là atan chỉ nhằm mục đích cung cấp các giá trị dương theo đường cong hướng lên phải như đối với các vectơ khoảng cách thời gian. Cero luôn ở phía dưới bên trái, và những người chơi chỉ có thể đi lên và sang phải, chỉ chậm hơn hoặc nhanh hơn. atan không trả về số âm, vì vậy bạn không thể theo dõi mọi thứ theo 4 hướng trên màn hình chỉ bằng cách thêm/bớt kết quả của nó.

atan2 được dự định cho Nguồn gốc ở giữa và mọi thứ có thể đi lùi hoặc xuống. Đó là những gì bạn sử dụng trong một đại diện màn hình, bởi vì nó không quan trọng bạn muốn đường cong đi theo hướng nào. Vì vậy, atan2 có thể cung cấp cho bạn các số âm, vì cero của nó nằm ở trung tâm và kết quả của nó là thứ bạn có thể sử dụng để theo dõi mọi thứ theo 4 hướng.

Với atan2, bạn có thể xác định góc phần tư như đã nêu tại đây .

Bạn có thể sử dụng atan2 nếu bạn cần xác định góc phần tư.

Xét một tam giác góc vuông. Chúng tôi dán nhãn hypotenuse r, mặt ngang y và mặt đứng x. Góc quan tâm @ là góc giữa x và r.

c ++ atan2 (y, x) sẽ cho chúng ta giá trị của góc @ tính bằng radian . atan được sử dụng nếu chúng ta chỉ biết hoặc quan tâm đến y/x chứ không phải y và x riêng lẻ. Vì vậy, nếu p = y/x Thì để có được @ chúng tôi sẽ sử dụng atan (p).

Bạn không thể sử dụng atan2 để xác định góc phần tư, bạn chỉ có thể sử dụng atan2 nếu bạn đã biết góc phần tư của bạn trong! Cụ thể là dương x và y ngụ ý góc phần tư thứ nhất, y dương và âm x, thứ hai, v.v. atan hoặc atan2 chỉ đơn giản là trả về một số dương hoặc một số âm, không có gì hơn. 

atan2(y,x) thường được sử dụng nếu bạn muốn chuyển đổi tọa độ cartesian sang tọa độ cực. Nó sẽ cung cấp cho bạn góc, trong khi sqrt(x*x+y*y) hoặc, nếu có, hypot(y,x) sẽ cung cấp cho bạn kích thước.

atan(x) chỉ đơn giản là nghịch đảo của tan. Trong trường hợp khó chịu, bạn phải sử dụng atan(y/x) vì hệ thống của bạn không cung cấp atan2, bạn sẽ phải thực hiện kiểm tra bổ sung cho các dấu hiệu của x và y và cho x=0, để có được góc chính xác.

Lưu ý: atan2(y,x) được xác định cho tất cả các giá trị thực của y và x, ngoại trừ trường hợp khi cả hai đối số đều bằng không.

Mehrwolf dưới đây là chính xác, nhưng đây là một heuristic có thể giúp:

Nếu bạn đang làm việc trong một hệ tọa độ 2 chiều, thường là trường hợp để lập trình tiếp tuyến nghịch đảo, bạn nên sử dụng chắc chắn sử dụng atan2. Nó sẽ cung cấp phạm vi 2 góc đầy đủ và chăm sóc các số 0 trong tọa độ x cho bạn.

Một cách khác để nói điều này là atan (y/x) hầu như luôn luôn sai. Chỉ sử dụng atan nếu đối số không thể được coi là y/x.