Diketahui 2 sudut dalam rentang -PI -> PI di sekitar koordinat, berapakah nilai terkecil dari 2 sudut di antara keduanya?
Memperhatikan bahwa perbedaan antara PI dan -PI bukanlah 2 PI melainkan nol.
Contoh:
Bayangkan sebuah lingkaran, dengan 2 garis keluar dari tengah, ada 2 sudut di antara garis-garis itu, sudut yang dibuat di dalam alias sudut yang lebih kecil , dan sudut yang dibuat di luar alias sudut yang lebih besar. Kedua sudut jika dijumlahkan membuat lingkaran penuh. Mengingat bahwa setiap sudut bisa muat dalam kisaran tertentu, berapa nilai sudut yang lebih kecil, dengan mempertimbangkan rollover
language-agnostic
geometry
angle
Tom J Nowell
sumber
sumber
Jawaban:
Ini memberikan sudut yang ditandatangani untuk setiap sudut:
Hati-hati dalam banyak bahasa,
modulo
operasi mengembalikan nilai dengan tanda yang sama dengan dividen (seperti C, C ++, C #, JavaScript, daftar lengkap di sini ). Ini membutuhkanmod
fungsi khusus seperti:Atau lebih:
Jika sudut berada dalam [-180, 180] ini juga berfungsi:
Dengan cara yang lebih bertele-tele:
sumber
a -= 360*sgn(a)*(abs(a) > 180)
. (Kalau dipikir-pikir, jika Anda memiliki implementasi tanpa cabang darisgn
danabs
, maka karakteristik itu mungkin benar-benar mulai mengimbangi kebutuhan dua perkalian.)double targetA = 2; double sourceA = 359;
'a' akan sama dengan -357.0, bukan 3.0x adalah sudut target. y adalah sumber atau sudut awal:
Ini mengembalikan sudut delta yang ditandatangani. Perhatikan bahwa bergantung pada API Anda, urutan parameter untuk fungsi atan2 () mungkin berbeda.
sumber
x-y
memberi Anda perbedaan sudut, tetapi mungkin di luar batas yang diinginkan. Pikirkan sudut ini yang menentukan titik pada lingkaran satuan. Koordinat titik itu adalah(cos(x-y), sin(x-y))
.atan2
mengembalikan sudut untuk titik itu (yang setara denganx-y
) kecuali rentangnya adalah [-PI, PI].Jika kedua sudut Anda adalah x dan y, maka salah satu sudut di antaranya adalah abs (x - y). Sudut lainnya adalah (2 * PI) - abs (x - y). Jadi nilai terkecil dari 2 sudut tersebut adalah:
Ini memberi Anda nilai absolut dari sudut, dan ini mengasumsikan input dinormalisasi (yaitu: dalam kisaran
[0, 2π)
).Jika Anda ingin mempertahankan tanda (yaitu: arah) dari sudut dan juga menerima sudut di luar jangkauan,
[0, 2π)
Anda dapat menggeneralisasikan hal di atas. Berikut kode Python untuk versi umum:Perhatikan bahwa
%
operator tidak berperilaku sama di semua bahasa, terutama ketika nilai negatif terlibat, jadi jika porting beberapa penyesuaian tanda mungkin diperlukan.sumber
from math import tau
.Saya menerima tantangan untuk memberikan jawaban yang ditandatangani:
sumber
Untuk pengguna UnityEngine, cara termudah adalah dengan menggunakan Mathf.DeltaAngle .
sumber
Solusi aritmatika (sebagai lawan algoritmik):
sumber
Kode efisien dalam C ++ yang berfungsi untuk semua sudut dan di kedua: radian dan derajat adalah:
sumber
Metode sederhana, yang saya gunakan di C ++ adalah:
sumber
Tidak perlu menghitung fungsi trigonometri. Kode sederhana dalam bahasa C adalah:
misalkan dif = a - b, dalam radian
biarkan dif = a - b, dalam derajat
Tanpa dosa, tanpa cos, tanpa tan, .... hanya geometri !!!!
sumber
arg = arg - PIV2;
akan meluas kearg = arg - M_PI + M_PI
, dan begitu juga tidak.