Eu tenho um mapa processualmente gerado usando células Voronoi, com um nível do mar definido e um mapa de altura crível.
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));
fonte
Respostas:
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:
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.
fonte
Aqui está uma idéia aproximada usando transformações de processamento de imagem para isolar os recursos de seu interesse:
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. ;)
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.
Transforme a máscara em um campo de distância, onde cada célula armazena sua distância da costa suavizada.
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:
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.
fonte
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
Estreito
fonte