Yanıtlar:
Lloyd Algoritmasını denedin mi? Prosedür oldukça basittir ve oldukça düzenli görünümlü bölgeler oluşturur (kaç yineleme çalıştırdığınıza bağlı olarak).
Güzel görünen bir harita oluşturmak için çok uzun süre koşmanıza gerek yok. Bu örnek sadece üç tekrar gerektiriyordu.
Deneyebileceğiniz basit bir yol.
n
. Her biri bir grup başlatır.Test etmedim ama bu Adalar üretmeli ve uzun ince parantezlerden kaçınmalıdır. Ayrıca, büyük olasılıkla komşu sınırları olacak, ancak her biri diğeriyle temas halinde olmayacak, bu yoğunluk değerine bağlı olacaktır n
.
Bazı gruplar da başkaları tarafından köşeye sıkıştırılabilir ve 20'den daha küçük boyuta ulaşabilir, başlangıç altıgenlerini minimum bir mesafede oluşturarak büyüdüğünüz alanı sağlayabilirsiniz.
Test edin ve gerekirse değiştirin.
Ayrıca, bu sorunla ilgili değil, ancak altıgenlerle çalışmak için çok yararlıdır, bu sayfayı ziyaret edin: http://www.redblobgames.com/grids/hexagons/#basics
Bir sürü onaltılık bilgiyi tek bir yerde toplar. hoş bir görsel.
Kesinlikle bir tür grafik yapının bunu mümkün kılacağını düşünüyorum. Tüm haritayı simüle etmek için yan yana olmaları durumunda temel olarak iki Onaltılı düğüm arasında bir kenar oluşturun. Ancak, bu harita içinde bir "ülke" oluşturmak için tam algoritma emin değilim. Mesele şu ki, ülkenin nasıl görünmesini istediğinize bağlı olarak farklı algoritmalara ihtiyacınız olacak.
Başımın üstünden, bir nokta seçip oradan dışa doğru hareket etmeyi, ülkenin bir parçası olmayan bitişik bir karoya sahip "büyüyen ülke" içinde rastgele bir karo seçmenizi öneririm.
İstediğiniz ülke türüne bağlı olarak algoritmaları kapatmak için bir strateji deseni kullanılabilir. http://en.wikipedia.org/wiki/Strategy_pattern yani Şili gibi ince bir sahil şeridi ülkesi mi istiyorsunuz? Yoksa daha yuvarlak ve kapsayıcı bir şey mi istiyorsunuz?
Grafik özellikleri, son "ülke" nin nasıl görünmesini istediğinizi değiştirmenize de izin verebilir: http://en.wikipedia.org/wiki/Eccentricity_(graph_theory)
Büyük bir ülke mi istiyorsunuz? Grafik özelliklerini değiştirin ve oluşturulan ülkeyi (sadece bir grafiktir), ona istediğiniz "görünümü" veren özelliklere sahip olmaya zorlayın.
Son olarak, Grafikler ülkeler arasındaki sınırları tanımlamak için de çok yararlı olacaktır. Ülkeler birbirlerini sınırlarsa, iki düğüm arasında bağlantıya sahip bir grafik oluşturabilirsiniz. Bu, oyununuzdaki bir tür bölümleme için yararlı olabilir ve geliştirme sırasında belirli şeyleri daha da optimize etmenize olanak tanır.
Küçük bir not: 'farklı şekillerde ancak eşit büyüklükteki ülkelerle gerçek bir yaşam haritası gibi görünüyor' diyorsunuz, ancak 'gerçek' ülkeler belirli bölgelerde bile büyük ölçüde farklıdır - Avrupa'nın 'büyük' ülkeleri bile büyük ölçüde değişebilir, örneğin Fransa, İtalya'nın iki katından daha büyük. Bununla birlikte, boyutları kabaca aynı tutmak için açık oyun bölgeleri var - sadece burada küçük bir varyasyonun muhtemelen iyi bir şey olduğunu unutmayın!
Soruna ilk yaklaşımım bölgelerinizi 'geliştirmek' yerine 'evrimleşmek' olacaktır:
Şimdi, istediğiniz sürece şu sahte kodu çalıştırın:
Pick a random hex A from the boundary list;
Pick a random neighbor B of this hex from a different country;
if (A's country has more hexes than B's country has) {
change hex A to belong to B's country;
} else if (B's country has more hexes than A's country has) {
change hex B to belong to A's country;
} else {
flip a coin to decide which to change;
}
if ( the changed hex's old country has become disconnected ) {
undo and reject this move;
} else {
update the boundary list around the changed hex and its neighbors;
}
Bu, iki komşu ülkenin büyüklüğü arasında kaba bir denge sağlayacaktır ve 'bağlantı kesildi' kontrolü (basit bir taşkın doldurma algoritması ile yapılabilir) hiçbir ülkenin parçalara ayrılmamasını sağlar. Sınır listesini güncellemek sabit zamanlı bir işlemdir - değiştirilen onaltılık açıkça her zaman sınırda olacaktır ve bunlardan herhangi birinin bir sınır hücresi olup olmadığını görmek için altı komşusunu kontrol edebilirsiniz (komşusu şimdi farklı bir ülke) veya sınır hücresi olmayı bıraktı (komşusu şimdi aynı ülkede olduğundan), sınır kümesini gerektiği gibi değiştirerek.
Bu yaklaşımın iyileştirilmesi için, altıgenin biraz rasgele değişmesi koşulunu bile yapabilirsiniz - her zaman iki ülkeyi 'dengelemek' yerine, her zaman belirli bir olasılıkla takas yapabilir ve hatta bu olasılığı kademeli olarak azaltabilirsiniz. kabaca aynı boyutta olmaya zorlamak için zaman (bir Simüle Tavlama algoritmasındaki soğutma işlemine benzer ).
Bunun, tüm alanların tam olarak aynı boyutta olduğunu garanti etmeyeceğini unutmayın (N, ızgara boyutunuzu mükemmel bir şekilde bölmediği sürece imkansızdır) ve tüm ülkelerin bölgede birbirlerinin altıda biri içinde olduğunu bile garanti etmez; o olmalıdır her ülke olsa da, artık onun yakın komşuları her birden altıgen büyük veya daha küçük olduğunu (yeterli tekrarlamalar aday) garanti.