Geração de ilha de barreira

As notícias de dezembro do furacão Florence geralmente se referiam a External Shoals - uma série de ilhas barreira na costa da Carolina do Norte:


As ilhas de barreira são manchas planas ou em blocos de areia formadas por ondas e surfam paralelamente à costa do continente. Eles geralmente assumem a forma de longas cadeias que podem se esticar por dezenas de quilômetros. As ilhas barreira geralmente são separadas por pequenos canais de maré e podem formar lagoas entre as ilhas e o continente.

Segundo a Wikipedia , as ilhas barreira podem cobrir até 15% da costa, então você pode esperar vê-las na maioria dos mapas de fantasia, mas na verdade elas são bastante raras. E devido à natureza do ruído, eles quase nunca acontecem em mapas gerados proceduralmente que usam ruído para criar terreno.

Para entender por que isso acontece, vamos dar uma olhada no mapa de baunilha da ilha:


De fato, é um círculo distorcido por uma pequena quantidade de ruído de baixa frequência adicionada para dividir uma forma circular. Vamos agora tentar usar o ruído para romper a costa e formar ilhas costeiras. Aqui está a mesma ilha com a adição de ruído de baixa frequência:


Tem baías e capas. Os elementos de alívio são bastante grandes porque usei ruído de baixa frequência, que muda lentamente. No entanto, o barulho não é forte o suficiente para criar ilhas. Vamos empurrar um pouco:


Agora criamos várias ilhas, mas elas são essencialmente pontos circulares, não necessariamente se estendendo ao longo da costa. Você pode adicionar ruído de alta frequência:


Isso pode nos dar costas muito pequenas e pequenas ilhas ao longo da costa, mas nada parecido com uma ilha barreira.

A única razão para isso é que o ruído não é correspondido em xey, portanto, embora o ruído não seja aleatório em geral, as formas que ele cria são aleatórias:


Para algumas coisas, isso é bom, mas não é adequado para criar uma forma específica, por exemplo, ilhas ao longo da costa.

Como em outros casos, quando eu precisava gerar uma determinada forma ou área, era necessário criar uma máscara da forma desejada e, em seguida, usar o ruído dentro da máscara. (Você também pode usar o ruído para distorcer a máscara e dar-lhe uma forma mais natural.) As ilhas de barreira são, de fato, áreas longas e finas, afastadas da costa. Então, vamos criar uma máscara dessa forma.

Para começar, definimos a parte da costa em que a ilha barreira estará localizada. Isso pode ser feito selecionando um ponto aleatório na costa e um segundo ponto inferior, marcados na figura com uma linha vermelha no canto superior direito:


Para começar a criar uma ilha barreira, posso simplesmente pegar uma linha reta entre esses dois pontos e projetá-la um pouco para fora, na água. Isso me dará uma ilha muito reta e antinatural, mas você pode distorcer sua forma para escondê-la. O verdadeiro problema é que a ilha não seguirá a costa. Provavelmente parecerá normal para a maioria dos trechos diretos da costa, mas parecerá estranho nas costas sinuosas. É melhor replicar a costa e torná-la a base da forma da ilha.

Para fazer isso, preciso criar uma cópia do litoral e depois projetá-lo no oceano perpendicular ao litoral. Eu já tenho um procedimento para calcular perpendiculares (normais) a linhas quebradas desde que percebi linhas manuscritas , e minhas costas sempre seguem a mesma direção, por isso é bem simples:


Ou parece simples. Vamos ver o que acontece se eu projetar o litoral um pouco mais para fora (para criar o outro lado da máscara da ilha) na parte menos lisa do litoral:


Dois segmentos da linha projetada se cruzam entre si e criam um "oito" assustador no polígono. Este é o chamado problema da curva paralela . Não podemos simplesmente deslocar a costa para alguma distância; também é necessário resolver os problemas que surgem dos cantos internos e externos afiados.

Eu estava procurando por código Javascript para resolver esse problema, mas o único exemplo encontrado ( daqui ) foi surpreendentemente travado, mesmo em amostras bastante simples. Então eu escrevi o meu. Em geral, a solução é mudar cada ponto ao longo do normal, mas depois verificar se o novo ponto cria uma linha que intercepta alguma das linhas existentes. Nesse caso, cortamos o loop e inserimos uma nova linha que consiste no ponto de interseção e no novo ponto. Nos casos de teste que testei, esse sistema funcionou muito bem para meus requisitos.

