Prosedürel olarak oluşturulmuş bir haritada bölmeler ve boğuşmalar nasıl belirlenebilir?


40

Tanımlanmış bir deniz seviyesi ve inanılır bir yükseklik haritası olan Voronoi hücrelerini kullanarak prosedürel olarak oluşturulmuş bir haritam var.

şimdiki

Şimdiye kadar, belirli coğrafi özelliklerin etiketlenmesinde başarılı oldum: kara, okyanus, göller, nehirler, nehir ağrıları, izdihamlar, dağlar ve biyomlar. Biyomlar arasında tundra, boreal orman, otlak ve ılıman orman bulunur. Orada birkaç başka biyom da var, fakat amaçlarıma göre şu anda önemli değiller.

Bir sonraki bölümdeki koyları ve boğazı etiketlemek istiyorum, ancak bunun doğru şekilde yapılması konusunda bir zararım var. Bir koy, doğrudan okyanusa bağlanan gömme, kıyı suyudur.

Boğaz, okyanusun iki bölgesini birbirine bağlayan doğal olarak oluşturulmuş, dar bir su yoludur. Temel olarak, iki toprak parçasının neredeyse temas ettiği ve her iki tarafta da okyanus bulunan yerler. Ayrıca "kanal" olarak da adlandırılır.

Özellikleri belirlemek için, şöyle bir özelliği kullanarak herhangi bir özelliğe geçebilirim:

for each (var feature:Object in geography.getFeaturesByType(Geography.LAND))
  // loop through lands
  for each (var cell:Cell in feature.cells)
  // loop through cells
    for each (var neighbor:Cell in cell.neighbors)
    // loop through a cell's neighbors
      trace(neighbor.hasFeatureType(Geography.LAND));

8
Baysian sınıflandırıcı öneririm.
Birikim

1
@Accuculation Bu "bay" konulu bir mesaj mı, yoksa bu ciddi bir öneri mi? İkincisi, bu konuda uygun bir cevap yazmalısınız.
Philipp

% 99'u şaka yaptığına eminim.
Olin Kirkland

Yanıtlar:


29

Dragons Abound’un koyları belirleme şekli sahil şeridinde yürümek ve sahil şeridinde iki nokta bulmaktır; burada noktalar arasındaki düz çizgi mesafesi noktalar arasındaki sahil şeridi boyunca olan mesafeden daha azdır. Bu, iki nokta arasındaki sahil şeridinin sinülozudur . Sinüslilik sınırını ve noktalar arasındaki düz çizgi mesafesi sınırlarını seçerek, dar derin bölmeleri, geniş sığ bölmeleri vb.

Bu resimde, kırmızı ve mor noktalar, iki aday noktayı gösterir ve yeşil çizgi, noktalar arasındaki sahil şerididir. Sinuosity bu iki uzunluk oranıdır:

Körfez Örneği

Alternatif olarak, kıyıdaki iki noktayı seçebilir ve iki noktayı ve kıyı şeridini iki nokta arasına bağlayarak çokgen oluşturabilirsiniz (yani yukarıdaki yeşil çizgiyi kırmızı noktadan mor noktaya bağlayın). Bu çokgenin alanını ölçün. Bir koy, koy olmayan bir alandan daha geniş bir alana sahip olacaktır.

Tecrübelerime göre, bu iki önlemin bir kombinasyonu, insanların koy olarak gördüklerini güvenilir bir şekilde belirlemek için en iyisiydi.

Bunun ayrıca puanları tespit edeceğini unutmayın. Yalnızca koyları bulmak için koyun "iç" inin toprak içermediğini ve su içerdiğini kontrol etmeniz gerekir. Bunu yapmanın hızlı ve kolay bir yolu, su olup olmadığını görmek için iki nokta arasındaki çizginin orta noktasını kontrol etmektir. (Bu kandırılabilir, ancak genellikle yeterlidir.)

İlgili bir sorun, körfezin "ağzını" tanımlamaktır - yani körfeze açılan iki nokta için en iyi seçimdir. Genellikle "ağız" için bir sürü adayın olur. Yukarıdaki örnek haritada, o bölmenin ağzını daha ileriye veya dışarıya koyabilirsiniz. Genel olarak söylemek gerekirse, çok fazla önemi yoktur, ancak oldukça iyi çalışan bir sezgisel görüş ağız boyunca düz çizgi mesafesini en aza indirmektir.

Henüz bir sıkıntı yapmadım, ancak sezgim diğer sahil şeridindeki en yakın noktayı bulmak için sahil şeridi boyunca noktaları kontrol etmektir; Bu, belirlenmiş bir sınırın altındaysa, bir boğazdır.


3
Dragons Abound'un ihtiyacım olan cevaplara sahip olacağını bilmeliydim.
Olin Kirkland

48

