Şu anda bu gibi görünen adalar var:
Ve prosedürel olarak bölgelere bölmek istiyorum, bunun gibi:
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.
Şu anda bu gibi görünen adalar var:
Ve prosedürel olarak bölgelere bölmek istiyorum, bunun gibi:
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.
Yanıtlar:
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ı .
Bu problemi Voronoi diyagramlarının iki geçişi ile çözerdim:
İ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:
Ş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:
Ve işte aynı bölge sadece son sınırları gösteriyor:
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.
Sağladığım resimler raster görüntüler, ancak bu teknik aynı zamanda poligonal / vektör gösterimleri ile de çalışıyor.
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.
Örneğin, Azgaar ( kaynak kodu ) tarafından kullanılan tipik bir algoritma . Kabaca böyle:
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.
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.