Geração de estradas / rios no mapa de grade 2D

12

Esta é uma pergunta para iniciantes, mas aqui vai:

Meu mapa é uma grade 2D e quero gerar estradas e rios. A rota do ponto inicial ao final não deve ser a rota ideal em número de blocos. Em vez disso, eles devem ter um certo nível de aleatoriedade (turnos).

Existe um algoritmo padrão para esse tipo de coisa?

Felicidades!

ATUALIZAR:

Este é o resultado de jogar com pesos na grade e aplicar um algoritmo de caminho mais curto (Bellman-Ford) usando a biblioteca jgrapht. Eu fui com a resposta de Donutz, afinal.

http://pastebin.com/AGQGK5ik

Markos Fragkakis
fonte
Existem obstáculos no mapa?
MichaelHouse
Ainda não, o rio será o primeiro obstáculo a ser colocado.
Markos Fragkakis

Respostas:

18

Você pode gerar o caminho ideal usando A * e distorcê-lo com o deslocamento do ponto médio.

insira a descrição da imagem aqui

Isso garantirá que seus pontos de extremidade sejam atingidos e permitirá que você controle a aleatoriedade em grande parte. Por exemplo, eu não randomizaria estradas tanto quanto rios. Qualquer que seja a inteligência que esteja construindo estradas, normalmente tenta ser ideal.

Tome cuidado para garantir que, se o seu mapa tiver obstáculos, você verifique após cada iteração se não está atravessando esses obstáculos.

Outro método seria gerar o ruído Perlin depois de encontrar o caminho ideal e, em seguida, mudar seus pontos com base no ruído gerado. Por exemplo, usando este ruído:

insira a descrição da imagem aqui

Em seguida, mostre com o caminho ideal em vermelho e o caminho deslocado em azul:

insira a descrição da imagem aqui

Observe como o caminho alternado "se estabeleceu" nas áreas mais escuras do ruído. Da mesma maneira que um rio pode fluir através de um vale.

Um benefício da opção de ruído da Perlin é que você pode levar em consideração seus obstáculos e evitá-los como parte do algoritmo.

MichaelHouse
fonte
1
Como você faz essa mudança de base no ruído?
Khoi
1
Depende de como você está armazenando o ruído e a linha gerada. Você pode encontrar o ruído mais próximo / mais baixo perpendicular à linha no centro primeiro, depois nos pontos médios entre o centro e as extremidades e assim por diante.
MichaelHouse
3

O algoritmo A * também permitirá que você atribua valores aos blocos indicando sua adequação. Por exemplo, você pode atribuir as pontuações de menor custo a terrenos baixos para rios, terrenos planos (mas não pântanos) para estradas e gerar com base nisso. Isso não fornece a rota mais curta, mas fornece a rota mais eficiente. Aplique um pouco de aleatoriedade aos seus valores de bloco e você poderá obter algumas rotas abaixo do ideal.

Donutz
fonte
2

E quando a altura é um fator? Eu posso fazer um mapa de altura com o algoritmo de diamante quadrado. Eu estava pensando em adicionar um pouco de água aleatória a cada ladrilho e depois percorrer e mover a água para elevações mais baixas até que tudo estivesse resolvido, mas isso diminuiria a velocidade e provavelmente tornaria lagos, não rios.

Eu também estava pensando em olhar as normais para cada peça. Se 2 normais apontam um para o outro, então deve ser um vale. A água seria coletada em um vale. Se apontarem na mesma direção ou afastarem um do outro, a água não será coletada. Provavelmente seria mais rápido que o método de iteração, mas pode não criar lagos, apenas rios. Eu teria que brincar com isso para não transformar todas as ocorrências de peças apontadas uma para a outra em um rio.

user137
fonte
Li um dos documentos em que você pode adicionar um peso a cada peça, além de certas peças serem simplesmente intransitáveis.
Joe Plante