Sto generando una "mappa del mondo" 2D in Unity che uso C # e Perlin noise per. Ho un oggetto Tile che contiene il grafico della piastrella e la posizione. Ci sono alcuni altri attributi in questa classe, ma qui non hanno importanza. Ho fornito l'implementazione di base di seguito:
public class Tile()
{
public GameObject tileObject;
public Vector2 position; //Related to actual in-Unity position.
public int Region;
}
Quindi creo una mappa creando due loop per riempire una matrice vuota con nuovi oggetti Tile e creare un'istanza della grafica. In questo caso c'è un Tile[100,100]
. Il tipo di Tile viene deciso controllando l'esito di una ricerca Perlin Noise.
Diciamo che se il valore è inferiore a 0,5, la tessera è terra e se è superiore a 0,5, è mare.
Ora abbiamo 10.000 oggetti all'interno di questo array e voglio rilevare ora diverse regioni, come la regione 1 e la regione 2. Per regioni intendo le aree di terra racchiuse e separate dalle tessere del mare. Nell'immagine qui sotto ho segnato due di queste regioni in rosso e verde:
Given an
array[ , ]
, what is a good way to identify distinct regions of elements?
Ho provato a trovare una soluzione efficiente ma finora non ne ho, ho cercato di implementare il processo sottostante ma il codice non era adatto per postare qui:
Scansiona ogni riga, da [0,0] a [0,99]. [1,0] a [1,99] e così via. Inizia con il numero di regione x.
- Ogni volta che viene trovata una prima tessera terra, controlla la regione della tessera sopra di essa.
- Se non ce n'è, o se è una tessera di mare o la regione sopra è uguale a x, assegna la sua regione a x.
- Quando nella stessa riga viene trovata una tessera marittima, incrementa la regione (
x+1
). Quindi, quando una tessera terreno viene trovata di nuovo, assegna la sua regione alla nuova x. e così via. Se la tessera terreno sopra è di un numero diverso, assegna quel numero alla regione del riquadro. - Quindi, fare lo stesso, ma prima scandire le colonne anziché le righe.
Una soluzione diversa che ho pensato era di fare la mappa perlin in segmenti più piccoli e invece di generare tutto in una volta, fare più generazioni di pezzi di terra (regioni) e incollarli su una mappa del mare. Ma ciò richiederebbe un altro livello di spese generali e sono abbastanza interessato a trovare un modo efficace per farlo.