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.
Respostas:
Você pode gerar o caminho ideal usando A * e distorcê-lo com o deslocamento do ponto médio.
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:
Em seguida, mostre com o caminho ideal em vermelho e o caminho deslocado em azul:
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.
fonte
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.
fonte
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.
fonte