Katakanlah Anda memiliki ini:
P1 = (x=2, y=50)
P2 = (x=9, y=40)
P3 = (x=5, y=20)
Asumsikan itu P1
adalah titik pusat sebuah lingkaran. Itu selalu sama. Saya ingin sudut yang dibuat oleh P2
dan P3
, atau dengan kata lain sudut yang ada di sebelahnya P1
. Sudut dalam tepatnya. Itu akan selalu menjadi sudut lancip, jadi kurang dari -90 derajat.
Saya berpikir: Ya ampun, itu matematika geometri sederhana. Tetapi saya telah mencari formula selama sekitar 6 jam sekarang, dan hanya menemukan orang-orang berbicara tentang hal-hal rumit NASA seperti arccos dan hal-hal produk skalar vektor. Kepalaku terasa seperti ada di lemari es.
Beberapa ahli matematika di sini yang menganggap ini masalah sederhana? Saya tidak berpikir bahasa pemrograman penting di sini, tetapi bagi mereka yang menganggapnya penting: java dan objektif-c. Saya membutuhkannya untuk keduanya, tetapi belum memberi tag untuk ini.
Ini menjadi sangat sederhana jika Anda menganggapnya sebagai dua vektor, satu dari titik P1 ke P2 dan satu dari P1 ke P3
jadi:
a = (p1.x - p2.x, p1.y - p2.y)
b = (p1.x - p3.x, p1.y - p3.y)
Anda kemudian dapat membalik rumus perkalian titik:
untuk mendapatkan sudutnya:
Ingat itu berarti: a1 * b1 + a2 * b2 (hanya 2 dimensi di sini ...)
sumber
Cara terbaik untuk menangani komputasi sudut adalah dengan menggunakan
atan2(y, x)
titik tertentu yangx, y
mengembalikan sudut dari titik tersebut danX+
sumbu sehubungan dengan asal.Mengingat bahwa perhitungannya adalah
yaitu Anda pada dasarnya menerjemahkan dua poin dengan
-P1
(dengan kata lain Anda menerjemahkan semuanya sehinggaP1
berakhir di asal) dan kemudian Anda mempertimbangkan perbedaan sudut absolut dariP3
dan dariP2
.Keuntungan dari
atan2
adalah bahwa lingkaran penuh terwakili (Anda bisa mendapatkan angka antara -π dan π) di mana sebagai gantinyaacos
Anda perlu menangani beberapa kasus tergantung pada tanda untuk menghitung hasil yang benar.Satu-satunya titik tunggal untuk
atan2
adalah(0, 0)
... yang berarti bahwa keduanyaP2
danP3
harus berbeda dariP1
karena dalam kasus itu tidak masuk akal untuk berbicara tentang sudut.sumber
atan2
persis seperti yang dibutuhkan untuk masalah ini, tetapi sepertinya kebanyakan orang yang mendapatkan pertanyaan ini tidak dapat membaca atau tidak dapat memahami mengapaacos
solusi berbasis itu buruk. Cukup beruntung bagi saya, saya meninggalkan fase "seseorang yang salah di internet" ( xkcd.com/386 ) bertahun-tahun yang lalu dan saya tidak akan memulai pertarungan untuk membela yang sudah jelas :-)Izinkan saya memberi contoh dalam JavaScript, saya telah banyak berjuang dengan itu:
Bonus: Contoh dengan kanvas HTML5
sumber
sqrt
dan mengkuadratkan. Lihat jawaban saya di sini (ditulis dalam Ruby), atau dalam demo yang diperbarui ini (JavaScript).Pada dasarnya yang Anda miliki adalah dua vektor, satu vektor dari P1 ke P2 dan satu lagi dari P1 ke P3. Jadi yang Anda butuhkan hanyalah rumus untuk menghitung sudut antara dua vektor.
Lihat di sini untuk penjelasan yang baik dan rumusnya.
sumber
Jika Anda memikirkan P1 sebagai pusat lingkaran, Anda berpikir terlalu rumit. Anda memiliki segitiga sederhana, jadi soal Anda bisa diselesaikan dengan hukum cosinus . Tidak perlu transformasi koordinat kutub atau semacamnya. Misalkan jaraknya adalah P1-P2 = A, P2-P3 = B dan P3-P1 = C:
Yang perlu Anda lakukan adalah menghitung panjang jarak A, B, dan C. Itu mudah didapat dari koordinat x dan y titik dan teorema Pythagoras Anda.
sumber
P1-P2 = A
tidak boleh dibaca sebagai "Untuk menghitung A, kurangi P2 dari P1", tetapi sebagai "Saya mendefinisikan A sebagai jarak dari P1 ke P2", yang kemudian dapat dihitung menggunakan persamaan kedua. Saya hanya ingin mendefinisikan singkatan jarak, agar persamaannya lebih mudah dibaca.Saya mengalami masalah serupa baru-baru ini, hanya saja saya perlu membedakan antara sudut positif dan negatif. Jika ini berguna bagi siapa pun, saya merekomendasikan cuplikan kode yang saya ambil dari milis ini tentang mendeteksi rotasi melalui peristiwa sentuh untuk Android:
sumber
Solusi Geometris Sangat Sederhana dengan Penjelasan
Beberapa hari yang lalu, seorang jatuh ke masalah yang sama & harus duduk dengan buku matematika. Saya memecahkan masalah dengan menggabungkan dan menyederhanakan beberapa rumus dasar.
Mari pertimbangkan angka ini-
Kita ingin tahu ϴ , jadi kita perlu cari tahu α dan β dulu. Sekarang, untuk setiap garis lurus-
Misalkan- A = (ax, ay) , B = (bx, by) , dan O = (ox, oy) . Jadi untuk garis OA -
Dengan cara yang sama, untuk baris OB -
Sekarang, kami membutuhkannya
ϴ = β - α
. Dalam trigonometri kami memiliki rumus-Setelah mengganti nilai
tan α
(dari eqn-2) dantan b
(dari eqn-3) di eqn-4, dan menerapkan penyederhanaan kita dapatkan-Begitu,
Hanya itu saja!
Sekarang, ambil gambar berikut-
C # atau, metode Java ini menghitung sudut ( ϴ ) -
sumber
Di Objective-C Anda bisa melakukannya dengan
Atau baca lebih lanjut di sini
sumber
Anda menyebutkan sudut bertanda (-90). Dalam banyak aplikasi, sudut mungkin memiliki tanda (positif dan negatif, lihat http://en.wikipedia.org/wiki/Angle ). Jika titiknya (katakanlah) P2 (1,0), P1 (0,0), P3 (0,1) maka sudut P3-P1-P2 secara konvensional positif (PI / 2) sedangkan sudut P2-P1- P3 negatif. Menggunakan panjang sisi tidak akan membedakan antara + dan - jadi jika ini penting, Anda perlu menggunakan vektor atau fungsi seperti Math.atan2 (a, b).
Sudut juga dapat melampaui 2 * PI dan sementara ini tidak relevan dengan pertanyaan saat ini, cukup penting bahwa saya menulis kelas Sudut saya sendiri (juga untuk memastikan bahwa derajat dan radian tidak tercampur). Pertanyaan tentang apakah sudut1 lebih kecil dari sudut2 sangat bergantung pada bagaimana sudut didefinisikan. Mungkin juga penting untuk memutuskan apakah baris (-1,0) (0,0) (1,0) direpresentasikan sebagai Math.PI atau -Math.PI
sumber
Baru-baru ini, saya juga mengalami masalah yang sama ... Di Delphi Ini sangat mirip dengan Objective-C.
sumber
Berikut adalah metode C # untuk mengembalikan sudut (0-360) berlawanan arah jarum jam dari horizontal untuk sebuah titik pada lingkaran.
Cheers, Paul
sumber
sumber
ADA jawaban sederhana untuk ini menggunakan matematika sekolah menengah ..
Katakanlah Anda memiliki 3 poin
Untuk mendapatkan sudut dari titik A ke B
angle = atan2(A.x - B.x, B.y - A.y)
Untuk mendapatkan sudut dari titik B ke C.
angle2 = atan2(B.x - C.x, C.y - B.y)
Saya baru saja menggunakan kode ini dalam proyek terakhir yang saya buat, ubah B menjadi P1 .. Anda mungkin juga menghapus "180 +" jika Anda mau
sumber
nah, jawaban lain sepertinya mencakup semua yang diperlukan, jadi saya ingin menambahkan ini jika Anda menggunakan JMonkeyEngine:
Vector3f.angleBetween(otherVector)
karena itulah yang saya cari di sini :)
sumber
}
sumber