Dışbükey çokgenleri nasıl ekleyebilir ve çıkarabilirim?


12

Birbiri ile örtüşen iki 2D dışbükey çokgenim var . Bunları çıkarmak ve eklemek için bir algoritma arıyorum . Sonuç, tek bir içbükey çokgen veya içbükey sonucu (örneğin üçgenler) oluşturan en büyük dışbükey kümeler olmalıdır.

resim açıklamasını buraya girin

( Sol: Üst üste binen çokgenler. Orta: Eklendikten sonra ortaya çıkan içbükey çokgen Sağ: İçbükey sonucu oluşturan dışbükey bir çokgen kümesi Burada performans nedeniyle dışbükey çokgenleri bir üçgenden daha büyük yapmak daha iyi olacaktır. üst üste gelen iki çokgen soldaki ile aynı resme yol açacaktır, ancak üst üste binen alan elde edilen çokgenin bir parçası değildir.)

Bunu nasıl yapabilirim?


Burada 2D'den mi bahsediyoruz? çünkü 3B'de çokgenleri birleştirmek pek mantıklı değil.
concept3d

Evet, sry, 2D'den bahsediyorum! 3D'de neden 2D'den daha az anlam ifade etmediğini anlamıyorum.
Sebastian Barth

2
3D'ye iki çokgen ekleyerek, eğer düzlerlerse, aynı düzlemde olmadıkları sürece çok mantıklı değiller, eğer hacimleri (katıları) varsa, o zaman farklı bir hikaye.
concept3d

Tamam, anladım. Grafikleri değil çarpışma nesnelerini düşünüyordum. Açıklama için teşekkürler.
Sebastian Barth

Ek olarak, kesiştikleri tüm noktaları bulun ve köşeleri bir kümeye ekleyin. Set üst üste binmeyi önlemek için önemlidir. Ardından, diğer iki şekilden diğer tüm köşeleri sete eklemeniz yeterlidir. Bu küme, ilave şeklin tüm köşelerini içerir.
Vaughan Hilts

Yanıtlar:


9

TL; DR BSP ağaçları kullanarak boole işlemleri gerçekleştirmeniz gerekir.

Görünüşe göre burada Yapıcı Katı Geometri'den bahsediyoruz . CSG'yi ticari düzeyde uyguladım, bu yüzden bu konuda bir iki şey biliyorum.

CSG ile ilgili klasik kağıda BSP Ağaçlarının Birleştirilmesi Çokyüzlü Set Operasyonlarını Getirir , dürüst olmak gerekirse, burada açıklamak çok fazladır, ancak kısaca konuşmak gerekirse, algoritma ikili uzay bölümleme ile aynı düzlemde yer alan çokgenlerle ilgilidir, temelde her çokgen ağdan bir BSP ağacı. İkinci adım, bu BSP ağaçlarının birleştirilmesidir; sadece bir ağacı alıp diğerine yerleştirirsiniz. Algoritma daha sonra düğümleri bölmek ve çıkarmak için her bir yaprak düğümü ile nasıl başa çıkılacağını açıklamaya devam eder, son şekilde gerekli olmayan düğümler kaldırılır, diğerlerine uygun üst öğe verilir.

Fakat bekle! Bu kağıt temel olarak çokgen örgüler ve 3D düzlemler hakkında konuşuyor, HAYIR?

Algoritma herhangi bir boyuta genelleştirilebilir, bu nedenle 2B durumunuzda ikili bölümler olarak düzlem yerine çizgi segmentlerini kullanmak kolaydır. Böylece her çokgen, ikisinin birleştirileceğinden daha fazla BSP ağacına dönüştürülecektir. Son olarak, nihai çokgeni oluşturmak için ortaya çıkan ağacı gezdirirsiniz,

