Estou tentando gerar um mapa em estrela.
Minha tentativa seria:
- Tenha uma largura e altura para o mapa.
- Coloque os pontos (estrelas) aleatoriamente na área de largura e altura.
Uma abordagem simples, mas tem o problema de colocar aleatoriamente estrelas extremamente próximas umas das outras.
Para resolver esse problema, uma abordagem seria ter uma distância mínima e, ao gerar uma estrela, você compara a distância da nova estrela a cada estrela gerada e, se estiver abaixo da distância mínima, você gera uma nova, mas não sei se isso é eficiente. Alguma dica?
procedural-generation
zebleckDAMM
fonte
fonte
Respostas:
Uma distribuição de amostragem Poisson-Disk permitirá que você selecione pontos aleatórios a uma distância mínima; o algoritmo de Bridson pode resolver com eficiência o problema em O (n) - rápido o suficiente para tempo real, desde que sua contagem de estrelas não seja muito grande.
O algoritmo de Bridson divide a região de saída em uma grade de células dimensionadas em relação à distância mínima permitida, de modo que apenas um ponto possa aparecer em cada célula. Então, ao considerar adicionar um novo ponto, você só precisa verificar uma coleção em forma de disco de células vizinhas, em oposição a toda a lista de pontos. Por exemplo, considere a seguinte imagem:
Ao verificar se o ponto azul candidato está muito próximo dos pontos existentes, não é necessário verificar em todos os pontos existentes. Em vez disso, você pode restringir a pesquisa aos pontos nas células vizinhas (que você pode encontrar rapidamente usando uma tabela de pesquisa). Mike Bostock tem uma bela animação mostrando o algoritmo em andamento.
A implementação padrão refere-se apenas a uma distância mínima fixa entre pontos. O artigo de amostragem Poisson Disk de Herman Tulleken (inclui código fonte) cobre uma adaptação para variar a distância mínima em diferentes partes da imagem; basicamente como um algoritmo de pontilhamento . O uso de ruído perlin / ruído simplex, como mostrado nas nuvens de artigos, pode fornecer um mapa estelar com aparência mais natural. Por exemplo, usei a imagem à esquerda para gerar a direita:
Para fazer isso, ao considerar um ponto candidato, primeiro verifico o valor da imagem de entrada, que gera um valor de 0 a 1. Em seguida, escalono isso para a distância mínima e máxima desejada entre os pontos; neste caso, selecionei 5 e 20 pixels. Portanto, ao colocar um ponto nas regiões escuras, minhas estrelas podem ter até 5 pixels uma da outra e ao colocar estrelas nas regiões claras, elas podem ter até 20 pixels de distância.
Vale ressaltar que a velocidade de Bridson não funciona exatamente com a amostragem de distância variável, porque os pontos de saída não estão usando uma distância mínima uniforme. No entanto, você ainda pode usar uma grade de saída para reduzir a pesquisa. Quanto menor a grade, mais rápida é a busca pelos vizinhos mais próximos à custa de maior memória para uma tabela de pesquisa maior.
fonte
Uma solução muito ingênua, mas simples, seria simplesmente sempre pular a distância "mínima" e, em seguida, acrescentar uma quantia aleatória. Isso significa que as estrelas nunca terão amigos demais, e você terá pelo menos um pouco de desvio.
por exemplo
(Inserir sua função favorita de geração de números aleatórios)
fonte
Se você souber o tamanho XYZ do seu espaço de jogo, poderá escolher um local aleatório nesse espaço
e faça um SphereCast para verificar se já existe algo muito próximo.
O problema é que provavelmente não será muito bom em tempo real, no entanto, para pré-gerado, é bom e muito rápido.
fonte