Bir dizi kesişen çizgiden çokgenler oluşturma


10

Bu, zaten farklı amaçlar için sorulan basit ve oldukça yaygın bir sorudur ( bu bağlantıya ve örneğin, aynı zamanda bakınız ), ancak burada bir yazılım paketi değil , uygulamaya çalışabileceğimiz algoritmalar arıyoruz . Python .

Böylece, aşağıda gösterildiği gibi bir dizi çizgi eşlenir (zaten kesilmiş, BTW).
Çokgenler oluşturmak için algoritmalar / fikirler (kırmızı olanlar gösterildiği gibi) ?

resim açıklamasını buraya girin


Dış kare sınırı biliniyor mu yoksa giriş satırlarından da okunacak mı?
Devdatta Tengshe

Yanıtlar:


6

Buraya , sorumuza tam bir cevap olmayan bir cevap koyduk, yani soru " cevaplamaya açık " kalacak . Ancak, söz konusu sorun için bir çözümdür. İşte kullandığımız hile:

Önce sonuçları görelim :
resim açıklamasını buraya girin

Böylece leftgösterilen çokgenlerde verilen çizgiler middle. Bunlar gösterildiği gibi gerçek çokgenlerdir right;)

İçin algoritma Kullandığımız aşağıda verilmiştir Shapelypaketi Python .

  • lines ==> MultiLineString {:: M}
  • küçük bir tane ekleyin buffer, eps{:: MB} deyin
  • region ==> Polygon {:: P} (buradaki bölge bir karedir)
  • P.difference(MB) {ortaya çıkan çokgenler}

Not operasyonda sessiz hızlı olduğunu. Bununla birlikte, eksik nokta, algoritmanın çizgilerden çokgen oluşturmak için orijinal bir yöntem olmamasıdır . Yine de elimizdeki sorun için mükemmel çalıştı.


4

JTS Topology Suite , bunu yapan bir Polygonizer sınıfına sahiptir.

Burada bulunan kaynak koduna bakabilir ve bunu Python'a dönüştürebilirsiniz.


Kod açıklamasının yazarın beklediği gibi çalışmadığını belirttiği gibi: "kenarlar doğru şekilde sallanmalıdır; yani, yalnızca uç noktalarında buluşmalıdırlar. kenarları "
Pablo

1
JTS içinde, Çizgileri köşe noktalarına doğru şekilde bölmek için bir işlem vardır. Belki OP buna da bakabilirdi.
Devdatta Tengshe

3

Python Shapely paketine, özellikle polygonize ()


Hızlı bir not biçimli o çokgenselleştir ( from shapely.ops import polygonize) kullanan GEOS.Polygonize dan GEOS . Yani bu bir bağlantı için bir bağlantı olduğu bir bağlantı ...: |
Geliştirici

İle yaptığımız denemeler polygonizehiç başarılı olmadı. Bununla birlikte Shapely, yanıt olarak gönderilen bir çözümü (aslında bir numara) bulabileceğimizi hatırlattığınız için teşekkür ederiz .
Geliştirici

2

İşte bulabileceğimiz başka bir çözüm.

Kullanarak DCELçizgilere dokunmayı engelleyebiliriz.

Python için {here} bir paket var . Bazı hatalar ile küçük bir uygulamadır. Bununla birlikte, biraz çaba ile bu sorun için kullanılabilir. Ayrıca aşağıdaki aşamalara dikkat edin:

Çizgiler arasındaki tüm kesişimlerin bulunduğu bir ön işleme aşaması. Sonra buna göre tüm çizgiler etkileşim noktalarındaki parçalara ayrılır. DCEL için gereken kesişim noktalarının ve ilişkili kenarların bir listesi.


Bu yöntem orijinal bir çözüm olduğundan ve differenceoperasyonun kullanıldığı diğer yönteme göre çok daha iyi performans verir .
Geliştirici
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.