Como as baías e os estreitos podem ser determinados em um mapa gerado processualmente?

40

Eu tenho um mapa processualmente gerado usando células Voronoi, com um nível do mar definido e um mapa de altura crível.

Atual

Até agora, consegui rotular certas características geográficas: terra, oceano, lagos, rios, estuários, confluências, montanhas e biomas. Os biomas incluem tundra, floresta boreal, pastagem e floresta temperada. Existem também alguns outros biomas, mas para os meus propósitos, eles não são importantes no momento.

Gostaria de rotular baías e estreitos a seguir, mas estou sem saber como fazer isso corretamente. Uma baía é um corpo de água costeiro recuado que se conecta diretamente ao oceano.

Um estreito é uma via navegável estreita, formada naturalmente, que conecta duas partes do oceano. Basicamente, onde dois pedaços de terra quase se tocam e há oceano nos dois lados. Também chamado de "canal".

Para determinar os recursos, posso percorrer qualquer recurso por tipo como este:

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));
Olin Kirkland
fonte
8
Eu recomendo um classificador da Baía.
Acumulação
11
@ Accumulation É um trocadilho para "bay" ou é uma sugestão séria? Neste último caso, você deve escrever uma resposta adequada sobre isso.
Philipp
Tenho 99% de certeza de que ele está fazendo uma piada.
Olin Kirkland

Respostas:

29

A maneira como Dragons Abound identifica baías é caminhar ao longo da costa e encontrar dois pontos no litoral em que a distância em linha reta entre os pontos é menor que a distância ao longo do litoral entre os pontos. Esta é a sinuosidade da costa entre os dois pontos. Ao selecionar um limite de sinuosidade e limites para a distância em linha reta entre os pontos, é possível identificar baías profundas estreitas, baias rasas e largas, etc.

Nesta figura, os pontos vermelho e roxo mostram os dois pontos candidatos e a linha verde é o litoral entre os pontos. A sinuosidade é a razão desses dois comprimentos:

Exemplo de uma Baía

Como alternativa, você pode selecionar dois pontos na costa e criar um polígono conectando os dois pontos e a costa entre os dois pontos (por exemplo, conecte a linha verde acima do ponto vermelho ao ponto roxo). Meça a área deste polígono. Uma baía terá uma área maior do que uma não baía.

Na minha experiência, uma combinação dessas duas medidas foi melhor para identificar com segurança o que as pessoas veem como baías.

Observe que isso também detectará pontos. Para encontrar apenas baías, é necessário verificar se o "interior" da baía contém água e não terra. Uma maneira rápida e fácil de fazer isso é verificar o ponto médio da linha entre os dois pontos para ver se é água. (Isso pode ser enganado, mas geralmente é suficiente.)

Um problema relacionado é identificar a "boca" da baía - ou seja, a melhor escolha para os dois pontos que marcam a abertura da baía. Normalmente, você tem vários candidatos para a "boca". No mapa de exemplo acima, você pode colocar a boca desse compartimento mais para dentro ou para fora. De um modo geral, provavelmente não importa muito, mas uma heurística que funciona razoavelmente bem é minimizar a distância em linha reta através da boca.

Ainda não fiz dificuldades, mas minha intuição é verificar pontos ao longo da costa para encontrar o ponto mais próximo de qualquer outra costa; se isso estiver abaixo de algum limite estabelecido, é um passo difícil.

Dr. Pain
fonte
3
Eu deveria saber que Dragons Abound teria as respostas que eu precisava.
Olin Kirkland
48

Aqui está uma idéia aproximada usando transformações de processamento de imagem para isolar os recursos de seu interesse:

  1. Aplique um preenchimento de inundação de uma célula oceânica para criar uma máscara de todas as células oceânicas. Dependendo de como seus rios são configurados, você pode precisar de um critério extra de elevação ou liberação para impedir que a máscara oceânica flua para o interior. ;)

    Ocean Mask

  2. Aplique uma suavização local na borda desta máscara, mantendo a conectividade / topologia a mesma, mas suavizando os pequenos recursos barulhentos da costa que podem ser uma distração. Isso nos permite focar em grandes baías em pequenas entradas. Você pode usar a largura do seu filtro kernal / número de iterações para controlar com precisão a escala dos recursos que você preserva.

    Aqui eu apliquei um filtro mediano algumas vezes. Os autômatos celulares são outra maneira popular de corroer formas suaves de uma entrada barulhenta.

    Costa suavizada

  3. Transforme a máscara em um campo de distância, onde cada célula armazena sua distância da costa suavizada.

    Campo Distância

