Come si possono determinare baie e stretti in una mappa generata proceduralmente?


40

Ho una mappa generata proceduralmente usando celle Voronoi, con un livello del mare definito e una mappa dell'altezza credibile.

attuale

Finora, ho avuto successo nell'etichettare alcune caratteristiche geografiche: terra, oceano, laghi, fiumi, estuari, confluenze, montagne e biomi. I biomi includono tundra, foresta boreale, prati e foreste temperate. Ci sono anche un paio di altri biomi lì, ma per i miei scopi non sono importanti in questo momento.

Vorrei etichettare baie e stretti dopo, ma non riesco a capire come farlo correttamente. Una baia è un corpo idrico costiero incassato che si collega direttamente all'oceano.

Uno stretto è un canale navigabile stretto e naturalmente formato che collega due parti dell'oceano. Fondamentalmente, dove due pezzi di terra quasi si toccano e c'è oceano su entrambi i lati. Chiamato anche "canale".

Per determinare le funzionalità, posso scorrere tutte le funzionalità per tipo in questo modo:

for each (var feature:Object in geography.getFeaturesByType(Geography.LAND))
  // loop through lands
  for each (var cell:Cell in feature.cells)
  // loop through cells
    for each (var neighbor:Cell in cell.neighbors)
    // loop through a cell's neighbors
      trace(neighbor.hasFeatureType(Geography.LAND));

8
Raccomando un classificatore baysian.
Accumulo

1
@Acccumulation È un gioco di parole "bay" o è un suggerimento serio? In quest'ultimo caso, dovresti scrivere una risposta adeguata al riguardo.
Philipp

Sono sicuro al 99% che stia scherzando.
Olin Kirkland,

Risposte:


29

Il modo in cui Dragons Abound identifica le baie è camminare lungo la costa e trovare due punti sulla costa dove la distanza in linea retta tra i punti è inferiore alla distanza lungo la costa tra i punti. Questa è la sinuosità della costa tra i due punti. Selezionando un limite di sinuosità e limiti per la distanza in linea retta tra i punti è possibile identificare baie profonde strette, baie poco profonde, ecc.

In questa immagine, i punti rosso e viola mostrano i due punti candidati e la linea verde è la linea costiera tra i punti. La sinuosità è il rapporto di quelle due lunghezze:

Esempio di baia

In alternativa, puoi selezionare due punti sulla costa e creare un poligono collegando i due punti e la costa tra i due punti (ovvero, collega la linea verde sopra da punto rosso a punto viola). Misura l'area di questo poligono. Una baia avrà un'area più grande di una non-baia.

Nella mia esperienza, una combinazione di queste due misure è stata la migliore per identificare in modo affidabile ciò che le persone vedono come baie.

Nota che questo rileverà anche punti. Per trovare solo baie, è necessario verificare che "l'interno" della baia contenga acqua e non terra. Un modo rapido e semplice per farlo è controllare il punto medio della linea tra i due punti per vedere se è acqua. (Questo può essere ingannato ma è generalmente sufficiente.)

Un problema correlato è quello di identificare la "bocca" della baia, ovvero la scelta migliore per i due punti che segnano l'apertura della baia. In genere avrai un sacco di candidati per la "bocca". Nella mappa di esempio sopra, potresti mettere la bocca di quella baia più dentro o più fuori. In generale, probabilmente non importa troppo, ma un'euristica che funziona abbastanza bene è minimizzare la distanza in linea retta attraverso la bocca.

Non ho ancora fatto degli stretti, ma la mia intuizione è di controllare i punti lungo la costa per trovare il punto più vicino su qualsiasi altra costa; se questo è sotto un certo limite, è uno stretto.


3
Avrei dovuto sapere che Dragons Abound avrebbe avuto le risposte di cui avevo bisogno.
Olin Kirkland,

48

Ecco un'idea approssimativa che utilizza trasformazioni di elaborazione delle immagini per isolare le funzionalità di interesse:

  1. Applica un riempimento di piena da una cellula oceanica per creare una maschera di tutte le cellule oceaniche. A seconda di come sono impostati i tuoi fiumi, potresti aver bisogno di un ulteriore criterio di altezza o distanza per impedire alla maschera oceanica di fluire verso l'interno. ;)

    Maschera oceanica

  2. Applica una levigatura locale al bordo di questa maschera, mantenendo la stessa connessione / topologia, ma levigando le piccole caratteristiche della costa rumorosa che possono essere fonte di distrazione. Questo ci consente di concentrarci su grandi baie su piccole insenature. Puoi usare la larghezza del tuo filtro kernal / numero di iterazioni per controllare con precisione la scala delle funzionalità che conservi.

    Qui ho applicato un filtro mediano alcune volte. Gli automi cellulari sono un altro modo popolare per erodere forme morbide da un input rumoroso.

    Costa levigata

  3. Trasforma la maschera in un campo di distanza, dove ogni cella memorizza la sua distanza dalla costa levigata.

    Campo di distanza

