Sayangnya saya masih belum begitu kuat dalam memahami Algoritma Sweep Line . Semua makalah dan buku pelajaran tentang topik sudah dibaca, namun pemahaman masih jauh. Untuk membuatnya lebih jelas, saya mencoba menyelesaikan sebanyak mungkin latihan. Tapi, tugas yang sangat menarik dan penting masih menjadi tantangan bagi saya.
Latihan berikut ini saya temukan dalam catatan kuliah tentang Line Segment Intersection oleh Mahakuasa Jeff Erickson.
Latihan 2. Jelaskan dan analisis algoritma sweepline untuk menentukan, diberikan lingkaran di pesawat, apakah ada dua berpotongan, dalam waktu O ( n log n ) . Setiap lingkaran ditentukan oleh pusat dan jari-jarinya, sehingga input terdiri dari tiga array X [ 1 .. n ] , Y [ 1 .. n ] , dan R [ 1 .. n ] . Berhati-hatilah untuk menerapkan primitif tingkat rendah dengan benar.
Mari kita coba untuk membuat hal yang kompleks menjadi lebih mudah. Apa yang kita ketahui tentang persimpangan lingkaran? Apa yang analog dapat ditemukan dengan persimpangan garis. Dua garis mungkin berpotongan jika berbatasan, properti mana yang harus dimiliki oleh dua lingkaran untuk berpotongan? Misalkan menjadi jarak antara pusat lingkaran, r 0 dan r 1 pusat lingkaran. Pertimbangkan beberapa kasus:
Kasus 1: Jika maka tidak ada solusi, lingkarannya terpisah.
Kasus 2: Jika maka tidak ada solusi karena satu lingkaran terkandung di dalam yang lain.
Kasus 3: Jika dan r 0 = r 1 maka lingkarannya bertepatan dan ada banyak solusi.
Jadi, sepertinya kondisi simpang sudah siap, tentu saja kondisinya mungkin salah. Harap perbaiki jika benar.
Algoritma. Sekarang kita perlu menemukan kesamaan antara dua lingkaran yang berpotongan. Dengan persimpangan analog ke garis, kita harus memiliki kondisi penyisipan dan menghapus kondisi ke antrian acara. Katakanlah titik kejadian adalah koordinat x dari titik pertama dan terakhir yang disentuh garis vertikal. Pada titik pertama kita memasukkan lingkaran ke status dan memeriksa persimpangan (3 kasus untuk pemeriksaan disebutkan di atas) dengan lingkaran terdekat, pada titik terakhir kita menghapus lingkaran dari status .
Sepertinya cukup untuk algoritma garis sapu. Jika ada sesuatu yang salah, atau mungkin ada sesuatu yang harus dilakukan berbeda, jangan ragu untuk membagikan pemikiran Anda dengan kami.
Adendum :
Saya memasukkan lingkaran ketika garis sapuan vertikal menyentuh lingkaran untuk pertama kalinya, dan menghapus lingkaran dari status ketika garis sapuan menyentuhnya untuk yang terakhir kalinya. Pemeriksaan untuk persimpangan harus dilakukan untuk lingkaran terdekat sebelumnya. Jika kami menambahkan lingkaran ke status dan sudah ada lingkaran lain yang kami tambahkan sebelumnya dan itu masih ada, maka lingkaran yang dulunya tidak "ditutup", jadi mungkin ada persimpangan.
status
mempertahankan lingkaran yang saat ini memotong garis sapuan? Misalkan saat ini Anda memiliki 100 lingkaran status
, dan Anda memproses acara penyisipan dan memasukkan lingkaran ke-101. Berapa banyak lingkaran yang Anda bandingkan untuk memeriksa persimpangan? Bagaimana Anda memilih lingkaran mana yang akan dibandingkan?