Çokgen Çizgileri


11

Bir satırları çokgenlere dönüştürmek için izin verecek algoritmanın "adı" bulamadı. Bu konular CBS ile hesaplama geometrisi ve bilgisayar bilimi alanlarını aştığı için. Karışıma başka ne ekleyeceğimi bilmiyorum. Başkalarının ilk arama kriteri seçimini neleri dikkate alacağını bilmek istediğimden, aradıklarımın bir listesini sunmak konusunda isteksizim.

Senaryo ... Çizgilerim var (bir çizgi oluşturmak için iki noktaya ihtiyacım var) ... her çizgi en az bir başka çizgiye bağlı. Bağlı çizgiler arasındaki ara boşluk çokgen oluşturacaktır. En basit senaryo bir üçgen ... bir dikdörtgen ... ve biri çok bölümlü özelliklerin ötesine geçebilir.

Herhangi bir belirsiz açıklama için özür dilerim, ama dediğim gibi, olası çözümlere daha önce ziyaret ettiğim bir yolda rehberlik etmek istemiyorum, çünkü son çözüm kadar "ilk düşünceye" ilgi duyuyorum.


Çizgiler çakışabilir mi? Çizgiler kesişebilir mi? (yani temiz mi?) Öyleyse, umarım bu süreci derleme çağırmak çok özel uygulama olmaz.
Kirk Kuykendall

Kirk Çakışma satırları ve diğer "kusurlar" çokgenler oluşturulmadan önce kaldırılmış olurdu ... Çeşitli CBS paketlerinde (örn. Arcgis) uygulandığından emin olduğum "algoritma adını" bulmaya çalışıyorum. Kısacası, tüm dejenere koşulların ele alındığını ve çokgenler inşa edebilmeniz gereken düğümlerde çakışan temiz çizgiler (2 nokta çizgisi) bırakıldığını düşünün. Anahtar şu ki, çizgiler var, dejenere koşullar yok ve araya giren alanın çokgenlere dönüştürülmesi gerekiyor. Teşekkürler

Noktalar uçakta mı yoksa küre mi?
Kirk Kuykendall

Kirk ... Bir düzlemde, metrik x, y koordinatları, küresel koordinatlar değil. Örneğin, bir voronoi diyagramı oluşturacak çizgi parçalarına sahip olduğunuzu, ancak sahip olduğunuz tek şey, onu oluşturan segmentler olduğunu, ancak buna yol açan gerçek veri yapısını değil. Kısacası, her bölüm birbirine bağlıdır ve her bölüm benzersizdir.

Yanıtlar:


4

Belki "alan dolgusu"? Buraya ve buraya bakın .

Düzenle

Başka bir olasılık da kısıtlı üçgenleme . (Bağlantı, fare ile bir grafik çizmenizi ve daha sonra onu üçgenlemek için bir düzlem tarama algoritmasını gösteren bir Java uygulamasına aittir.) Bu nasıl bir üçgenlemenin sonucu, nasıl yapılırsa yapılsın, kolayca işlenebilir istenen çokgenleri oluşturun: yeni oluşturulan bir kenarı paylaşan tüm komşu üçgenleri birleştirin.

Misal

Orijinal grafik:

Orijinal grafik

Üçgenleştirilmiş grafik:

resim açıklamasını buraya girin


Ben buna rastlamadığımdan beri oylanacak ... çeşitli disiplinlerdeki insanlardan gelen diğer yorumları sınırlamak istemiyorum.

Her ne kadar, büyük ölçüde raster dolgularla uğraşmakla birlikte, bu en yakın cevaptır. Raster veya vektöre bağlı olmadıkça hala bir algoritma ismim yok, ancak bir "süpürme" algoritması yeterli olabilir, ancak koordinatların neden X yerine Y'ye göre sıralanacağını anlayamıyorum ( çoğu dilde uygulanması kolaydır).

@Dan Y veya x ile sıralama önerdiğiniz gibi önemsizdir. Düzlem süpürme veya çizgi süpürme algoritmalarının da dahil olduğu doğrudur, ancak maalesef bu neredeyse tüm hesaplama geometri prosedürlerini kapsayan genel bir tekniktir, bu nedenle özellikle algoritmanızı aramak için uygun bir terim değildir. Bu özel sorun olduğunu Not değil bir düzlemde (veya küre) içine karmaşık ise poligonun bir gömme içerir ve iyi bir algoritma böylece çünkü, tamamen grafik-teorik gerekir gerçekten bir alan dolgu sorundur yüzden: katıştırma hakkında bilgi korumak kalpte.
whuber

