sự khác biệt giữa atan
và atan2
bằng C++ là gì?sự khác biệt giữa atan và atan2 trong C++ là gì?
Trả lời
std::atan2
cho phép tính arctang của tất cả bốn phần tư. std::atan
chỉ cho phép tính toán, nếu tôi nhớ đúng, góc phần tư 1 và 4.
Với atan2 bạn có thể xác định góc phần tư như đã nêu here.
Bạn có thể sử dụng atan2 nếu bạn cần xác định góc phần tư.
atan (x) Trả về giá trị chính của tang tiếp xúc của x, tính theo radian.
atan2 (y, x) Trả về giá trị chính của tiếp tuyến cung của y/x, tính theo radian.
Lưu ý rằng do dấu hiệu mơ hồ, một hàm không thể xác định chắc chắn trong đó góc tọa độ góc chỉ rơi bởi giá trị tiếp tuyến của nó (chỉ tính riêng atan). Bạn có thể sử dụng atan2 nếu bạn cần xác định góc phần tư.
Một điều cần đề cập đến là atan2 là ổn định hơn khi tính toán tiếp tuyến sử dụng một biểu thức như atan (y/x) và x là 0 hoặc gần với 0.
Thú vị, bạn có một nguồn cho điều này? Điều này có thật nói chung hay chỉ cho C++? – Gerard
Kiểm tra http : //en.wikipedia.org/wiki/Atan2 Xem phần lịch sử và động lực – Laserallan
Xem xét một tam giác góc cạnh phải. Chúng tôi đặt tên cho đường hypotenuse r, mặt y ngang và mặt đứng x. Góc lãi suất @ là góc giữa x và r.
C++ atan2 (y, x) sẽ cho chúng ta giá trị của góc @ theo 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 sau đó để có được @ chúng tôi muốn 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! Đặc biệt là x dương và y ngụ ý góc phần tư đầu tiên, y dương và âm x, số thứ hai và vân vân. Bản thân atan hoặc atan2 đơn giản trả về một số dương hoặc số âm, không có gì hơn.
Nếu tất cả những gì bạn có là 'p = y/x' bạn vẫn có thể sử dụng' atan2 (p, 1) '. –
Từ toán học chúng ta biết rằng các 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 các góc mà chúng tôi cung cấp các chức năng. Các dấu hiệu của sin
, cos
và tan
có mối quan hệ sau (nơi chúng tôi bỏ qua bội 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à tích cực, chúng ta không thể phân biệt, cho dù góc đã từ góc phần tư thứ nhất hoặc thứ ba và nếu nó là số â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ư (ví dụ: -π/2 <= atan() <= π/2
), bất kể đầu vào ban đầu cho tang.
Để lấy lại thông tin đầy đủ, chúng tôi không được sử dụng kết quả phân chia sin(α)/cos(α)
nhưng chúng tôi phải xem xét các giá trị của sin và cosin riêng biệt. Và đây là những gì atan2()
thực hiện.Phải mất cả hai, sin(α)
và cos(α)
và giải quyết tất cả bốn 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ú: Chức năng atan2(y, x)
thực sự có một và một cuộc tranh luận y
x
, đó là dự báo của một vector có chiều dài v
và góc α
trên Y- và trục x, tức là
y = v * sin(α)
x = v * cos(α)
cung cấp 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ả định rằng đầu vào đến từ 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 chi tiết nhỏ, phạm vi '-π/2 <= atan() <= π/2' thực sự bao gồm một điểm (' pi/2') từ góc phần tư II. –
Tôi đoán câu hỏi chính sẽ cố gắng tìm ra: "khi nào tôi nên sử dụng cái này hoặc cái kia" hoặc "tôi nên sử dụng cái nào" hoặc "Tôi có đang sử dụng đúng" không?
Tôi đoán điểm quan trọng là chỉ được định nghĩa để cung cấp các giá trị dương trong đường cong hướng lên trên như vectơ khoảng cách thời gian. Cero luôn ở phía dưới bên trái, và thigs chỉ có thể đi lên và 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 cộng/trừ kết quả của nó.
atan2 được thiết kế để có nguồn gốc ở giữa và mọi thứ có thể quay trở lại hoặc xuống dưới. Đó là những gì bạn sẽ sử dụng trong một màn hình đại diện, bởi vì nó có vấn đề gì hướng bạn muốn đường cong để đi. Vì vậy, atan2 có thể cung cấp cho bạn số âm, bởi vì cero của nó là ở trung tâm, và kết quả của nó là một cái gì đó bạn có thể sử dụng để theo dõi mọi thứ theo 4 hướng.
Các giá trị thực tế là trong radian nhưng giải thích chúng theo độ nó sẽ là:
atan
= cho giá trị góc giữa -90 và 90atan2
= cho giá trị góc giữa -180 và 180
Đối với công việc của tôi liên quan đến tính toán các góc khác nhau như tiêu đề và ổ đỡ trong điều hướng, atan2
trong hầu hết các trường hợp, công việc.
Mehrwolf dưới đây là chính xác, nhưng đây là một heuristic mà có thể giúp:
Nếu bạn đang làm việc trong một hệ tọa độ 2 chiều, mà thường là trường hợp cho các lập trình nghịch đảo tang, bạn nên sử dụng chắc chắn sử dụng atan2. Nó sẽ cung cấp cho phạm vi 2 pi đầy đủ các góc và chăm sóc các số không 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.
atan2(y,x)
thường được sử dụng nếu bạn muốn chuyển đổi tọa độ lô tô thành tọa độ cực. Nó sẽ cho bạn góc, trong khi sqrt(x*x+y*y)
hoặc, nếu có, hypot(y,x)
sẽ cho bạn kích thước.
atan(x)
đơ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 x
và y
và cho x=0
để có góc chính xác.
Lưu ý:atan2(y,x)
được định nghĩa cho tất cả các giá trị thực sự của y
và x
, trừ trường hợp khi cả hai đối số là zero.
atan2 (x, y) -> atan2 (y, x) – yesraaj
Phạm vi của các giá trị nguyên tắc là '(-pi, pi]' nhưng atan2 có phạm vi '[-pi, pi] 'để nó bao gồm thêm một giá trị '-pi' từ một nhánh khác do' atan2 (-0.0, x) 'cho' x <0'. –