Mengapa radian lebih disukai daripada derajat dalam pengembangan game?

39

Saya telah mencari definisi radian dan menemukan bahwa matematikawan lebih suka mereka karena mereka berasal dari pi daripada sepenuhnya berubah-ubah seperti derajat.

Namun, saya belum menemukan alasan kuat untuk menggunakannya dalam pengembangan game, mungkin karena kurangnya pemahaman matematis terkait saya. Saya tahu bahwa sebagian besar fungsi sin / cos / tan dalam bahasa apa radian, tetapi seseorang juga bisa membuat fungsi perpustakaan dalam derajat (dan menghindari kesalahan pembulatan yang melekat saat menggunakan pi).

Saya tidak ingin ini menjadi jajak pendapat, saya hanya ingin mendengar dari orang-orang yang telah melakukan pengembangan game (dan penelitian matematika yang terkait) di mana radian menawarkan pengalaman yang unggul lebih dari derajat, sebagai lawan dari "Kami menggunakan radian karena kami selalu menggunakannya ", hanya untuk membantu saya (dan mungkin orang lain) untuk memahami apa manfaatnya.

Michael Stum
sumber
2
Salah satu jawabannya adalah mereka lebih cepat. Anda tidak perlu menyembunyikan derajat ke radian sebelum menggunakannya dalam fungsi seperti dosa. Saya harus lebih spesifik dan mengatakan bahwa salah satu metode perhitungan sin (x) menggunakan ekspansi Taylor - dan "x" harus dalam radian untuk ekspansi.
user3728501

Jawaban:

49

Radian digunakan dalam matematika karena

  1. Mereka mengukur panjang busur pada lingkaran, yaitu busur sudut theta pada lingkaran jari-jari r hanya r * theta (berlawanan dengan pi / 180 * r * theta).
  2. Ketika fungsi trigonometri didefinisikan dalam istilah radian, mereka mematuhi hubungan yang lebih sederhana antara satu sama lain, seperti cosinus yang merupakan turunan dari sinus, atau sin (x) ~ = x untuk x kecil. Jika didefinisikan dalam derajat, turunan dari sinus adalah pi / 180 * cosinus, dan kita akan memiliki dosa (x) ~ = pi / 180 * x untuk x kecil.

Bukannya ahli matematika seperti pi. Radian sebenarnya merupakan pilihan ukuran sudut yang lebih alami daripada derajat, karena alasan di atas. Mereka adalah ukuran sudut di mana faktor-faktor seperti pi / 180 menghilang.

Jadi IMO, pertanyaannya bukan "mengapa menggunakan radian", tetapi "mengapa tidak menggunakan radian". Dengan kata lain, orang tidak perlu alasan untuk menggunakan radian; mereka adalah pilihan standar ukuran sudut. Seseorang perlu alasan untuk menggunakan derajat. Misalnya seseorang dapat memilih untuk menunjukkan sudut dalam derajat di antarmuka pengguna aplikasi, karena mereka lebih akrab bagi banyak orang (terutama artis). Namun, secara pribadi saya sudah terbiasa berpikir tentang sudut dalam hal radian daripada derajat.

Saya tidak punya contoh gamedev spesifik untuk memberi Anda karena ini bukan masalah gamedev, tetapi yang matematika, dan akan sama di bidang apa pun yang menggunakan matematika.

(Omong-omong, tidak ada lagi "kesalahan pembulatan inheren saat menggunakan pi" daripada ketika menggunakan derajat ... sudut harus selalu berupa bilangan real, bukan bilangan bulat, kalau tidak, bagaimana Anda akan mewakili sudut setengah derajat? :) )

