Dalam bahasa pemrograman (Python, C #, dll) saya perlu menentukan cara menghitung sudut antara garis dan sumbu horizontal?
Saya pikir gambar menggambarkan yang terbaik yang saya inginkan:
Diberikan (P1 x , P1 y ) dan (P2 x , P2 y ) apa cara terbaik untuk menghitung sudut ini? Asalnya ada di topleft dan hanya kuadran positif yang digunakan.
c#
python
trigonometry
orlp
sumber
sumber
Jawaban:
Pertama-tama temukan perbedaan antara titik awal dan titik akhir (di sini, ini lebih merupakan segmen garis terarah, bukan "garis", karena garis memanjang tanpa batas dan tidak memulai pada titik tertentu).
Kemudian hitung sudutnya (yang berjalan dari sumbu X positif di
P1
ke sumbu Y positif diP1
).Tetapi
arctan
mungkin tidak ideal, karena membagi perbedaan dengan cara ini akan menghapus perbedaan yang diperlukan untuk membedakan kuadran mana sudut berada (lihat di bawah). Gunakan yang berikut sebagai gantinya jika bahasa Anda menyertakan suatuatan2
fungsi:EDIT (22 Februari 2017): Namun, secara umum, panggilan
atan2(deltaY,deltaX)
hanya untuk mendapatkan sudut yang tepatcos
dansin
mungkin tidak tepat. Dalam kasus tersebut, Anda dapat sering melakukan hal berikut sebagai gantinya:(deltaX, deltaY)
sebagai vektor.deltaX
dandeltaY
dengan panjang vektor (sqrt(deltaX*deltaX+deltaY*deltaY)
), kecuali panjangnya adalah 0.deltaX
sekarang akan menjadi cosinus sudut antara vektor dan sumbu horizontal (dalam arah dari X positif ke sumbu Y positif diP1
).deltaY
sekarang akan menjadi sinus sudut itu.EDIT (28 Februari 2017): Bahkan tanpa menormalkan
(deltaX, deltaY)
:deltaX
akan memberi tahu Anda apakah kosinus yang dijelaskan pada langkah 3 positif atau negatif.deltaY
akan memberi tahu Anda apakah sinus yang dijelaskan pada langkah 4 positif atau negatif.deltaX
dandeltaY
akan memberi tahu Anda kuadran mana sudut berada, dalam kaitannya dengan sumbu X positif diP1
:+deltaX
,+deltaY
: 0 hingga 90 derajat.-deltaX
,+deltaY
: 90 hingga 180 derajat.-deltaX
,-deltaY
: 180 hingga 270 derajat (-180 hingga -90 derajat).+deltaX
,-deltaY
: 270 hingga 360 derajat (-90 hingga 0 derajat).Implementasi di Python menggunakan radian (disediakan pada 19 Juli 2015 oleh Eric Leschinski, yang mengedit jawaban saya):
Semua tes lulus. Lihat https://en.wikipedia.org/wiki/Unit_circle
sumber
90 - angleInDegrees
?Maaf, tapi saya cukup yakin jawaban Peter salah. Perhatikan bahwa sumbu y menuruni halaman (umum dalam grafik). Dengan demikian perhitungan deltaY harus dibalik, atau Anda mendapatkan jawaban yang salah.
Mempertimbangkan:
memberi
Jadi jika dalam contoh di atas, P1 adalah (1,1) dan P2 adalah (2,2) [karena Y naik turun halaman], kode di atas akan memberikan 45,0 derajat untuk contoh yang ditunjukkan, yang salah. Ubah urutan perhitungan deltaY dan itu berfungsi dengan baik.
sumber
double arc = Math.atan2(mouse.y - obj.getPy(), mouse.x - obj.getPx()); degrees = Math.toDegrees(arc); if (degrees < 0) degrees += 360; else if (degrees > 360) degrees -= 360;
Saya telah menemukan solusi dalam Python yang berfungsi dengan baik!
sumber
Mempertimbangkan pertanyaan yang tepat, menempatkan kami dalam sistem koordinat "spesial" di mana sumbu positif berarti bergerak BAWAH (seperti tampilan layar atau antarmuka), Anda perlu menyesuaikan fungsi ini seperti ini, dan negatif dengan koordinat Y:
Contoh dalam Swift 2.0
Fungsi ini memberikan jawaban yang benar untuk pertanyaan itu. Jawaban ada dalam radian, jadi penggunaannya, untuk melihat sudut dalam derajat, adalah:
sumber
Berdasarkan referensi "Peter O" .. Ini adalah versi java
sumber
fungsi matlab:
sumber
Rumus untuk sudut dari 0 hingga 2pi.
Ada x = x2-x1 dan y = y2-y1. Formula berfungsi untuk
nilai x dan y. Untuk x = y = 0 hasilnya tidak ditentukan.
f (x, y) = pi () - pi () / 2 * (1 + tanda (x)) * (1-tanda (y ^ 2))
sumber
sumber
Pengujian
Untuk pengujian saya membiarkan hipotesis menghasilkan kasus uji.
sumber