Dato un array bidimensionale qual è un buon modo per identificare regioni distinte di elementi?

1

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.

    
posta Zimano 19.07.2016 - 14:09
fonte

0 risposte

Leggi altre domande sui tag