Nathan Reed
sumber
4
Setuju dengan di atas. Saya akan menambahkan bahwa saya pernah melihat perpustakaan permainan yang menggunakan standar sendiri, berdasarkan 256 per lingkaran. Alasannya tampaknya karena fungsi trigonometri mereka menggunakan tabel pencarian dengan 256 entri dan diinterpolasi di antara mereka. Jika Anda tidak melakukan itu, tetapi menghitung sin / cos / tan dari ekspansi seri mereka, atau menggunakan instruksi FSIN / FCOS pada FPU (paling umum), keduanya akan mengharapkan input dalam radian - sehingga Anda menyimpan konversi dengan menjaga itu dalam radian di seluruh.
DMGregory
11
"mengapa tidak menggunakan radian" - Saya berani bertaruh satu-satunya jawaban yang bagus adalah "karena pekerjaan rumah kelas 4 akan menjadi mimpi buruk dengan radian" yang mungkin satu-satunya alasan mengapa kita semua pernah mendengar gelar. :)
Sean Middleditch
5
@SeanMiddleditch kelas 4 kelas harus bermigrasi ke Tau . Tau adalah versi radian dari 360. Ini merampingkan matematika dan profesional juga harus mulai mengadopsinya.
Val
2
256 per lingkaran atau 16384 per lingkaran berarti Anda dapat menggunakan byte atau angka 16bit yang tidak ditandai masing-masing, dan overflows / underflow untuk menambah / mengurangi melakukan hal yang benar. Dengan radian, Anda mungkin berakhir menggunakan floating point, yang berarti Anda mendapatkan lebih banyak presisi semakin dekat sudut Anda ke nol, dan semakin sedikit ketika bergerak menjauh, yang agak tidak berguna / konyol sebagian besar waktu.
rjmunro
2
@ Val: Tau tidak menyelesaikan masalah derajat yang sama. Derajat memudahkan mengukur sudut yang relatif kecil dengan angka integral. Ini penting ketika mencoba mengajarkan geometri awal ketika siswa masih melakukan semuanya dengan tangan dan tidak begitu nyaman dengan pecahan. Pertimbangkan masalah "sudut jarum jam" yang biasa diberikan siswa dan bagaimana mereka dengan rapi memetakan ke derajat tetapi tidak pada radian Pi / Tau. Ini mirip dengan alasan derajat pada satu titik populer di permainan: menggunakan tabel derajat pencarian lebih mudah / lebih cepat (saat itu) dan memberikan resolusi "cukup baik" untuk kebutuhan mereka.
Sean Middleditch
4

Jawaban Nathan sangat konkret. Saya ingin memberikan pandangan yang lebih umum:

Konsep matematika yang paling kompleks yang diterapkan secara asli di sebagian besar unit pemrosesan adalah angka floating point sebagai model untuk bidang bilangan real ℝ. Geometri visual didasarkan pada ruang vektor nyata tiga dimensi ℝ³. Koordinat adalah bilangan real. Kuantitas geometrik didasarkan pada panjang , yang merupakan kelipatan nyata dari suatu unit.

Karena basis ini dalam bilangan real dan panjang, praktis untuk juga memodelkan sudut dengan bilangan real resp. panjangnya. Radian adalah panjang dari busur lingkaran satuan dengan sudut yang diberikan. Jadi ini adalah model sudut yang paling kompatibel dengan semua unit lainnya berdasarkan pada bilangan real resp. panjangnya. Misalnya, aproksimasi sin x ~ x untuk nilai x yang kecil adalah aproksimasi koordinat y dari suatu titik pada lingkaran satuan oleh busur dari sumbu x ke titik itu.

Kita tidak boleh lupa, bahwa sudut adalah tidak panjang a. Ini adalah salah satu dari 4 bagian pesawat yang dibuat oleh dua garis lurus berpotongan. Kuantitasnya dibatasi oleh simetri bidang-bidang dalam ℝ³ dan metrik euclidean.

Adalah lebih alami untuk memodelkan sudut dengan interval semiopen [0,1) (atau (0,1)) direkatkan pada titik akhirnya, diberi nilai sudut sebagai bagian dari putaran penuh. Derajat hanya 1 / 360 putaran penuh. (BTW: Angka secara teoritis, ini adalah pilihan yang lebih baik daripada sistem desimal yang digunakan untuk bilangan real.)

Toscho
sumber
0

