Süpürme Hattı Algoritması ile Daire Kavşağı


15

Ne yazık ki, Süpürme Hattı Algoritmasını anlamada hala çok güçlü değilim . Konuyla ilgili tüm makaleler ve ders kitapları zaten okundu, ancak anlayış hala çok uzak. Daha açık hale getirmek için elimden geldiğince çok alıştırma yapmaya çalışıyorum. Ancak, gerçekten ilginç ve önemli görevler benim için hala zor.

Aşağıdaki alıştırmada her şeye kadir Jeff Erickson'un Çizgi Segmenti Kesişiminin ders notlarında buldum .

Alıştırma 2. zamanında düzlemde tane kesişip kesişmediğini belirlemek için bir tarama çizgisi algoritmasını tanımlayın ve analiz edin . Her daire merkezi ve yarıçapı ile belirtilir, bu nedenle girdi ve dizilerinden oluşur . Düşük seviyeli ilkelleri doğru bir şekilde uygulamaya dikkat edin.nO(nlogn)X[1..n],Y[1..n]R[1..n]

Karmaşık bir şeyi daha kolay hale getirmeye çalışalım. Çevrelerin kesişimi hakkında ne biliyoruz? Çizgilerin kesiştiği yerde hangi analog bulunabilir. Bitişik olmaları durumunda iki çizgi kesişebilir, kesişmek için hangi dairenin sahip olması gerekir? dairelerin merkezi, ve çevreleri arasındaki mesafe olsun . Birkaç vakayı düşünün:dr0r1

  • Durum 1: ise çözüm yoksa, daireler ayrıdır.d>r0+r1

  • Durum 2: Eğero zaman çözüm yoktur çünkü bir daire diğerinin içinde bulunur.d<|r0r1|

  • Durum 3: ve ise daireler çakışıyor ve sonsuz sayıda çözüm var.d=0r0=r1

Yani, kavşak koşulları hazır gibi görünüyor, elbette yanlış koşullar olabilir. Öyleyse lütfen düzeltin.

Algoritma. Şimdi kesişen iki daire arasında ortak bir şey bulmamız gerekiyor. Analogdan satıra kesişme ile olay kuyruğuna ekleme koşulu ve silme koşulu olması gerekir. Olay noktasının, dikey tarama çizgisinin temas ettiği ilk ve son noktaların x koordinatı olduğunu varsayalım. İçin dairenin insert ilk noktaya biz On durumuna kavşak ve çek son noktadan biz çevreyi sil üzerine, en yakın çevrelerle (kontrolü için 3 vaka yukarıda belirtilmiştir) durumu .

Süpürme hattı algoritması için yeterli gibi görünüyor. Yanlış bir şey varsa veya farklı yapılması gereken bir şey varsa, düşüncelerinizi bizimle paylaşmaktan çekinmeyin.

Zeyilname :

Dikey tarama çizgisi daireye ilk kez dokunduğunda bir daire eklerim ve tarama çizgisine son kez dokunduğunda bir daireyi durumdan kaldırırım. Kavşak kontrolü, en yakın önceki daire için yapılmalıdır. Biz bir çevre ekledi Eğer statü ve daha önce eklenen başka daire zaten vardı ve bu nedenle geçirgen daire öylesine bir kavşak olabilir, "kapalı" değildi, hâlâ oradaydı.


4
her şeye gücü yeten [alıntı gerekli]
JeffE

@com "önceki en yakın çevre" ile ne demek istiyorsun?
Joe

1
statusSüpürme çizgisiyle kesişen daireleri koruduğunu varsayıyorum. Şu anda 100 daireniz olduğunu statusve bir ekleme etkinliğini işlediğinizi ve 101. daireyi eklediğinizi varsayalım . Kavşağı kontrol etmek için kaç daireyi karşılaştırıyorsunuz? Karşılaştırılacak çevreleri nasıl seçersiniz?
Joe

yyyyyy

Yanıtlar:


5

Kesinlikle doğru yoldasınız. Büyük soru şudur: Bir daire eklediğinizde, kavşak için diğer hangi daireleri kontrol ediyorsunuz? Bu kontrolü nasıl yapıyorsunuz?

Çizgi segmenti kesişme durumunda, herhangi bir x koordinatındaki çizgi segmentleri tamamen sıralanmıştır. (Bunları en düşükten en yüksek Y koordinatına kadar listeleyebilirsiniz). Böylece, bir ikili arama ağacında çizgi parçalarını koruyabilirsiniz ve yeni bir segment eklediğinizde, sadece ikili arama ağacında nereye ait olduğunu bulmanız ve komşularını kavşak olayları açısından kontrol etmeniz gerekir.

Çevreler durumunda, hangi dairelerin kontrol edileceği hemen belli değildir. Cevabınız "hepsi" ise algoritmanızın biraz çalışması gerekir.

Çevreleri, çizgi bölümleri gibi tamamen sıralı olacak şekilde temsil etmenin bir yolunu bulabilir misiniz?

Daireleri iki yarım daire olarak göstermeyi deneyin. Her insert olayı aslında iki olaydır: üst yarıyı ekleyin ve alt yarısını ekleyin.


Ne yazık ki yarım daire fikrini almıyorum, belki yarım daireyi kesişebilecek minimum daire birimi olarak görüyorsunuz (3 kavşak vakası: kavşak üst yarım daire veya altta ya da her ikisinde). Dilencilikte tüm çevreler sol ve sağ sınırlarının x koordinatı ile sıralanır. Bu nedenle, x'in durum olarak koordineli olduğunu düşünmemeliyiz , çünkü tüm daireler zaten x koordinat sırasına sahiptir. Bu nedenle, merkezin (yarım daire) y koordinatını veya y ve yarıçapların herhangi bir kombinasyonunu dikkate almak daha mantıklı görünmektedir. Senin görüşün?
com

@com Kendi kesişim kontrollerinizde yaptığınız gibi iki dairenin kesişip kesişmediğini belirlemek için merkez noktaya ve yarıçapa ihtiyacınız vardır. Sadece y koordinatı ve yarıçap tek başına dairenin sınırını tam olarak belirtmez. Anlamadığınız tarama çizgisi algoritmaları hakkında temel bir şey var gibi görünüyor, ama bunun ne olduğunu söylemek benim için zor.
Joe

0

Bu yaklaşımı O ((n + k) logn) zamanında çalışan Bentley Ottmann süpürmesine benzer düşünebilirim.

Daire kesişim problemini çizgi segment kesişimine indirgeyebilirim. Dairelerin her biri için Y eksenine paralel dikey çapı dikkate alacağım. Algoritma, düzlemi aşağıdan yukarıya doğru süpüren yatay bir çizgi kullanmalıdır.

Şimdi her bir daire için Üst uç nokta, alt uç nokta var. Ayrıca, Kavşak yüklemini, yalnızca süpürme çizgisinin her iki daireyi bir noktada kesmesi durumunda kesiştiğini söylemek için değiştirmemiz gerekir.

Çizgi kesişimi problemi O ((n + k) logn) zamanında çözülebildiğinden, daire kesişimi için de aynı sınır izlenir.

Bunun işe yarayacağına oldukça ikna oldum, ancak eğer bunun genel olarak ele alınmayacağı herhangi bir duruma dikkat çekebilirseniz, bana bildirin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.