5

Olarak grafik teorisi , olarak adlandırılan bu işlem hesaplama dönük . Bu hesaplama ile ilgilidir çift belirli bir grafik.

Örneğin, GeOxygène java kütüphanesinde, bir grafiğin ( CarteTopo olarak adlandırılır ) yüzünü almak için getFaces yöntemi vardır .

Bu denir Çokgenselleştirme içinde JTS


İyi bağlantılar. Bununla birlikte, hepsi @ Dan'ın probleminin zaten çözüldüğünü varsayar: bir grafiği "düzlemsel" olarak çağırabilmeniz, çokgen yüzleri zaten tanımladığınız anlamına gelir. Öncelikle keyfi bir yay koleksiyonunu (düzlemde) dürüst-iyilik düzlemsel grafiğe nasıl dönüştürdüğünü bilmek istiyor. Bu, DCEL gibi "topolojisinin" bir temsilini oluşturmayı gerektirir.
whuber

Çok teşekkürler whuber, sen bir bilgi kaynağısın! Birisinin nasıl bu kadar parlak olabileceğini merak ediyorum.
julien

4

RepRap ana bilgisayar yazılımı, çizgi segmentlerinin bir listesini (bazı bilinmeyen rasgele sırayla) yapmaya çalıştığınız şeye benzeyen çokgenler listesine dönüştürür.

Özellikle, RepRap "uç eşleştirme" algoritması bir grup patolojik durumu ele alır.

Ne yazık ki, RepRap yazılımı her köşenin kendisine eşit sayıda kenar olduğunu varsayar - normal bir nesnenin köşesine giden 2 çizgi; Bir nesnenin köşesi başka bir nesnenin köşesine dokunduğunda 4 satır birlikte gider, vb. Genellikle her köşeye giden 3 kenarı olan voronoi diyagramlarını işlemek için bu algoritmayı uyarlamanın ne kadar zor olacağını bilmiyorum.


+1 İlginç bul! Yine de dikkat edin: Bu yazılım, çizgileri çokgenlere bağlama ile ilgili birçok sorunu çözebiliyor gibi görünse de, çok fazla şey yapabilir : istenmeyen özellikleri de basitleştirmeye çalışıyor gibi görünüyor, bu da istenmeyen bir yan etki olabilir. (Örn, topolojik bütünlüğü yok edebilir.)
whuber

3

Probleminize bir çözüm bulmak için GRASS'ın kod tabanını araştırdınız mı? -> http://old.nabble.com/Polyline-to-Polygon-operation-td20257839.html


1
Teşekkürler ... ama belirli bir "paketlenmiş" çözüm aramıyorum ama altta yatan algoritma ve / veya GIS, Comp Geom ve / veya Comp

Özellikle benim bağlantımda bahsedilen 2 işlemin arkasındaki kaynak koduna bakmanın size yardımcı olabileceğini düşünüyordum.
oeon

Ben bir şey eksik sürece bu sayfalarda herhangi bir liste görmüyorum çünkü kodu görmek için yazılımı yüklemek zorunda kalacak sanırım.

1
GRASS kaynağına çevrimiçi göz atabilirsiniz: trac.osgeo.org/grass/browser
underdark

@underdark İşaretçi için teşekkürler. Bildiğim kadarıyla söyleyebilirim olarak main.ciçinde v.typekaynağı olur tüm özellikler yeniden etiketli sınırları gibi olmasıdır: hiçbir gerçek işlem oluşur. Geçmişe bakıldığında bu çok şaşırtıcı değil: eğer (kesin olarak bilmiyorum) özellikler tam 2D ​​topolojik bilgilerle korunuyorsa, çokgen bölgeleri tanımlamak için tüm hesaplama özellik oluşturma veya içe aktarma sırasında otomatik olarak gerçekleşti ve tüm coğrafi işleme işlemleri.
whuber

3

alo

Aradığınız şeyin belirli bir algoritma olduğunu düşünmüyorum. Veri kümenize bağlı olarak görev oldukça zor veya çok basit olabilir.

Sorunu en az 2 parçaya bölmelisiniz. 1) bir ağ problemi, linestringlerin kapalı halkalarının nasıl bulunacağı. 2) kapalı çizgiyi çokgen olarak ifade eder