Bu algoritmanın ve CSG'nin genel olarak oluşturma ve kafes yüzlerini doğrudan ele almadığını ve gerçekten hazır olmadığını unutmayın, bu nedenle son BSP ağaçlarının yüzlerini çıkarmanız gerekir. Ayrıca ışın izlemeyi CSG sonucunu oluşturmak için daha kolay bir yaklaşım olarak görüyorum, ışınları sadece yüzleri çıkarmak ve aslında bölmek yerine ağaçtan geçmek için ihtiyacınız var (sadece ikili bölümlerle uğraştığımızı unutmayın).

Sayısal sağlamlık ile ilgili. İki tür geometrik hesaplama olduğunu not etmek iyidir,

  • İnşaata dayalı olanlar, önceki bir operasyonun sonucuna göre bir şekil inşa edersiniz . Örneğin y = sqrt(x)ve sonra yyeni bir işlemde kullanın . Buna inşaat denir; sorun, sayısal hataların hızlı bir şekilde birikmesidir.
  • Alternatif olarak , bunun yerine tahminleri kullanan işlemler vardır , temelde inşaat kullanmak yerine, bir koşulun doğru / yanlış olup olmadığını sorarsınız ve farklı değerlerde aynı değeri kullanırsınız. Klasik testler arasında incircle ve oryantasyon testi; bu, özellikle tek veya çift kesinlik kullanıyorsanız sayısal hatalardan şüphelenir, ancak genellikle çok daha iyi sonuçlar verir. hıza ve isabetliliğe göre değişen diğer çözümler mevcuttur. Doğru sonuçlar vermek için düzlem tabanlı bir geometri kullanarak yapımdan kaçınan son makalelerden biri. Gazeteden de alıntı yapacağım:

Poligonal kafeslerin düzlem tabanlı temsili kavramı ilk olarak Sugihara ve Iri tarafından tanımlanmıştır [SI89]. Boole ifadelerinin değerlendirilmesi gibi kafeslerle temsil edilen katıların topolojisini değiştirmeyi gerektiren görevler söz konusu olduğunda, bu tür bir temsil önemli bir avantaj sağlar: ortaya çıkan polihedronu elde etmek için yeni bir birincil geometri bilgisi oluşturulmamalıdır

resim açıklamasını buraya girin

Son olarak, BSP CSG uygulamanızı başlatmak isterseniz, BSP SSS'lerinden başlamanızı tavsiye ederim .


Dışbükey bir çokgen veya çokyüzlünün BSP'sinin bir liste olduğu göz önüne alındığında serin, ancak karşı sezgisel. Harika bir kağıt.
3Dave

@DavidLively evet, ancak yüzleri olmayan kök düzlemini seçerek dengeli bir ağaç yapabilirsiniz. Aslında bu, bahsetmedikleri zorluğun bir parçası
concept3d

Ah, bu mantıklı. Bir çeşit melez BSP, o zaman.
3Dave

@DavidLively ayrıca BSP'nin oluşturulması gerçekten kolay değildir, ancak OP sorusu basit bir durumdur, daha karmaşık bir durumda, milyonlarca çokgen geometrisi ile, ağaç yapısını bitirdiğinizde, çok uzaktasınız.
concept3d

@ concept3d Umarım bu çok can sıkıcı olmaz, çünkü bu 5 yıllık bir cevaptır, ama gerçekten anlamadığım iki şey var: Bir noktanın bir düzlemin / çizginin solunda veya sağında olup olmadığını belirlemeye çalışırken, her şeyi basitçe döndürmek daha kolay olmazdı, böylece düzlem / çizgi önemsiz bir düzleme / çizgiye karşılık gelir ve sonra sadece döndürülen noktanın koordinatlarını göz önünde bulundurur mu? BSP ağaçları yerine Sutherland-Hodgman algoritmasını kullanmaya ne dersiniz? Bu yaklaşıma oldukça benziyor.
John P

1

Örneğinize göre:

Çokgen A üzerinde bir başlangıç ​​noktası seçin ve ardından kesişen kenarları saat yönünde (veya saat yönünün tersine) kontrol etmeye başlayın. Bir kavşak yoksa, önceki poligonu elde edilen çokgene ekleyin. Bir kavşak varsa, ortaya çıkan çokgene kesiştikleri noktayı ekleyin ve ardından aynı sarma sırasında çokgen B üzerinden yinelemeye başlayın. Aynı şeyi yapın, bir kavşak meydana gelirse tekrar A poligonuna değiştirin.

