atan2(y, x)
memiliki diskontinuitas pada 180 ° di mana ia beralih ke -180 ° ..0 ° searah jarum jam.
Bagaimana cara memetakan rentang nilai ke 0 ° ..360 °?
ini kode saya:
CGSize deltaPoint = CGSizeMake(endPoint.x - startPoint.x, endPoint.y - startPoint.y);
float swipeBearing = atan2f(deltaPoint.height, deltaPoint.width);
Saya sedang menghitung arah acara sentuh menggesek yang diberikan startPoint
dan endPoint
, kedua struktur titik XY. Kode untuk iPhone tetapi bahasa apa pun yang mendukung atan2f()
akan dilakukan.
Jawaban:
sumber
(x >= 0 ? x : (2*PI + x)) * 180/PI
seperti di(x < 0 ? 2*PI + x : x) * 180/PI
Solusi menggunakan Modulo
Solusi sederhana yang menangkap semua kasus.
Penjelasan
Positif: 1 hingga 180
Jika Anda memodifikasi bilangan positif antara 1 dan 180 x 360, Anda akan mendapatkan angka yang sama persis dengan yang Anda masukkan. Mod di sini hanya memastikan bilangan positif ini dikembalikan sebagai nilai yang sama.
Negatif: -180 hingga -1
Menggunakan mod di sini akan mengembalikan nilai dalam kisaran 180 dan 359 derajat.
Kasus khusus: 0 dan 360
Menggunakan mod berarti 0 dikembalikan, menjadikannya solusi 0-359 derajat yang aman.
sumber
-1 % 360 = -1
Tambahkan saja 360 ° jika jawaban dari atan2 kurang dari 0 °.
sumber
Atau jika Anda tidak suka bercabang, cukup negasikan kedua parameter tersebut dan tambahkan 180 ° ke jawabannya.
(Menambahkan 180 ° ke nilai kembali akan menempatkannya dengan baik dalam kisaran 0-360, tetapi membalik sudutnya. Meniadakan kedua parameter masukan akan membalikkannya kembali.)
sumber
@erikkallen sudah dekat tetapi kurang tepat.
Ini seharusnya berfungsi di C ++: (bergantung pada bagaimana fmod diimplementasikan, ini mungkin lebih cepat atau lebih lambat daripada ekspresi kondisional)
Alternatifnya, Anda bisa melakukan ini:
karena (x, y) dan (-x, -y) berbeda sudut sebesar 180 derajat.
sumber
Saya memiliki 2 solusi yang tampaknya berfungsi untuk semua kombinasi x dan y positif dan negatif.
1) Penyalahgunaan atan2 ()
Menurut dokumen atan2 mengambil parameter y dan x dalam urutan itu. Namun jika Anda membalikkannya, Anda dapat melakukan hal berikut:
2) Gunakan atan2 () dengan benar dan konversikan sesudahnya
sumber
@Jason S: varian "fmod" Anda tidak akan berfungsi pada penerapan yang sesuai standar. Standar C eksplisit dan jelas (7.12.10.1, "fungsi fmod"):
jadi,
sebenarnya hanyalah penulisan ulang yang panjang dari:
Saran ketiga Anda, bagaimanapun, tepat.
sumber
Inilah yang biasanya saya lakukan:
sumber
Saya telah membuat Formula untuk mengarahkan sudut menjadi 0 hingga 360
sumber
Solusi alternatifnya adalah dengan menggunakan fungsi mod () yang didefinisikan sebagai:
function mod(a, b) {return a - Math.floor (a / b) * b;}
Kemudian, dengan fungsi berikut, diperoleh sudut antara titik ini (x, y) dan ujung (x, y) . Sudut tersebut dinyatakan dalam derajat yang dinormalisasi menjadi [0, 360] derajat. dan referensi Utara 360 derajat.
sumber
Geosfer paket R akan menghitung bearingRhumb, yang merupakan garis bantalan konstan yang diberi titik asal dan arah timur / utara. The easting dan northing harus berupa matriks atau vektor. Titik asal mawar angin adalah 0,0. Kode berikut tampaknya siap menyelesaikan masalah:
sumber
-1 derajat menjadi (-1 + 360) = 359 derajat
-179 derajat menjadi (-179 + 360) = 181 derajat
sumber
Math.PI
? Apakah itu sama denganM_PI
?Ini akan mengembalikan derajat dari 0 ° -360 ° berlawanan arah jarum jam, 0 ° pada pukul 3.
sumber
Rumus yang memiliki rentang nilai dari 0 hingga 360 derajat.
f (x, y) = 180-90 * (1 + tanda (x)) * (1-tanda (y ^ 2)) - 45 * (2 + tanda (x)) * tanda (y)
sumber
Berikut beberapa javascript. Masukkan saja nilai x dan y.
sumber