Rastgele 2D çizgiler arasında boşluk doldurma


23

Rastgele çizgilerle dolu bir bölge (2B) düşünün (aşağıdaki Şekil). Dört sınır kenarı içeren çizgiler arasındaki boş alanları bir şekilde doldurmakla ilgileniyoruz:

0- parsel büyüklüğünün maksimize edilmesi;
1- doldurma parsellerinin şekli yatay veya dikey olarak kare şeklindedir;
2 - doldurma parsellerinin şekli karedir, yani gevşetilmiş hizalama ;
3- Dolum parsellerinin şekli herhangi bir dörtgendir. asıl sorumuz

Şimdilik üç farklı senaryo var. Satırların ayarlanmış, gerçek sayılardan oluştuğunu
unutmayın .[x1,y1,x2,y2]

[* * *] Olası çözümler / algoritmalar / kod parçacıkları / vb. Fikirleri memnuniyetle karşılar.

görüntü tanımını buraya girin


Güncelleme 1: İlk durum için bir çözümü yönetebiliriz:
görüntü tanımını buraya girin
Adımlar:
1- satırlar
2- satırları bir bitmap halinde rasterleştirir
3 - yakındaki hücreleri istenen rengin her hücresi için (yani aynı renk) en üst düzeye çıkarmak için objektif bir fonksiyonla ararlar. Alan yani hücre sayısı.

İyi çalışıyor ancak sadece ilk senaryoyu kapsıyor ve aynı zamanda yavaş.


Güncelleme 2:
Okuyucunun boşluk doldurma-döşeme kavramına aşina olduğunu varsaydık. İlham almak için linki takip edebilirsiniz. Ancak sorunumuzun farklı olduğuna dikkat edin. Boş alanı rastgele doldurmadığımız ve boyutu rastgele seçmediğimiz için. Çözüm yinelemeli olmalıdır. Tüm durumlar için, takılan parsel sayısında bir sınır yoktur. Aslında, örneğin parseller için minimum bir alan seçerek yineleme sayısını sınırlamak kullanıcıya kalmıştır. Bu, yukarıda verilen örnekte, çizgileri belirtilen boyutta piksellere ayrıştırdığımız açıktır. Diğer bir deyişle, prosedür, örneğin parsellerin azami alanı gibi kriterlere göre boş alan tamamen doldurulana kadar devam etmelidir.


Güncelleme 3:
özet:
Bir uygulama, ağır kırılmış bir “madende” çıkarılabilir sağlam 'kaya' blokların dağılımını bulmaktır. Bu, delme tasarımı, finansal değerlendirme vb. Dahil olmak üzere birçok yönden çok yararlı olabilir.
Açıklama:
Dekoratif kaya madeni (taş), dikdörtgen küpler şeklinde kesilmiş, sağlam kaya blokları olan ürünler, fiyatın büyüklüğüne bağlıdır blok. Bir bloğun uygun bir alandan çıkarılması, yani eğer kalan parçaların miktarı mümkün olduğu kadar küçükse, büyük bir kırılmaya gerek duyulmayacaktır. Genellikle, küçük kaya parçaları nispeten ekonomik bir değere sahip değildir ve atık olarak kabul edilir.
Bu yazıda soru bu tür bir sorunun çözümlerini araştırıyor.

Problem için matematiksel bir görünüm şöyle ifade edilebilir:
2D: Belirli bir 2D bölgeden çıkarılabilen tüm dikdörtgenleri, mümkün olduğunca daha büyük dikdörtgen boyutu için optimize edilmiş bazı çizgilerle bulun.
3B: Belirli bir 3B bölgeden çıkarılabilen tüm dikdörtgen küpleri, bazı alt düzlemlerle (daha iyi: çokgenler) mümkün olduğunca daha büyük blok boyutu için optimize edilmiş olarak bulun.


Bu devam eden bir araştırmanın parçası olduğundan, aşağıdaki yorumlarda sorulan bazı soruların sağlayabileceğimiz kesin cevapları yoktur. Burada verilen bilgilerin, sorunun genel resmini elde etmek için gerçekten yeterli olduğuna inanıyoruz. Bununla birlikte, toplum yararları için elimizden gelen bazı detayları sağlarız.
Nihai sorunun çözümünde bazı kısıtlamalar getirebilirsiniz, ancak daha sonra eklemenin her zaman mümkün olduğunu düşünüyoruz. Örneğin, aşağıdakileri takip edin:
Yukarıda belirtilen koşullar altında çıkarılacak olan {2D case} Bir bloğun en iyi boyutu (ekonomik olarak en uygun dikdörtgen) , örnekteki bölge için 1x1 mverilmiştir 10x10 m. Bu, ekonomik değere dayalı olarak tanımlanan bir kısıtlamadır. Kesme vb için minimum uygulanabilir boyut0.15x0.15 m; yani bu ikinci boyut sınırı.
görüntü tanımını buraya girin
Yukarıdaki şekil blok büyüklüğüne bağlı olarak ekonomik değer fonksiyonunu göstermektedir. Yani bu özel durum için her kaya parçası 0.15x0.15 msadece atıktan daha küçüktür . 1.7x1.7 mÇalışma sınırlarından daha büyük blok büyüklüğü olmayacaktır .


