Prosedürel adada bölgeler oluşturmak


29

Şu anda bu gibi görünen adalar var:

ada

Ve prosedürel olarak bölgelere bölmek istiyorum, bunun gibi:

bölgeleri olan ada

Ne aradığım algoritma ne? Alt resimde olduğu gibi tutarlı bölgeler oluşturma konusunda önerileriniz var mı? Yardımın takdire değer.


Bu ada görüntüsünü ilk etapta nasıl aldın? Siz ürettiniz ve öyleyse, nasıl başardınız?
Vaillancourt

Çevrimiçi harita oluşturucusundan aldım.
domisum

Cevabımı güncellemedeki gecikme için üzgünüm - başlangıçta planladığımdan daha uzun sürdü. Bazı resimler ve linkler ekledim.
Pikalek

Bunu bir çevrimiçi jeneratörden aldıysanız, Azgaar'ın Fantasy Map Generator'üne bakmalısınız . Özelleştirilebilir parametrelerle bölgeleri ve isimleri var ve WB.SE merhaba diyor. Bu bir github, bu yüzden kodlarını kontrol edebilirsin.
Anoplexian - Monica

Yanıtlar:


40

Gerçek dünyada, bu il sınırları genellikle nehirler gibi jeolojik özellikleri takip eder.

Öyleyse, belki de iyi bir yaklaşım adanın jeolojisini modellemek ve sınırlar bundan düşmek olabilir mi?

Red Blob Games bu konuda güzel ve başarılı sonuçlar elde etti.

Onun yaklaşımı kullanarak dahil görünüyor Voronoi mozaikleme ve hücreler arasındaki sınırları gibi nehirler tanımlar.

Sitesindeki diğer makalelere göz atın, harita oluşturma konusunda birçok yazı yazdı .

ada


3
Gerçek dünyada, siyasi veya idari bölümlerin bazen keyfi bölümlere, genellikle düz çizgiler (örneğin enlem / boylam çizgileri boyunca, dağ zirveleri arasındaki çizgiler vs.) olduğuna dikkat edin.
Pablo H,

2
@PabloH İyi nokta, düz sınırlar mediaval sonrası sömürge dönemi olayı gibi görünse de. Ancak OP'lerin sorununun ayarını bilmediğimiz için, bu konu ile ilgili olabilir
Sentry,

27

Bu problemi Voronoi diyagramlarının iki geçişi ile çözerdim:

İlk Geçiş: Bölge Bölümlemesi

İlk geçiş, adayı kabaca bölgelere ayırmak için noktaların bir miktar seyrek dağılımını (yani noktalar arasındaki mesafenin göreceli olarak büyük olması gerekir) kullanır (nokta oluşturma ile ilgili aşağıdaki notu okuyun). Daha sonra bu noktalara dayanarak bir Voronoi diyagramı oluşturun. Bu, adayı aşağıda gösterildiği gibi her nokta etrafındaki poligonal bölgelere böler:

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

İkinci Geçiş: Sınır Rastgele

Şimdi adanın bölgelere ayrıldığını, sonra bir sonraki adım aralarındaki sınırları 'kaba' hale getirmektir. Bunu yapmak için, daha kompakt bir nokta dağılımı kullanarak yeni bir nokta katmanı oluşturun (yani, noktalar arasındaki mesafe küçük olmalıdır) ve yine başka bir Voronoi diyagramı oluşturmak için bu noktaları kullanın. Daha sonra her küçük bölge için, 'tohum' noktasını kontrol ederek daha büyük bir bölgeye atayın. Bu, daha büyük alt bölümler arasında daha bozuk bir sınırla sonuçlanacaktır. Her iki Voronoi diyagramının yerinde olmasıyla nasıl göründüğünün bir listesi:

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

Ve işte aynı bölge sadece son sınırları gösteriyor:

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

Nokta Üretimi Üzerine Yorumlar

Nokta oluşturma konusunda, puanların nispeten iyi ve eşit bir şekilde dağılmasını sağlamak için bir Poisson disk dağıtımı kullanmayı seviyorum . Diğer bir ortak seçenek, benzer şekilde eşit bir dağılım elde etmektir, Lloyd algoritmasını 'düzenli' rastgele noktalarda kullanmaktır. LLoyd'ların kodlaması daha kolaydır, ancak istenen sonucu vermek için kaç tane geçiş yapılması gerektiğine karar vermek için biraz deneme yanılma alabilir.

Bu yaklaşımla ilgili olası bir sorun, ilk geçiş bölümlemesinin bazı çok küçük bölgeler oluşturabilmesidir. Onları nihai sonucunuzda istemiyorsanız, onları rastgele bir bitişik bölgeyle birleştiririm.

Son Notlar