Yeni çokgen için tüm köşeleri topladıktan sonra, üzerinde bir üçgenleme algoritması gerçekleştirin. Kulak kırpma yöntemi uygulamak kolaydır ancak orada daha hızlı seçenek vardır.

Önemli: Başladığınız tepe noktasının diğer çokgenin içinde olmadığından emin olun ( bu makalede çokgen testlerinde nokta olup olmadığını kontrol edin ).

Her kenarı yineleyerek, bir kavşak olup olmadığını kontrol etmek O (n ^ 2) algoritması olacaktır. Öncelikle diğer poligonun içindeki köşeleri bularak hızlandırabilirsiniz, çünkü bu köşelere bağlı kenarlar kesişen kenarlar olacaktır.


0

İçbükey bir çokgen istiyorsanız , iki giriş çokgeni arasında en yakın kenarı seçin ve iki yeni kenar ekleyin:

resim açıklamasını buraya girin

Dışbükey biraz daha karmaşıklaşır:

resim açıklamasını buraya girin

Bir yaklaşım, ilk çokgeni her şeyi kapsayan bir kaba dönüştürerek, ikinci çokgenden ilkeye, her seferinde bir tane olmak üzere, köşeleri eklemesi yinelemelidir.

Temelde:

  • İkinci çokgenin köşelerinden yineleyin.
  • Her köşe V için, ilk çokgenin kenarlarından tekrarlayın:
  • Tümü tepe noktasına bakan bir "kenar" aralığı bulun
  • o aralığı tanımlayan dış köşe çiftini alın ve onları birbirine bağlayan aralıktaki tüm kenarları kaldırın
  • Yeni kenarların doğru yöne baktığından emin olarak, bu dış köşelerden yeni tepe noktasına (ikinci çokgenden) iki yeni parça çizin.
  • İkinci çokgenin bir sonraki köşesine ilerleyin

İlk tepe için işlemi gösteren bir diyagram:

resim açıklamasını buraya girin

Daha hızlı bir yöntem, her çokgendeki diğer çokgene bakmayan kenarların listesini bulmak, diğer her şeyi kaldırmak ve kalan çizgi şeritlerinin uç noktalarını birbirine bağlamaktır.

Belki başka biri çıkarma önerileriyle karşılaşabilir.


Bu sadece sorunun yarısını ele alıyor gibi görünüyor (ekleme). Ayrıca, algoritmaların nasıl çalıştığını belirtmek veya çokgenler çakışırsa optimize edilebilir.

Algoritma, hedef çokgenin "içinde" olan köşeleri dolaylı olarak yok sayar; bu da ikinci çokgenden bir kenarın ilkini geçtiği sorunu telafi eder.
3Dave

Bu neredeyse birleştirme aşamasına eşittir ( birleştirme gövdesi algoritmasının 4. noktası . Benim durumumda, çokgenleri birleştirdikten sonra daha fazla alan kaplamak doğru bir çözüm değildir. Doğru çözüm her iki çokgeni olduğu gibi tutmaktır. t Üst üste binen veya dokunmayan
Sebastian Barth

@luftgewehrindianer Ah - Evet, bu büyük bir fark yaratıyor. Belki de soruyu yanlış anladım. Sonucun dışbükey veya içbükey olup olmadığından endişe etmeden çokgenleri bir araya getirmek mi istiyorsunuz? Veya kavşağa dayalı bir dışbükey set mi oluşturuyorsunuz? (Şu an için çıkarma çıkarılıyor.)
3

@DavidLively Aynı renkte ve kenar stoku olmadan iki dışbükey çokgen düşünün. Üst üste geldiklerinde, yeni bir dışbükey veya içbükey çokgen gibi görünüyor. Kombine şeklin üçgenlemesini bulmaya çalışır. Her iki çokgen arasında boşluk eklemeyin.
danijar
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.