Onaltılık haritada eşit bölgeler oluşturun


13

Örneğin, büyük bir (X by Y) onaltılık haritayı ele alarak, ülkeleri simüle etmek için onu bağlı onaltıların N bölgelerine nasıl ayırabilirim?

Amaç, farklı şekillerde, ancak eşit büyüklükte ülkelere sahip gerçek bir yaşam haritası gibi görünen onaltılık bir harita oluşturmaktır.

Yanıtlar:


13

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).

  1. Başlamak için haritayı boş altıgenlerle döşeyin.
  2. Rastgele N altıgenleri seçin . Bunlar her ülke için "kütle merkezini" temsil edecektir.
  3. Her altıgeni en yakın merkez altıgen ile etiketleyin ( Voronoi Diyagramı ). Ülke i , merkezi I'incı merkeze en yakın tüm altıgenlerin kümesidir .
  4. Her ülke için yeni kütle merkezini hesaplayın.
  5. 3. ve 4. adımları, oluşturulan bölgeleri yumuşatmak istediğiniz kadar tekrarlayın.

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.


Çok güzel ve özellikle bir örnek için +1, ama bunların biraz fazla düzenli olduğundan biraz endişe ediyorum ! Bununla birlikte, sonuçlar özellikle bu ölçekte muhteşem görünüyor ve aynı zamanda diğer yöntemleri tohumlamanın mükemmel bir yolu.
Steven Stadnicki

1
Örneğim çokgen harita oluşturma hakkındaki bir blog gönderisinden ilham aldı . Yazar, daha pürüzlü bir görünüm elde etmek için her bölgenin kenarlarına biraz gürültü ekledi (görmek için alta kaydırın). Bunu uygun bir seçenek haline getirmek için benden daha fazla altıgen kullanmanız gerekir, ancak kesinlikle yapılabilir.
Michael Kristofik

3

Deneyebileceğiniz basit bir yol.

  1. Altıgenleri rastgele seçin n. Her biri bir grup başlatır.
  2. Her grup için ilk altıgeni rastgele bir yönde genişletmeye çalışın.
  3. Seçilen altıgen etrafındaki tüm altıgenler doluysa, vurulmuş olarak işaretleyin, altıgeni değiştirin.
  4. Her grup 20 altıgen uzunluğa veya genişletilecek daha fazla alana (tüm altıgenler hafifçe vurulmuş) kadar tekrarlayın.

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.


B grubunun A grubunu sınırladığı ve gidecek başka bir yeri yoksa, muhtemelen A grubunun B grubuna düğüm vermesi için bir tamirci içermelidir. A grubu, kaybedilen düğümlerin yerini alacak genişleme alanına sahip olduğu sürece O zaman nereden başladıkları önemli değil. Çünkü bu bir tür "geri çekilme" gibi davranıyor.
MichaelHouse

Belki de bir kerede bir ülkeye başlamak, önce köşe gruplarını oluşturmak, sonra kenarları istediklerimi verecek diye düşünüyorum. Eve geldiğimde deneyeceğim.
MadCatPT

@ Byte56 Evet, aslında öğle yemeğim boyunca böyle bir şey düşündüm. Köşeli grubun büyüyecek bir yeri yoksa, sadece başka bir grubun altıgenini alır ve bu grubun bir sonraki yinelemede boş bir alan bulmasına izin verir. Gerçi 2 köşeli grubun birbirlerine sonsuz zorbalık yapmasını önlemek için biraz koruma sağlamalıdır.
petervaz

Gerçek ülkelerin genellikle nehir veya dağ sınırları vardır. Rastgele bir yönde genişlerken, bir sonraki altıgen bir nehrin ya da bir dağ sırtının diğer tarafındaysa genişleme olasılığını azaltmayı deneyebilirsiniz.
amitp

@amitp Eğer OP bu faktörlerin açıklanmasını bekleseydi muhtemelen bunlardan bahsederdi. Ben sadece orijinal öncüllerin içinde çalıştığımı varsaymıyorum.
petervaz

2

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.


2

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:

  • Haritanın bazı somut bölümleriyle düz çizgilerle kabaca eşit boyutlu parçalara başlayın (örneğin, 6 ülke istiyorsanız, haritayı üç yatay dilime bölebilir ve ardından bu dilimlerin her birini 'diyagonalde' bölebilirsiniz. iki parçaya). Bu, özellikle çok kesin olması gerekmediği için (aslında, muhtemelen çok kesin olmamalıdır) programlı olarak açık bir şekilde kolaydır.
  • Bir 'sınır' veri yapısı oluşturarak bölüme ilk geçişi yapın: şu anda farklı bir ülkeye ait olan bazı komşuları olan altıgenler kümesi. Bu aynı zamanda her ülkede kaç tane altıgen bulunduğunu hesaplamak için iyi bir zaman 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.

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.