Ora vediamo alcuni promettenti punti salienti delle funzionalità. In un campo di distanza segnato, sia le baie che gli stretti si presentano come creste affilate, con la distanza che cade ai lati. Possiamo usare un filtro di rilevamento dei bordi per far apparire queste creste:

Creste evidenziate

È quindi possibile distinguere tra baie e stretti seguendo la cresta per determinarne la connettività. Una baia è una cresta che corre verso la costa, diventando sempre più bassa (in lontananza dalla terra) fino a quando non termina in un punto. Uno stretto è una cresta che collega una regione ad alta distanza a un'altra regione ad alta distanza, attraversando una regione a bassa distanza lungo il percorso.

Oppure, un altro modo è quello di assegnare a ciascuna isola un ID (ricerca di componenti collegati), quindi quando si crea il campo distanza, propagare "ID isola più vicina" lungo la frontiera della distanza. Una baia o un'entrata è quindi una cresta in acqua adiacente alla stessa massa terrestre su entrambi i lati, mentre un canale è una cresta che separa l'acqua adiacente a due diverse terre emerse.

È possibile impostare vincoli di distanza dalla costa minima e massima o della lunghezza della cresta per controllare quali caratteristiche etichettare, ad esempio se è necessario escludere stretti eccessivamente stretti / larghi.


9
Questo sembra davvero interessante, e probabilmente potrebbe essere velocizzato considerevolmente usando direttamente la struttura della cella per applicare i vari passaggi piuttosto che la rappresentazione grafica!
Quentin,

7
Il secondo approccio (che assegna a ciascuna distinta massa terrestre un documento d'identità e distingue in base al fatto che si tratti della stessa massa terrestre su entrambi i lati del corpo idrico) sembra la cosa più semplice da fare ..
Monty Harder

L '"ID Landmass" è comunque una buona idea, poiché sarà necessario anche nell'etichetta della mappa per generare i nomi delle isole.
MSalter

6

Fondamentalmente, devi pensare a cosa intendi, precisamente, per baia o stretto, e perché vuoi differenziarli (è per i calcoli AI, o per etichettare i punti di riferimento o qualcos'altro?). Gioca con alcune definizioni per trovare quella che ti sembra migliore. Quindi, formula le condizioni per controllare le tue celle Voronoi. Alcuni suggerimenti:

Baia

  • Qualsiasi cellula oceanica che si collega solo a una singola cellula oceanica
  • OPPURE: qualsiasi cellula oceanica che si collega a più terre delle cellule oceaniche, con tutte le cellule oceaniche una accanto all'altra
  • OPPURE: Come sopra, ma con un criterio basato sulla lunghezza del confine (ad es. Terra doppia rispetto al confine con l'acqua)

Stretto

  • Qualsiasi cellula oceanica che si collega esattamente a due cellule oceaniche che non si trovano una accanto all'altra
  • OPPURE: qualsiasi cellula oceanica che si collega a due celle terrestri che non appartengono alla stessa massa terrestre (è necessario scoprire quali celle terrestri sono collegate per prime e assegnare gli ID a ciascuna massa terrestre)
  • OPPURE: marciare intorno al confine e contare le transizioni terra / acqua e acqua / terra. Hai bisogno di almeno due di ciascuno.
  • A seconda del metodo e di ciò che si desidera fare con le categorie, è possibile che si desideri eliminare gli stretti che portano solo a un alloggiamento o etichettarli invece come alloggiamento.

2
Quando uno stretto conduce a una baia, questi due insieme potrebbero essere etichettati come un fiordo.
Philipp

1
Se le cellule sono piccole rispetto alla dimensione di una baia / stretto, potrebbe essere necessario propagare questo per guardare le celle oltre i vicini immediatamente adiacenti.
DMGregory

Sì, il ridimensionamento è un po 'un problema e avrà un impatto sul modo in cui definisci le cose e dichiari "celle". Considera una mappa del Canada e confronta quanto segue: Hudson Bay, James Bay, Golfo di St Lawrence e Baia di Fundy. Come si applicano in modo affidabile queste regole per ottenere i nomi correlati desiderati? - Esiste una "scala" tra Terranova e Nuova Scozia?
TheLuckless
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.