3
@RK - Katılmıyorum. Daha önce aradıklarını çok net bir şekilde belirtti. Elbette birden fazla olası çözüm var ama hepsinin faydalı ve oy kullanmasını durduracak hiçbir şey yok.
GIS-Jonathan

1
Bu oldukça matematik ağır olabilen bir algoritma sorusu olduğundan, denemek isteyebilirsiniz - math.stackexchange.com
GIS-Jonathan

1
Yakından ilişkili: gis.stackexchange.com/questions/27303 . @RK'nin belirttiği gibi, bu sorunun kesin bir cevabı yoktur, çünkü yeterince iyi bir şekilde ifade edilmemiştir. Kaç tane dikdörtgen girilebilir? "Boyutu büyütmek" ne anlama geliyor? Bunun da, “rastgele fayans” sorunu olmadığını unutmayın: çizgiler yalnızca tamamlayıcıları aracılığıyla işgal edilebilecek alanları belirler; çözümler kesinlikle olacak değil rastgele. Ayrıca, kolay bir basitleştirmenin derhal mevcut olduğunu unutmayın: sorun, komplemandaki her bir bileşen içerisinde ayrı olarak çözülebilir.
whuber

1
@whuber: Onunla ilgilendiğimiz bir uygulama, ağır kırılmış bir “madende” çıkarılabilir sağlam 'kaya' blokların dağılımını bulmak. GIS, bu sorun için umut verici görünüyor, bizce. Bunu da soruya ekledik. GIS topluluğunun ilgili diğer belirli problemler için fikirden fayda sağlayabileceğini tahmin ediyoruz. Neyse, eğer onu geçirirseniz size kalmış;)
Geliştirici

4
@Whuber'ın önerdiği gibi, bu gerçekten bir GIS sorusu değil (burada sorulmasından rahatsız olmama rağmen.) Hesaplama geometrisi veya optimizasyonu için bir forumda cevap alma şansınız çok daha yüksek olacak.
Llaves

Yanıtlar:


2

FME (Güvenli Yazılım ile) kullanarak büyük bloklardan küçük bloklara kadar yinelemeli bir şekilde nasıl çalıştığınıza dair bir fikrim var.

  1. İlgi alanı "BoundingBoxReplacer" kullanın.
  2. Yerel bir koordinat sistemine yeniden gönderin (daha sonra için “metre / metre cinsinden” döşemeniz gerektiğinde)
  3. "Tampon" trafo ile satırları tamponlayın. Sadece isteğe bağlı bir boyuta ihtiyacınız var, örneğin 0,01 ft / metre. Burada aradığımız şey bir sonraki adım için çizginin çokgenidir.
  4. Bir "Treyler" Transformatörü ekleyin. Metre veya Metre olarak büyük (tahmini veya başka bir) Döşeme Boyutu belirtin. Burada yaptığımız şey ilgi alanını kare bloklara döşemek. Veri setine bağlı olarak gerçekten büyük aykırı değerlere sahip olmak için büyük başlayabilirsiniz.
  5. Bir "Clipper" transformatörü ekleyin. Burada yaptığımız şey, esasen hangi karoların iyi / kötü olduğunu görmek için veri setini dilimlemek. Çıktıda, "İç" olan karolar çok büyük. Ancak, "Dış" olan fayanslar yeterince büyüktür ve kesmeye hazırdır ...
  6. İşte karmaşık olduğu yer ama zor değil ... Trafoyu tekrar saracağız, böylece orijinal BoundingBox'ı tekrar kullanacağız, ancak kesmeye hazır olan alanları keseceğiz. Bu nedenle, bir kesme makinesi ekleyin ve kesme makinesini önceki kesme makinesi çıkışındaki "Çıkış" döşemeleri olarak yönlendirin. Şimdi tekrar çalışmaya hazır olan tek bir poligonumuz var.
  7. Daha küçük bir karo belirterek, karoyu tekrar kullanın. Örneğin, daha önce 100 metre karo kullandıysanız, 90 metre deneyin.
  8. Giriş kesme makinesi arabelleğe alınmış çizgiler ve giriş kesme makinesi giriş olarak daha küçük döşemeler olacak şekilde başka bir kesme makinesi ekleyin.

Her seferinde daha küçük fayansları kullanarak, durulayın ve gerektiği kadar tekrarlayın. Tek bir yaklaşım olarak kullanacağım bir tezgahın başlangıcını ekledim.

(Ayrıntılı) açıklamasına dayanarak, şimdilik yalnızca seçenek 1 ile çalışacaktır. Henüz çok fazla zaman ayırmadan.

Her neyse, bu, buğdayı en azından samandan filtrelemek için başlayacağım tek bir yaklaşım.

FME Çini Örneği

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.