İlgilendiğiniz özellikleri yalıtmak için görüntü işleme dönüşümlerini kullanarak kaba bir fikir:

  1. Tüm okyanus hücrelerinin maskesini oluşturmak için bir okyanus hücresinden bir sel dolgusu uygulayın. Nehirlerinizin nasıl kurulduğuna bağlı olarak, okyanus maskesinin iç kısımlardan akmasını önlemek için ekstra bir yükseklik veya boşluk kriterine ihtiyacınız olabilir. ;)

    Okyanus Maskesi

  2. Bu maskenin kenarına yerel bir düzleme uygulayın, bağlılığı / topolojiyi aynı tutarak, rahatsız edici olabilecek küçük gürültülü kıyı şeridi özelliklerini yumuşatın. Bu, küçük girişler üzerindeki büyük koylara odaklanmamızı sağlar. Koruduğunuz özelliklerin ölçeğini hassas şekilde kontrol etmek için filtre çekirdeğinizin genişliğini / yineleme sayısını kullanabilirsiniz.

    Burada birkaç kez bir medyan filtresi uyguladım. Hücresel otomatlar, gürültülü bir girişten pürüzsüz şekilleri aşındırmanın bir başka popüler yoludur.

    Düzleştirilmiş kıyı şeridi

  3. Maskeyi, her bir hücrenin düzleştirilmiş kıyı şeridinden olan mesafesini sakladığı bir mesafe alanına çevirin.

    Mesafe alanı

Şimdi bazı ümit verici özellik olayları görüyoruz. İmzalı bir mesafe alanında, hem bölmeler hem de boğazlar, keskin kenarlar olarak görünür ve mesafeler yanlara düşer. Bu çıkıntıları açmak için bir kenar algılama filtresi kullanabiliriz:

Vurgulanan Sırtlar

Daha sonra bağlantısını belirlemek için sırtı takip ederek koyları ve boğazları ayırt edebilirsiniz. Bir koy sahile doğru uzanan, bir noktaya gelene kadar daha sığ ve daha sığ (karadan uzakta) olan bir sırttır. Boğaz, yüksek mesafeli bir bölgeyi başka bir yüksek mesafeli bölgeye bağlayan ve yol boyunca daha düşük mesafeli bir bölgeden geçen bir sırttır.

Veya, başka bir yol, her adaya bir kimlik (bağlı bileşen araması) atamak, ardından mesafe alanınızı oluştururken mesafe sınırının yanında "en yakın ada kimliği" ni yaymaktır. Bir koy ya da giriş daha sonra her iki taraftaki aynı kara kütlesine bitişik sudaki bir çıkıntı iken, bir kanal iki farklı kara kümesine bitişik suyu ayıran bir sırttır.

Mesela aşırı dar / geniş şeritleri hariç tutmanız gerekirse, hangi özellikleri etiketleyeceğini kontrol etmek için minimum ve maksimum kıyıdan uzaklığa veya sırt uzunluğu sınırlarını ayarlayabilirsiniz.


9
Bu gerçekten harika görünüyor ve muhtemelen grafik gösterimi yerine çeşitli adımları uygulamak için doğrudan hücre yapısını kullanarak büyük ölçüde hızlandırabilir!
Quentin

7
İkinci yaklaşım (her biri ayrı kara kütlesine bir kimlik verilmesi ve su kütlesinin her iki tarafındaki aynı kara kütlesi olup olmadığına dayanarak ayırt edilmesi) yapılacak en kolay şey gibi gözüküyor ..
Monty Harder

“Kara kütlesi kimliği” yine de iyi bir fikirdir, çünkü ada adlarını oluşturmak için harita etiketinde de ihtiyacınız olacak.
MSalters

6

Temel olarak, tam olarak bir koy veya boğaza göre ne demek istediğinizi ve neden farklılaştırmak istediğinizi düşünmeniz gerekir (AI hesaplamaları için mi yoksa yer işaretlerini veya başka bir şeyi mi etiketlemek için)? Size en uygun olanı bulmak için birkaç tanımla oynayın. Ardından, Voronoi hücrelerini kontrol etmek için koşulları formüle edin. Birkaç öneri:

Defne

  • Sadece tek bir okyanus hücresine bağlanan her okyanus hücresi
  • VEYA: Okyanus hücrelerinden daha fazla alana bağlanan tüm okyanus hücreleri, tüm okyanus hücreleri yan yana
  • VEYA: Yukarıdakiyle aynı, ancak sınır uzunluğuna dayalı bir kriter ile (örneğin, su sınırının iki katı kadar)

şerit, geçit

  • Yan yana olmayan tam olarak iki okyanus hücresine bağlanan herhangi bir okyanus hücresi
  • VEYA: Aynı kara toprağına ait olmayan iki kara hücresine bağlanan herhangi bir okyanus hücresi (önce hangi kara hücrelerinin bağlı olduğunu bulmanız ve her kara topluluğuna kimlik atamanız gerekir)
  • VEYA: Sınır boyunca yürüyüş yapın ve kara / su ve su / kara geçişlerini sayın. Her birine en az iki tane lazım.
  • Metodunuza ve kategorilerle ne yapmak istediğinize bağlı olarak, sadece bir körfeze açılan şeritleri ortadan kaldırmak ya da onların yerine körfez olarak etiketlemek isteyebilirsiniz.

2
Bir boğazı bir körfeze götürdüğünde, bu ikisi birlikte fiyort olarak etiketlenebilir.
Philipp

1
Hücreler bir koy / boğazın boyutuna göre küçükse, hemen komşu komşuların ötesindeki hücrelere bakmak için bunu yaymanız gerekebilir.
DMGregory

Evet, ölçeklendirme biraz sorun yaratır ve şeyleri nasıl tanımladığınızı ve “hücreleri” nasıl tanımladığınızı etkiler. Bir Kanada haritası düşünün ve aşağıdakileri karşılaştırın: Hudson Körfezi, James Körfezi, St Lawrence Körfezi ve Fundy Körfezi. İstediğiniz ilgili isimleri almak için bu kuralları nasıl güvenle uygularsınız? - Newfoundland ve Nova Scotia arasında bir "düz" var mı?
TheLuckless
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.