Seu trabalho é gerar um mapa de altura e mostrá-lo como um cenário de voxel projetado em paralelo. As regras são as seguintes:
- O (mapa de altura da) paisagem deve ser gerado aleatoriamente
- Você também precisa descrever como o algoritmo que você está usando funciona, para que todos possam aprender algo novo aqui
- Você também deve gerar uma imagem ou exibir a paisagem gerada na tela
- A imagem resultante deve ser projetada em paralelo (portanto, não em perspectiva) e só pode conter voxels (portanto, deve ser feita de pequenas caixas)
- Este é um concurso de popularidade, portanto, você pode querer adicionar alguns recursos adicionais ao seu programa para obter mais votos.
- O vencedor é a resposta válida mais votada 7 dias após o último envio válido. Todos os envios válidos precisam seguir as regras, incluindo a descrição do algoritmo usado. Você pode adicionar recursos adicionais que não seguem algumas regras (como adicionar um modo de perspectiva), mas nesse caso eles precisam ser recursos opcionais (por exemplo, ao desativá-los, o resultado deve seguir todas as regras)
- Meu envio não conta como válido.
Um exemplo de imagem de resultado é o seguinte:
Respostas:
Plotador de funções 3D Python2 Voxel Edition
Esta é a minha entrada nesta competição:
Como claramente indicado no título, ele funciona como um plotador de funções 3D, mas como essa competição exige que o terreno seja gerado aleatoriamente, essa função senoidal aleatória
1.5*(math.sin(1/randA*x+randC)+math.sin(1/randB*y+randD))
depende de 4 variáveis aleatórias. Isso cria terrenos como este:É claro que podemos substituir essa função aleatória por qualquer 2 funções variáveis, por exemplo
sin(sqrt((x/2)²+(y/2)²))*3
fornece este terreno:e
-x*y*e^(-x^2-y^2)
dá o seguinte:(os gráficos à direita são calculados por wolfram alpha)
E enquanto estamos nisso, Riemann zeta ao longo da faixa crítica:
Para as pessoas que não estão familiarizadas com isso, como você pode ver essas poças de água (que representam os zeros da função), todas estão em uma linha reta (parte real = 0,5). Se você puder provar isso, receberá US $ 1000000! Veja este link.
Espero que você goste!
fonte
C #, WPF
Eu experimentei uma caminhada aleatória , que funciona melhor do que eu esperava. Começo em algum lugar do mapa, ando até um ladrilho adjacente aleatório e incremento seu valor de altura , depois passo para o próximo e assim por diante. Isso é repetido milhares de vezes e, eventualmente, leva a um mapa de altura como este (100 x 100):
Então, "discretizo" o mapa, reduzo o número de valores para os níveis de altura determinados e atribuo terreno / cor com base nessa altura:
Mais terrenos semelhantes a arquipélagos:
Maior número de etapas aleatórias e níveis de altura para obter terreno mais montanhoso:
Código
Características: Recrie o terreno com um botão. Mostrar terreno 3D e mapa 2D. Zoom (roda do mouse) e rolagem 3D (teclas de seta). Mas não tem muito desempenho - afinal, isso é escrito exclusivamente em WPF, não em DirectX ou OpenGL.
MainWindow.xaml:
MainWindow.xaml.cs
fonte
JavaScript e Crafty.JS, para ser muito melhorado
Aqui está um exemplo de saída:
E aqui está o código (página completa):
Aqui está
sprite.png
:Agora, tenho algumas coisas a dizer.
Não me julgue por esse código terrível! : PI escreveu muitos anos atrás, quando eu era uma péssima programação. De fato, é dos velhos tempos do site que eu tinha que nem me lembrava! http://oddllama.cu.cc/terrain/
Eu meio que copiei muito código da demonstração Crafty.JS Isometric. : P
A explicação virá em breve! Eu tenho que ir dormir agora, já que é tarde aqui. (É também por isso que o sprite é tão terrível!)
Basicamente, é realmente polido e será muito melhorado mais tarde!
Ele usa o mesmo algoritmo de diamante quadrado mencionado na resposta do OP.
fonte
Ruby + RMagick
Estou usando o algoritmo Diamond-Square para gerar o mapa de altura.
O algoritmo em resumo:
[0,0] == [4,0] == [0,4] == [4,4]
. Além disso[-2,0] == [2,0]
etc.[0,0]
para uma cor aleatória[0,0] == [4,0] == [0,4] == [4,4]
)Como isso resultará em uma imagem chata e cinza, você deverá adicionar um número aleatório a esse valor a cada etapa. É preferível que esse valor aleatório abranja todo o intervalo na primeira iteração, mas diminua com o tempo ao abordar subconjuntos cada vez menores da matriz. Quanto menos essa aleatoriedade diminuir com o tempo, mais barulhenta será a imagem.
Depois de terminar, estou simplesmente atribuindo uma cor para cada valor de altura.
Código:
generate.rb
Gemfile
Nota: O Imagemagick que estou usando tem 16 bits
Imagem do resultado:
Nota: esta imagem é uma representação isométrica de cima para baixo, em que o tamanho de um voxel é exatamente um pixel, portanto é válido de acordo com as regras (exceto um: que minha resposta não é considerada válida)
fonte
Java (usando a imagem colorida de @ fejesjoco como algoritmo base)
Depois de brincar um pouco com as imagens coloridas FullRGB do @fejesjoco, notei que elas poderiam ser usadas como base para paisagens interessantes de voxel. Em vez de reimplementar o algoritmo, usei seu código como executável externo (faça o download em http://joco.name/2014/03/02/all-rgb-colors-in-one-image/ e coloque-o como artgen. exe no mesmo diretório)
Pré-visualização:
mapa de altura usado (armazenado no canal azul)
Imagem de entrada:
O subalgoritmo que utilizo funciona da seguinte maneira:
1. Classificação
2. Comece com um pixel preto no centro
3. Até que todas as cores sejam usadas: coloque a cor atual no ponto de ajuste mais próximo e adicione os vizinhos não utilizados como novos pontos utilizáveis Quando terminou, alterei-o para reduzi-lo a 256 valores diferentes
red&(green|blue)
4. Depois, uso sprites pré-gerados e giro a imagem camada por camadafonte
HTML + JavaScript
Aqui está minha tentativa na competição:
Eu uso o algoritmo Euclidean F1 Cell Noise para gerar um mapa de altura que, em seguida, transformo em uma imagem, pegando a cor apropriada de uma matriz e desenhando um quadrado a 10x, 10y de altura para que pixels mais altos sejam gerados. Em seguida, desenho um retângulo como o lado usando a mesma cor de uma matriz diferente.
Aqui está o mesmo código usando um algoritmo de caminhada aleatória de 10.000 etapas:
! [Caminhada aleatória 2] [4]
Quando "sai" de uma borda, ela se embrulha na outra, para que ainda pareça bem ladrilhada.
Ainda é tecnicamente paralelo, apenas de um ângulo diferente.
fonte