Jika Anda memiliki lingkaran dengan pusat (center_x, center_y)
dan jari-jari radius
, bagaimana Anda menguji jika suatu titik dengan koordinat (x, y)
berada di dalam lingkaran?
309
Jika Anda memiliki lingkaran dengan pusat (center_x, center_y)
dan jari-jari radius
, bagaimana Anda menguji jika suatu titik dengan koordinat (x, y)
berada di dalam lingkaran?
Jawaban:
Secara umum,
x
dany
harus memuaskan(x - center_x)^2 + (y - center_y)^2 < radius^2
.Harap dicatat bahwa poin yang memenuhi persamaan di atas dengan
<
digantikan==
dianggap sebagai poin pada lingkaran, dan poin yang memenuhi persamaan di atas dengan<
diganti oleh>
dianggap sebagai bagian luar lingkaran.sumber
<=
akan menemukan titik di dalam lingkaran atau di tepinya.Secara matematis, Pythagoras mungkin merupakan metode sederhana seperti yang telah banyak disebutkan.
Secara komputasi, ada cara yang lebih cepat. Menetapkan:
Jika suatu titik lebih mungkin berada di luar lingkaran ini maka bayangkan sebuah persegi yang ditarik di sekitarnya sehingga sisi-sisinya bersinggungan dengan lingkaran ini:
Sekarang bayangkan sebuah berlian persegi yang ditarik di dalam lingkaran ini sehingga simpul-simpulnya menyentuh lingkaran ini:
Sekarang kita telah membahas sebagian besar ruang kita dan hanya sebagian kecil dari lingkaran ini yang tersisa di antara kotak dan berlian kita untuk diuji. Di sini kita kembali ke Pythagoras seperti di atas.
Jika suatu titik lebih mungkin berada di dalam lingkaran ini maka balik urutan 3 langkah pertama:
Metode alternatif bayangkan persegi di dalam lingkaran ini alih-alih berlian tetapi ini membutuhkan sedikit lebih banyak tes dan perhitungan tanpa keunggulan komputasi (inner square dan berlian memiliki area yang identik):
Memperbarui:
Bagi mereka yang tertarik dengan kinerja saya menerapkan metode ini di c, dan dikompilasi dengan -O3.
Saya memperoleh waktu eksekusi oleh
time ./a.out
Saya menerapkan metode ini, metode normal dan metode dummy untuk menentukan waktu overhead.
Normal: 21.3s This: 19.1s Overhead: 16.5s
Jadi, tampaknya metode ini lebih efisien dalam implementasi ini.
sumber
inCircleN
Anda menggunakan ABS yang tidak perlu. Mungkin tanpa perbedaan ABS antarainCircle
daninCircleN
akan lebih kecil.Anda dapat menggunakan Pythagoras untuk mengukur jarak antara titik Anda dan pusat dan melihat apakah itu lebih rendah dari jari-jari:
EDIT (tip untuk Paul)
Dalam praktiknya, mengkuadratkan seringkali jauh lebih murah daripada mengambil akar kuadrat dan karena kami hanya tertarik pada pemesanan, tentu saja kami bisa melupakan mengambil akar kuadrat:
Juga, Jason mencatat itu
<=
harus diganti oleh<
dan tergantung pada penggunaan, ini mungkin masuk akalmeskipun saya percaya bahwa itu tidak benar dalam arti matematis yang ketat. Saya berdiri dikoreksi.sumber
**
atau^
. Cara tercepat untuk melakukannya ketika Anda hanya perlu x ^ 2 atau x ^ 3 adalah melakukannya "manual":x*x
.Ini lebih efisien, dan mudah dibaca. Ini menghindari operasi root kuadrat yang mahal. Saya juga menambahkan tanda centang untuk menentukan apakah titik tersebut berada dalam persegi panjang pembatas dari lingkaran.
Pemeriksaan segi empat tidak perlu kecuali dengan banyak titik atau banyak lingkaran. Jika sebagian besar poin berada di dalam lingkaran, pemeriksaan persegi panjang terikat sebenarnya akan membuat segalanya lebih lambat!
Seperti biasa, pastikan untuk mempertimbangkan use case Anda.
sumber
Hitung Jaraknya
itu dalam C # ... konversikan untuk digunakan dalam python ...
sumber
Anda harus memeriksa apakah jarak dari pusat lingkaran ke titik lebih kecil dari jari-jari, yaitu
sumber
Seperti yang dikatakan di atas - gunakan jarak Euclidean.
sumber
Temukan jarak antara pusat lingkaran dan titik-titik yang diberikan. Jika jarak di antara mereka kurang dari jari-jari maka titik berada di dalam lingkaran. jika jarak antara keduanya sama dengan jari-jari lingkaran maka titiknya adalah pada keliling lingkaran. jika jaraknya lebih besar dari jari-jari maka titiknya adalah di luar lingkaran.
sumber
Persamaan di bawah ini adalah ekspresi yang tes apakah suatu titik dalam lingkaran tertentu di mana xP & yp adalah koordinat titik, xC & yC adalah koordinat pusat lingkaran dan R adalah jari-jari lingkaran yang diberikan.
Jika ungkapan di atas benar maka intinya ada di dalam lingkaran.
Di bawah ini adalah contoh implementasi dalam C #:
sumber
Ini adalah solusi yang sama seperti yang disebutkan oleh Jason Punyon , tetapi berisi contoh pseudo-code dan beberapa detail lainnya. Saya melihat jawabannya setelah menulis ini, tetapi saya tidak ingin menghapus jawaban saya.
Saya pikir cara yang paling mudah dimengerti adalah pertama-tama menghitung jarak antara pusat lingkaran dan titik. Saya akan menggunakan rumus ini:
Kemudian, cukup bandingkan hasil rumus itu, jarak (
d
), denganradius
. Jika jarak (d
) kurang dari atau sama dengan jari-jari (r
), titik berada di dalam lingkaran (di tepi lingkaran jikad
danr
sama).Berikut ini adalah contoh kode pseudo yang dapat dengan mudah dikonversi ke bahasa pemrograman apa pun:
Di mana
circle_x
dancircle_y
merupakan pusat koordinat lingkaran,r
adalah jari-jari lingkaran, danx
dany
adalah koordinat titik.sumber
Jawaban saya dalam C # sebagai solusi cut & paste lengkap (tidak dioptimalkan):
Pemakaian:
sumber
Seperti yang dinyatakan sebelumnya, untuk menunjukkan jika titik di lingkaran kita dapat menggunakan yang berikut ini
Untuk mewakilinya secara grafis, kita dapat menggunakan:
sumber
Saya menggunakan kode di bawah ini untuk pemula seperti saya :).
incirkel kelas publik {
sumber
Pindah ke dunia 3D jika Anda ingin memeriksa apakah titik 3D ada di Unit Sphere Anda akhirnya melakukan sesuatu yang serupa. Semua yang diperlukan untuk bekerja dalam 2D adalah menggunakan operasi vektor 2D.
sumber
Saya tahu itu beberapa tahun dari jawaban pilihan terbaik, tetapi saya berhasil memotong waktu kalkulasi menjadi 4.
Anda hanya perlu menghitung piksel dari 1/4 lingkaran, lalu kalikan dengan 4.
Ini adalah solusi yang saya capai:
sumber
Berikut adalah kode java sederhana untuk menyelesaikan masalah ini:
dan matematika di baliknya: /math/198764/how-to-know-if-a-point-is-inside-a-circle
sumber
PHP
sumber