Risposte:
Hai provato l'algoritmo di Lloyd ? La procedura è piuttosto semplice e genererà regioni dall'aspetto abbastanza regolare (a seconda di quante iterazioni si eseguono).
Non devi correre molto a lungo per produrre una bella mappa. Questo esempio richiede solo tre iterazioni.
Un modo semplice per provare.
n
esagoni. Ognuno inizierà un gruppo.Non ho provato ma questo dovrebbe generare isole ed evitare in qualche modo parentesi graffe lunghe e sottili. Inoltre, molto probabilmente ci saranno i confini dei vicini, ma non necessariamente ognuno sarà in contatto con l'altro, che la densità dipenderà dal valore di n
.
Alcuni gruppi potrebbero anche essere messi in curva da altri e raggiungere dimensioni inferiori a 20, puoi assicurare lo spazio cresciuto generando gli esagoni di avviamento ad una distanza minima l'uno dall'altro.
Prova e modifica se necessario.
Inoltre, non correlato a questo problema ma molto, molto utile per lavorare con gli esagoni, visita questa pagina: http://www.redblobgames.com/grids/hexagons/#basics
Aggrega un sacco di informazioni esadecimali in un unico posto con una bella vista.
Penso sicuramente che un qualche tipo di struttura grafica lo renderebbe possibile. Fondamentalmente creare un bordo tra due nodi esadecimali se sono uno accanto all'altro per simulare l'intera mappa. Tuttavia, non sono sicuro dell'algoritmo esatto per generare un "paese" all'interno di quella mappa. Il fatto è che, a seconda di come si desidera "guardare" il paese, sarebbero necessari diversi algoritmi.
Dalla parte superiore della mia testa, consiglierei di scegliere un punto e di spostarmi verso l'esterno da lì, scegliendo una tessera casuale all'interno del tuo "paese in crescita" che ha una tessera adiacente che non fa parte del paese.
Un modello di strategia potrebbe essere utilizzato per cambiare gli algoritmi a seconda del tipo di paese desiderato. http://en.wikipedia.org/wiki/Strategy_pattern ovvero vuoi un paese dalla costa sottile come il Cile? O vuoi qualcosa che sia più rotondo e contenuto?
Le proprietà del grafico possono anche permetterti di modificare l'aspetto del "paese" finale: http://it.wikipedia.org/wiki/Eccentricity_(graph_theory)
Vuoi un Paese grande? Modifica le proprietà del grafico e forza il Paese generato (che è solo un grafico) ad avere le proprietà che gli conferiscono un "aspetto" che desideri.
Ultimo ma non meno importante, i grafici saranno anche molto utili per definire i confini tra i paesi. È possibile creare un grafico con una connessione tra due nodi se i paesi confinano tra loro. Questo potrebbe essere utile per qualche tipo di partizionamento nel tuo gioco e ti permetterà di ottimizzare alcune cose durante lo sviluppo.
Una piccola nota: dici "sembra una vera mappa della vita con paesi di forme diverse ma di dimensioni uguali), ma i paesi" reali "hanno dimensioni molto diverse anche all'interno di determinate regioni - anche i paesi" grandi "d'Europa possono variare enormemente, con ad esempio la Francia che è più del doppio dell'Italia. Detto questo, ci sono ovviamente regioni di gioco in cui cercare di mantenere le dimensioni all'incirca uguali - basta essere consapevoli del fatto che una piccola variazione qui è probabilmente una buona cosa!
Il mio approccio iniziale al problema sarebbe quello di "evolvere" (piuttosto che "crescere") le tue regioni:
Ora, per tutto il tempo che desideri, esegui il seguente pseudocodice:
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;
}
Ciò manterrà un equilibrio approssimativo tra le dimensioni di due paesi vicini e il controllo "disconnesso" (che può essere effettuato con un semplice algoritmo di riempimento) assicura che nessun paese si divida mai in pezzi. L'aggiornamento dell'elenco dei limiti è un'operazione a tempo costante: l'esagono modificato ovviamente rimarrà sempre sul limite e puoi semplicemente controllare i suoi sei vicini per vedere se qualcuno di essi è diventato una cella di confine (perché il suo vicino è ora in un paese diverso) o ha smesso di essere una cella di confine (perché ora il suo vicino è nello stesso paese), modificando il confine impostato secondo necessità.
Per un perfezionamento di questo approccio, puoi persino rendere la condizione di quale esagono cambiare un po 'in modo casuale - piuttosto che "bilanciare" sempre i due paesi, puoi sempre effettuare lo swap con una certa probabilità e persino ridurre gradualmente tale probabilità tempo (simile al processo di raffreddamento in a ricottura simulata algoritmo di ) per iniziare a forzarli ad avere approssimativamente le stesse dimensioni.
Nota che questo non garantirà che tutte le aree abbiano esattamente le stesse dimensioni (il che è impossibile a meno che N non divida perfettamente le dimensioni della griglia), e non garantirà nemmeno che tutti i paesi si trovino entro un esagono l'uno dall'altro nell'area; esso dovrebbe garantire (correre per numero sufficiente di iterazioni) che ogni paese non più di un esagono più grande o più piccolo di ciascuno dei suoi immediati vicini è, però.