Então agora eu posso gerar máscaras simples (sem loops) para as ilhas:


Isso é muito uniforme, então distorço os contornos:


Os contornos podem tocar a costa em alguns pontos, mas isso é normal; geralmente é encontrado em ilhas barreira.

O próximo passo é preencher a terra com a terra, mas antes de fazer isso, quero prolongar as ilhas e acrescentar a lógica de evitar ilhas que se cruzam no caso de criar várias ilhas de barreira no mesmo litoral.


Agora vamos tentar adicionar um pouco de terra. Para fazer isso, aumentarei a altura de qualquer local de terra (que são triângulos de Delaunay) acima do nível do mar:


Há alguns aspectos que vale a pena notar. Em primeiro lugar, no canto superior esquerdo, há uma ilha barreira bastante bem-sucedida. No entanto, a ilha parece não preencher bem o aterro. Muitos triângulos terrestres estão "ativados" devido à presença de seus centros dentro do polígono. Isso adiciona aleatoriedade à forma da ilha. Em segundo lugar, pode-se notar que as outras duas ilhas estavam tão perto da costa que simplesmente se fundiram com ela. Como eu quero criar ilhas aqui, não preciso que isso aconteça com muita frequência, por isso vou configurar a geração para obter uma maior lacuna de água entre a costa e a ilha. (Mais tarde adicionarei uma verificação para evitar que isso aconteça.)


Uma das coisas boas sobre os triângulos irregulares da terra é que eles naturalmente criam dutos de maré típicos de ilhas barreira. O ruim deles é que eles geralmente criam ilhas pontuais que parecem pérolas distorcidas em um barbante. Eles não são muito semelhantes às ilhas barreira, e se você pegar muitos triângulos individuais, eles parecerão muito antinaturais.

Se eu aumentar a largura das ilhas, ambos os efeitos desaparecem e fico com mais ilhas naturais, mas sem canais de maré:


Mas eu gostaria de aprender como gerar ilhas muito estreitas. Outra abordagem é (significativamente) aumentar o número de locais no mundo para aumentar a resolução:


Portanto, podemos obter ilhas impressionantemente finas e detalhadas, mas isso aumenta significativamente o tempo e a memória necessários para criar um mapa.

Nos dois métodos, há uma boa chance de que algumas partes da ilha sejam muito desiguais:


Isso acontece porque o caminho cruza os dois lados (e às vezes os três lados) dos triângulos subjacentes de Delaunay. Este é um problema inerente ao uso da triangulação de Delaunay na geração de mapas, mas por algum motivo eles raramente discutem isso! Isso acontece nas costas do meu jogo com pouca frequência, porque, para reduzir o número de casos, eu adicionei deliberadamente uma fase de suavização, mas essa fase tende a destruir ilhas estreitas. Uma solução potencial é criar ilhas um pouco mais largas e usar anti-aliasing - se configurado corretamente, você pode obter ilhas mais finas sem muitos artefatos de triângulo:


No entanto, com essa abordagem, ainda existem limitações sobre o quão estreitas as ilhas podem ser. Além disso, isso significa que nunca teremos litoral verdadeiramente fractal.

Às vezes, o algoritmo de suavização leva à divisão da ilha de barreira longa em várias pequenas (como no canto inferior esquerdo da imagem acima), mas seria conveniente ter uma opção que permita fazer isso à força:


A única coisa que resta é dar nomes às ilhas e mapeá-las. O único aspecto sutil aqui é que não quero dar nomes a todas as ilhas da cadeia de ilhas barreira. Em cadeias reais de ilhas barreira, ilhas individuais geralmente têm nomes, o que leva ao caos no mapa:


Portanto, ao criar uma ilha barreira, levo em conta o arco inteiro e atribuo um nome a ele, mesmo que, como resultado, a geração divida o arco em várias ilhas:


Normalmente, as ilhas barreira são chamadas de "bancos" ou "eixos" (barras); portanto, essas palavras são encontradas em nomes de variantes.

Este exemplo mostra um potencial problema de ilha de barreira:


Aqui a ilha barreira foi criada dentro da baía. Isso é ilógico (além disso, leva à interseção de nomes). Para evitar isso, posso usar minha lógica de reconhecimento de baías e pular essas seções da costa. Provavelmente não há proteção contra o tolo nesse método, mas funciona bem para esta placa:

Source: https://habr.com/ru/post/pt439198/


All Articles