"Çizgileri çokgenlere dönüştürme" olan ikinci bölüm, biçimin çokgen / çizgisel gösterime göre daha fazla olmasına bağlıdır. Yani:

LINESTRING (1 1, 2 2)
LINESTRING (2 2, 2 1)
LINESTRING (2 1, 1 1)

buraya:
POLYGON ((1 1,2 2,2 1,1 1))

çizgiyi çokgene dönüştürüyor, ama bahsettiğiniz şey değil sanırım. Daha zor olan kısım ilk. Spagetti çizgileriniz varsa, bunları kapalı linestring olarak nasıl sipariş edebilirsiniz.

Sanırım bu sorunun cevabı çok fazla veri setine bağlı. Kirk'ün sorduğu gibi, çizgilerin sorunu geçip geçemeyeceği çok daha büyük. Tüm "çizgi koleksiyonlarının" kapalı bir linestring'in bir parçası olduğunu biliyorsanız kolaylaşıyor. Ardından, tekrar dönene kadar herhangi bir satırı alıp yol boyunca yürüyebilir ve daha sonra yukarıdaki ikinci adıma geçebilirsiniz.

Demek istediğim, veri kümesinin durumunun nasıl yapılacağı ile ilgili tüm kuralları ayarlaması. Linestrings bir spagetti tüm olası çokgenler bulmak istiyorsanız, tüm geçişlerde tepe noktaları koymak, olası tüm yolları aramak ve benzeri dahil çok farklı algoritmalar olması gerektiğini varsayalım.

PostGIS'de işleve ST_Polygonize denir . Bu işlev, verdiğiniz linestringlerden tüm olası çokgenleri oluşturur.

GEOS tarafından gerçekleştirilir, böylece hem GEOS hem de JTS kodunda bulunan algoritmaları bulabilirsiniz.

Sadece bazı düşünceler

/ Nicklas


1

"Forward Star" algoritmasını aramayı deneyebilirsiniz. Bana jenerik olduğu söylendi, ancak şimdiye kadar okuduğum tek tartışma her zaman arcgis'e atıfta bulundu. Belki ileri yıldız için bu ders notlarında belirtilen referanslara bakınız .


1
Bu yorum önerilen çözümlerin bazılarını da ele alsa da burada yorum yapacağım: sorun bir ağda (veya grafikte) temsil edilemiyor . Çizgilerin iki boyutlu bir yüzeyde nasıl bağlandığı hakkında bilgi gerektirir . Bu nedenle, ileri / geri yıldız gösterimleri çok az faydalı olacaktır; DCEL veya benzeri bir şeye ihtiyaç duyulur.
whuber

@whuber - Dan'ın tüm "kusurların" kaldırıldığı yorumunun çizgilerin temiz olduğunu ima ettiğini varsayıyordum. Bu nedenle, bunu bir grafikteki tüm döngüleri bulma grafik geçiş problemine indirgemek mümkün olmalıdır. İlk başta Forward yıldızının, her düğümde mümkün olan en keskin sağ dönüşü alarak bir grafiğin etrafında dolaşan algoritmalara yardımcı olacağını düşündüm. Ancak, biraz daha bakıldığında daha iyi yollar var gibi görünüyor. stackoverflow.com/questions/261573/… Ancak yine de bu, sorunun bir grafik olarak yeniden ifade edilebileceğini varsayar.
Kirk Kuykendall

1
Bir grafikteki döngüleri bulmak, düzlemsel bir grafikte yüzleri bulmakla aynı şey değildir. {A, b, c, d} köşeleri ve {a, b}, {a, c}, {b, c}, {b, d}, {c, d} köşeleri içeren soyut grafiği düşünün. Devirlerin temeli a-> b-> d-> c-> a ve a-> b-> c-> a'dan oluşur. A -> (0,1), b -> (2,2), c -> (2,0), d -> (3,1) (tüm kenarların çizgi parçaları olduğu) düzleminde gömme a-> b-> d-> c-> a bir yüz değildir , ancak d'yi (1,1) 'e taşırsak , bir yüz olur. Bu, "yüz" kavramının neden grafiğin düzleme gömülmesini gerektirdiğini ve yüzlerin neden yalnızca grafiğin soyut yapısından hesaplanamadığını gösterir.
whuber
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.