Sağladığım resimler raster görüntüler, ancak bu teknik aynı zamanda poligonal / vektör gösterimleri ile de çalışıyor.


1
Prosedürel kat planları için yaptığım şey bu, bölge (ada) içerisindeki noktalardan bir Voronoi diyagramı çizin, bir ızgara oluşturun (sizin durumunuz için deforme olmayan bir ızgara) dikdörtgen şeklinde olması gerekmez, daha sonra gridin ve Voronoi'nin boolean kesişimlerini hesaplayın, alanları hesaplayın ve en küçük grid hücresinin 0.6 yüzdesine göre bir veri ağacına (liste, pürüzlü dizi vb. bazı kayıp hücreler elde edersiniz, ancak ağacınızı bulmak ve yeniden atamak için toplanmış ızgarayı orijinalle karşılaştırabilirsiniz.
Felipe Gutierrez

Resimler eklediniz! Bu kesinlikle farklı bir amaç için yapıyorum
Felipe Gutierrez

4

MineCraft bunu çok iyi yapıyor ve dünya üretim algoritması iyice analiz edilip belgelenmiştir.

Algoritmanın çeşitli açıklamaları var, bunlardan biri burada: https://github.com/UnknownShadow200/ClassiCube/wiki/Minecraft-Classic-map-generation-algorithm

Algoritmanın çekirdeği bir Perlin gürültü üretecidir . Bu, doğrudan yükselmeyi kontrol eder (az ya da çok, mağaraları oymak için bir sonraki adım, yüzeyi de değiştirebilir), ayrıca biyom üretme. Biome üreteci gibi bir şey muhtemelen alanlarınızı oluşturmak için kullanmak istediğiniz şeydir.

(Eski bir versiyonu) belgelenmiştir , temel olarak bir tanesi "sıcaklık" için, biri "çökeltme" için bir tane olmak üzere iki farklı Perlin Gürültü jeneratörü kullanarak, daha sonra bu ikisinden biyimi seçerek çalışır. Değişkenlerin kendileri (sıcaklık ve yağış) oyunda daha sonra kullanılmazlar; örneğin, çöllerin yağmuru yoktur, ancak oyun bunu orijinal yağış değerinden değil “çöl” özelliğinden belirler.

Rasgele bir tohumdan biyom haritası oluşturmak için çeşitli çevrimiçi araçlar vardır, bunlardan biri mineatlas.com'dur . Sanırım, dahili olarak, MineCraft'ın kendi iç sınıflarını kullanan bir java sunucusu kullanıyorlardı; Kaynak kodlarından birinin doğrudan kullanılabilir olup olmadığını bilmiyorum.


4

Örneğin, Azgaar ( kaynak kodu ) tarafından kullanılan tipik bir algoritma . Kabaca böyle:

  1. Kara kütlelerini daha küçük alanlara ayır, örneğin, üçlü üçgenleme veya voronoi hücreleri.
  2. kültürleriniz, alemleriniz, dinleriniz veya neye benzemek istediğinizi belirlemek için (rastgele veya başka türlü) "başlangıç" konumlarını belirleyin.
  3. (rastgele veya başka şekilde) her biri için bir "büyüme faktörü" belirler. Büyüme faktörleriniz ne kadar fazla olursa, son haritanız o kadar düzgün olur.
  4. Şimdi alemlerinizi (vb.) Tekrarlayın ve büyüme faktörüne bağlı olarak, tüm harita dolana kadar onları çevreleyen, boş fayanslara yaymalarını sağlayın.
  5. Muhtemelen, sınırları sadece bir komşusu olan ve kendi renginde farklı olanlarla çevreleyen hücreleri değiştirerek sınırları biraz düzelterek bitirmek istersiniz.

3

Bunu raster tabanlı yaklaşımlardan ziyade vektörel biçimde yapmakla ilgileniyorsanız, bir süre önce bir blog yazısı yazdım.

http://blog.particracy.com/worlds-and-their-geography/

Buradaki fikir, bir mesh (genellikle Voronoi) ile başlar ve bölgeleri yeterince aralıklı olarak rastgele ekilmiş noktalardan eş merkezli olarak büyütürsünüz.


2

Ne eğlenceli bir soru :) Bu yaklaşım biraz Vornoi hücrelerine dayanıyor ancak uzaklık ölçüsü tam Öklid değil (2.0 yerine 1.5 gücünü kullandım) ve bunun içinde bir miktar rastgelelik var. İdeal olmayan suyun üstünden atlayabilir.

Yakındaki bölgeler daha ilginç şekiller elde etmek için bir araya getirilebilir; burada bunu belirlemek için en yakın N'yi kullandım.

Eğer ilgileniyorsanız daha fazla ayrıntıya girebilir ve Python kodunu paylaşabilirim.

harita 1 harita 2

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.