Bir daire ve içbükey çokgenin kesişip kesişmediğini nasıl test edebilirim?


19

Bir çokgene (bazen dışbükey, ancak genellikle içbükey) ve farklı yarıçaplara sahip bir grup dairem var. Bir dairenin çokgenle kesişip kesişmediğini / üst üste gelip gelmediğini nasıl öğrenebilirim?

İçbükey poligonumu dışbükey parçalara bölebilirdim. Bu yardımcı olur mu?

Yanıtlar:


26

bu sorunun iki vakası vardır. Birincisi kesişme ve ikincisi örtüşen (içeren).

İlk olarak (daire içindeki kavşak / çokgen):

Çokgenin her kenarında dairenin merkezine en yakın noktayı bulun. Merkeze en yakın nokta arasındaki mesafe yarıçaptan daha azsa, kavşak veya üst üste binme olur.

İkincisi (daire çokgene bütündür): Işını daire merkezinden sağa (veya sol / yukarı / aşağı) vurun ve ışın / segment (çokgen kenarları) kesişimlerini sayın. Kesişim sayısı eşitse daire çokgenin dışındadır. Eğer tuhaf daire içerideyse.

Bu dava için lectue'dan picter paylaşacağım:

resim açıklamasını buraya girin

Ve tekil vakalara dikkat edin.

Umarım bu yardımcı olur.


edit: Ben sadece resme kredi eklemenin adil olduğunu düşünüyorum. Yazar Petr Felkel, Prag'daki Çek Teknik Üniversitesi Yardımcı Doçent


Bunun sadece sağa bir ışın "vurarak" işe yarayacağını sanmıyorum. Belki yaklaşımınızı yanlış okudum
bummzack

2
Evet, ancak bu ilk durumda açıklanmaktadır. Çekim ışını yalnızca Poligon içeren daireyi çözecektir (açıklamamda ikinci durum). Her iki durumu da test etmelisiniz. Hızlıdır, uygulaması kolaydır ve belleğe ihtiyaç duymaz.
Notabene

1
Üzgünüm "edge" i "vertex" ile karıştırdım ve bu nedenle ilk kontrolünüzü yanlış yorumladım. Doğru okurken, işe yarıyor :)
bummzack

7

İlk adım, tahmin ettiğiniz gibi, içbükey çokgeni birden çok dışbükey olana bölmektir. Bunun nedeni , sadece dışbükey çokgenler üzerinde çalışan ayırma ekseni teoremini kullanmanızdır .

SAT per se sadece iki dışbükey çokgen üzerinde çalışır. Adındaki "ayırma ekseni", çokgenin kenarlarına dik eksenleri ifade eder. Daireler maalesef bunlardan sonsuz sayıda var. Bununla birlikte, çokgenin köşelerini kesişmek için dışarıya doğru çıkıntı yapan projeye bakarak, bu eksenlerden hangisinin alakalı olduğunu bulmanın oldukça kolay bir yolu olduğu ortaya çıkıyor.

Buradaki tüm algoritmayı gözden geçirmek yerine, Metanet Yazılımı (N / N + yapımcıları) SAT'ı kullanarak çarpışma algılama konusunda iyi bir öğreticiye sahiptir , üçüncü bölümü nesnelerden biri daire olduğunda SAT'ı kapsar .


Bir içbükey çokgeni dışbükey çokgenlere bölmek için bir referansınız var mı? Sağladığınız SAT bağlantısı, böyle bir şeyden bahsetmiyor.
ehsanul

Bu aslında çokgenin geometrisine bağlı olarak çok karmaşık bir sorundur, ancak tüm 3D motorlar bunu yapar, çünkü donanım genellikle çokgenleri değil sadece eş düzlemli dörtgenleri ve üçgenleri oluşturabilir.
SplinterReality

1
@ehsanul: en.wikipedia.org/wiki/Polygon_triangulation birkaç popüler yaklaşımı açıklar.

0

İşte yaptığım şey.

  1. Dairenin merkezinin çokgenin içinde olup olmadığını tespit etmek için yatay çizgi testini kullanın. Eğer öyleyse, kesişirler.
  2. Değilse, aşağıdaki durumu kontrol edin. Çokgenin her iki tarafı için
    1. Çokgen tarafın eğimini bulun
    2. Dikey Eğimi Hesapla
    3. (DİKKATLİCE OKUYUN) Çokgen tarafın eğimi ile ya tarafı yapan tepe noktasıyla kesişen bir çizgi ile dairenin merkezine kesişen tarafa dik olan eğim çizgisi arasındaki kesişim noktasını bulun.
    4. Yerleşik kavşak noktası dairenin içinde yer alıyorsa, bu, bir noktadaki dairenizin söz konusu kenarın üzerinden geçtiği ve dolayısıyla çokgenin kesiştiği anlamına gelir
  3. Son olarak, başka hiçbir şey kesin değilse, çokgenin herhangi bir köşesinin dairenin içinde olup olmadığını kontrol edin (önceki testlerden dolayı, sadece bir kez kontrol etmeniz gerekir) Öyleyse kesişirler. Değilse, kesin olarak söyleyemezler.
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.