Agora vemos alguns destaques promissores dos recursos. Em um campo de distância assinado, as baías e os estreitos aparecem como cumes acentuados, com a distância caindo para os lados. Podemos usar um filtro de detecção de borda para exibir esses cumes:

Pontes em destaque

Você pode distinguir entre baías e estreitos seguindo a crista para determinar sua conectividade. Uma baía é uma cordilheira que corre em direção à costa, ficando cada vez mais rasa (na distância da terra) até terminar em um ponto. Um estreito é uma cordilheira que conecta uma região de alta distância a outra região de alta distância, passando por uma região de menor distância ao longo do caminho.

Ou, outra maneira é atribuir um ID a cada ilha (pesquisa de componente conectado) e, quando você estiver criando seu campo de distância, propague o "ID da ilha mais próximo" ao longo da fronteira da distância. Uma baía ou entrada é então uma crista na água adjacente à mesma massa de terra em ambos os lados, enquanto um canal é uma crista que separa a água adjacente a duas massas de terra diferentes.

Você pode definir restrições mínimas e máximas de distância à costa ou comprimento da crista para controlar quais recursos rotular, se precisar excluir estreitos excessivamente estreitos / largos, por exemplo.

DMGregory
fonte
9
Isso parece muito legal e provavelmente poderia ser acelerado consideravelmente usando diretamente a estrutura da célula para aplicar as várias etapas em vez da representação gráfica!
Quentin
7
A segunda abordagem (atribuindo a cada massa de terra distinta um ID e distinguir com base em se é a mesma massa de terra em ambos os lados do corpo de água) parece ser a coisa mais fácil de fazer ..
Monty Mais difícil
De qualquer maneira, o "ID da massa terrestre" é uma boa ideia, pois você também precisará dele na rotulagem do mapa para gerar nomes de ilhas.
MSalters 08/04
6

Basicamente, você precisa pensar no que quer dizer, precisamente, com uma baía ou estreito, e por que deseja diferenciá-los (é para cálculos de IA ou para rotular pontos de referência ou algo mais?). Brinque com algumas definições para encontrar a que melhor lhe parecer. Em seguida, formule condições para verificar suas células Voronoi. Algumas sugestões:

Baía

  • Qualquer célula oceânica que se conecta apenas a uma única outra célula oceânica
  • OU: Qualquer célula oceânica que se conecta a mais terra do que células oceânicas, com todas as células oceânicas próximas uma da outra
  • OU: O mesmo que acima, mas com um critério baseado no comprimento da borda (por exemplo, o dobro da terra que a borda da água)

Estreito

  • Qualquer célula oceânica que se conecta exatamente a duas células oceânicas que não estão próximas umas das outras
  • OU: qualquer célula oceânica que se conecta a duas células terrestres que não pertencem à mesma massa terrestre (você precisa descobrir quais células terrestres estão conectadas primeiro e atribuir IDs a cada massa terrestre)
  • OU: Marcha ao redor da fronteira e conte as transições de terra / água e água / terra. Você precisa de pelo menos dois de cada.
  • Dependendo do seu método e do que você deseja fazer com as categorias, você pode eliminar os estreitos que levam apenas a um compartimento ou rotulá-los como compartimento.
Autolykos
fonte
2
Quando um estreito leva a uma baía, esses dois juntos podem ser rotulados como um fiorde.
Philipp
11
Se as células forem pequenas em relação ao tamanho de uma baía / estreito, talvez seja necessário propagar isso para examinar as células além dos vizinhos imediatamente adjacentes.
DMGregory
Sim, o dimensionamento é um pouco problemático e afetará a maneira como você define as coisas e declara 'células'. Considere um mapa do Canadá e compare o seguinte: Baía de Hudson, Baía de James, Golfo de St Lawrence e Baía de Fundy. Como você aplica essas regras de maneira confiável para obter os nomes relacionados desejados? - Existe uma "reta" entre Terra Nova e Nova Escócia?
TheLuckless