Sementara saya menggunakan radian juga, untuk semua alasan yang ditentukan, setidaknya ada satu alasan bagus mengapa derajat lebih disukai: Presisi dan akumulasi kesalahan. Berputar melalui lingkaran penuh 1 derajat pada suatu waktu adalah tepat. Berputar melalui lingkaran penuh 2PI / 360 radian pada suatu waktu tidak. Melakukan rotasi 90 derajat 4 kali pada kisi-kisi piksel membuat Anda kembali ke titik awal Anda. Melakukan rotasi radian 2PI / 4 pada pixel grid 4 kali tidak.

ddyer
sumber
Menguji ini secara empiris, setelah empat rotasi 90 derajat dengan kenaikan float presisi tunggal di radian, saya menemukan kesalahan total 1,75E-7 (kurang dari 1 bagian dalam 5 juta). Pada kisi-kisi piksel, jari-jari objek / bingkai yang berputar harus berada dalam jutaan piksel sebelum Anda akan mengalami 1 piksel kesalahan di tepi luar (satu titik lebih dari 0,5 linear px dari tempat seharusnya). Dengan kata lain, kehilangan presisi tidak mungkin menjadi masalah dalam praktik (terutama jika Anda menggunakan ganda).
DMGregory
Dari perspektif numerik Anda benar, tetapi dari perspektif visual jika SATU piksel dari hard edge muncul ke nilai yang salah, Anda kacau.
ddyer
Lihat catatan "jutaan piksel" di atas. Untuk sprite dengan ukuran tipikal (katakanlah, pada urutan 2048 piksel lebar, atau lebih kecil) kesalahannya akan secara substansial kurang dari setengah piksel, dan karenanya akan terhapus oleh pembulatan inheren dari grid piksel itu sendiri. Juga, perhatikan bahwa memutar 360/7 derajat sekaligus akan mengakumulasi kesalahan yang sama. Anda dapat menghilangkan kesalahan pembulatan dengan kedua sistem dengan tetap berpegang pada peningkatan yang dapat direpresentasikan sebagai jumlah kekuatan dua (dengan beberapa batasan pada rentang eksponen), tetapi mungkin lebih mudah untuk mengubah kode yang tidak mengakumulasi banyak penambahan kecil.
DMGregory
@ DMGregory Itulah yang saya maksud dengan "kesalahan pembulatan bawaan dengan Pi". Pilihan lainnya adalah tidak menggunakan tunggal / ganda tetapi cara untuk merepresentasikan angka sebagai faktor (jadi mewakili 2 * pi / 360 bukan sebagai hasil perhitungan tetapi sebagai rumus itu) dan hanya menghitung hasilnya saat dibutuhkan. Saya tidak tahu apakah ada program "nyata" yang melakukannya, tetapi hal-hal seperti Mathematica selalu dapat mewakili "1/3" sebagai "1/3" bukannya "0,333333 .....". Tetapi setelah melalui angka-angka saya kira Anda benar, kesalahan pembulatan ada tetapi tidak signifikan
Michael Stum
2
Sudut 1 derajat mungkin lebih mudah untuk diwakili secara akurat dalam derajat daripada di radian, memutar objek tidak tepat dengan cara apa pun, karena memerlukan fungsi trigonometri. cos 1 ° adalah subjek kesalahan pembulatan sebanyak pi / 180 .
Marcks Thomas
-3

Mari kita sepakat, bahwa lebih baik untuk memilih dan tetap menggunakannya daripada menggunakan dua definisi dan sedikit menebak yang mana dari mereka yang diperlukan untuk fungsi saat ini. Maka menggunakan panjang busur lebih alami untuk penerapan dosa dan cos yang mungkin menjadi alasan cmath untuk mengimplementasikannya seperti itu. Karena game sering ditulis dalam C ++ atau C dan sudah ada dosa dan cos diimplementasikan, masuk akal untuk tetap berpegang pada definisi itu.

[Persetan dengan Anda sebelumnya]

Arne
sumber
Ini tidak benar-benar menjawab pertanyaan. Apakah Anda bermaksud mengomentari jawaban lain?
Josh