Saya mengalami kesulitan memahami Math.tan()
dan Math.atan()
dan Math.atan2()
.
Saya memiliki pengetahuan dasar tentang trigonetri tetapi penggunaan SIN, COS, dan TAN dll untuk pengembangan game sangat baru bagi saya.
Saya membaca beberapa tutorial dan saya melihat bahwa dengan menggunakan garis singgung kita bisa mendapatkan sudut di mana satu objek perlu diputar oleh berapa banyak untuk menghadapi objek lain misalnya mouse saya. Jadi mengapa kita masih perlu menggunakan atan atau atan2?
mathematics
SutoL
sumber
sumber
Jawaban:
Rumus singgung adalah ini:
tan(angle) = opposite/adjacent
Lihat gambar ini:
Di mana
a
sisi yang berdekatan,o
adalah sisi yang berlawanan dantheta
sudut. Demikian pula, sinus dan cosinus adalah dosa (ang) = o / h dan cos (ang) = a / h di manah
sisi yang panjang: http://www.mathwords.com/s/sohcahtoa.htmSementara itu
atan
(kependekan dari arc-tangent , juga dikenal sebagai invers tangent ) adalah kebalikan daritan
, seperti:atan(opposite/adjacent) = angle
Dengan demikian, jika Anda mengetahui nilai-nilai dari sisi yang berlawanan dan yang berdekatan (misalnya, dengan mengurangi koordinat objek dari koordinat mouse) Anda bisa mendapatkan nilai sudut dengan
atan
.Dalam pengembangan game, hal itu dapat terjadi cukup sering bahwa sisi yang berdekatan sama dengan 0 (misalnya koordinat x dari vektor menjadi 0). Mengingat bahwa
tan(angle) = opposite/adjacent
potensi kesalahan divide-by-zero bencana harus jelas. Jadi banyak perpustakaan menawarkan fungsi yang disebutatan2
, yang memungkinkan Anda menentukan parameterx
dany
, untuk menghindari pembagian dengan nol untuk Anda dan memberikan sudut di kuadran kanan.(diagram milik Gareth, tolong pilih jawabannya juga)
Penggunaan trigonometri dalam pengembangan game cukup umum, terutama dengan vektor, tetapi biasanya perpustakaan menyembunyikan kerja trigonometri untuk Anda. Anda dapat menggunakan sin / cos / tan untuk banyak tugas yang melibatkan manipulasi geometris untuk menemukan nilai dari segitiga. Yang Anda butuhkan adalah 3 nilai (nilai panjang sisi / sudut) untuk menemukan nilai lain dari segitiga persegi panjang, jadi itu cukup berguna.
Anda bahkan dapat menggunakan sifat "bersepeda" dari fungsi sinus dan cosinus untuk perilaku khusus dalam sebuah permainan, misalnya saya telah melihat cos / sin banyak digunakan untuk membuat objek membalikkan yang lain.
sumber
sumber
Inilah cara berpikir yang sedikit berbeda tentang fungsi trigonometri - termasuk atan () dan atan2 () - yang menurut saya bermanfaat (penjelasan dalam istilah "berlawanan / berbatasan" hanya membingungkan saya untuk beberapa alasan).
Anda dapat berpindah dari satu titik ke titik lainnya dengan menggerakkan x unit secara horizontal dan y unit secara vertikal (disebut koordinat empat persegi panjang atau Cartesian ) atau dengan memindahkan jarak r pada sudut Ɵ (disebut koordinat polar dalam 2D).
Katakanlah kita memiliki koordinat polar (r, Ɵ) dan kami ingin mengubahnya menjadi (x, y).
cos (Ɵ) memberi Anda proporsi r yang terletak di sepanjang sumbu x :
Demikian juga dosa (Ɵ) memberi Anda proporsi r yang terletak di sepanjang sumbu y :
Bagaimana dengan mengubah koordinat persegi panjang (x, y) menjadi koordinat kutub (r, Ɵ)?
r adalah sisi miring dari segitiga siku-siku yang dibentuk oleh x dan y , jadi:
tan (Ɵ) memberikan kemiringan - kenaikan pada lintasan - dari garis dengan panjang r . Begitu:
Namun, ketika melakukan y / x, menghitung 3/4 memberikan jawaban yang sama dengan menghitung -3 / -4. Demikian juga -3/4 memberikan jawaban yang sama dengan 3 / -4. Jadi kita memiliki atan2 (y, x) yang menangani masing-masing tanda dengan benar dan mencegah kesalahan divide-by-zero / infinity.
sumber
Jesse dan Sid pada dasarnya benar, tetapi saya curiga Anda benar-benar memahami masalah tersebut.
Atan2 () diperlukan karena atan () tidak memberi tahu Anda sudut dari horizontal yang Anda butuhkan karena tidak mengatasi kuadran.
Ini berarti bahwa menggunakan atan untuk vektor (-2,2) dan (2, -2) akan memberikan nilai yang sama. Anda kemudian akan mengaktifkan tanda argumen Anda dan menambahkan pi ke hasilnya. Selain itu, Anda memiliki pembagian dengan nol kasus khusus untuk mempertimbangkan bahwa Jesse disebutkan. Juga atan2 () bekerja lebih baik daripada atan ketika x dekat dengan 0
Jadi Anda jika Anda ingin sudut vektor antara -pi dan pi
atau
sumber
y==0
kemudian membaginyax
di cabang lain.Saya akan mengklarifikasi beberapa hal secara ringkas. Silakan merujuk ke tutorial trigonometri online untuk penjelasan terperinci.
Biarkan sebuah sudut. Kemudian tan (a) = tan (a + 2 * pi).
atan adalah invers tan, yaitu memberi Anda sudut diberi tan. Saat Anda memanggil atan (tan (a + 2 * pi)), jawabannya adalah a. Ini tidak memadai untuk aplikasi Anda.
atan2 akan mengambil 2 argumen untuk membantu situasi yang tepat ini. atan mengambil x dan y, yang pada dasarnya adalah cos (a) dan sin (a).
atan2 (sin (a), cos (a)) = a atan2 (sin (a + 2 * pi), cos (a + 2 * pi)) = a + 2 * pi / * dosa dan cos memiliki tanda yang berbeda, mengarah untuk jawaban yang berbeda * /
Silakan temukan beberapa tutorial untuk menjelaskan mengapa demikian.
Kode Anda harus seperti ini:
sumber
tan(a) = - tan(-a)
, persamaan yang ingin Anda ungkapkan mungkintan(a) = tan(pi+a)
Satu kegunaan untuk
atan2
saya temukan dalam kode saya adalah "sudut yang ditandatangani".Biasanya cara Anda menemukan sudut antara dua vektor adalah
Tapi ini tidak memberi tahu Anda yang mana "mengarah" (yaitu "lebih maju searah jarum jam" dari yang lain). Informasi ini mungkin penting untuk pelacakan gerakan.
Anda bisa menemukan sudut dari sumbu x
(1,0)
untuk kedua vektor, tetapi ada masalah ambiguitas yang buruk: vektor dengan sudut 315 derajat mengembalikan 45 derajat menggunakancos
metode di atas, dan begitu juga sudut 45 derajat. Anda dapat melakukan tanda centangy
untuk memperbaikinya, atau Anda dapat menggunakannyaatan2
.sumber
Harap Dicatat atan tidak rusak. arctan atau tan inverse hanya fungsi antara -PI / 2 dan PI / 2. Itu mengulangi pola ini tetapi kemudian itu bukan fungsi yang merupakan masalah bagi komputer karena tidak menangani beberapa jawaban.
Ini sama untuk asin antara -PI / 2 dan PI / 2 dan acos antara 0 dan PI. Ini adalah rentang paling sederhana untuk suatu fungsi terjadi. Untuk atan dan asin, ia beralih dari yang paling negatif ke yang paling positif. Untuk ACOS dari yang paling positif ke yang paling negatif. (ini membantu interpolasi jawaban yang lebih akurat)
jadi asin, acos dan atan adalah fungsi matematika.
Namun atan2 jauh lebih berguna untuk pemrograman karena memberikan revolusi lengkap (PI dalam radian atau 360 derajat atau 400 gradian). Perhatikan mereka hanya menghasilkan satu untuk tan bukan untuk dosa atau cos. Tan adalah satu-satunya yang menggunakan horizontal dan vertikal (x, y)
sumber