A tinta nas paredes do meu quarto tem uma textura tridimensional aleatória, quase fractal:
Neste desafio, você escreverá um programa que gera imagens aleatórias que parecem fazer parte das minhas paredes.
Abaixo, coletei 10 imagens de diferentes pontos nas paredes. Todos têm aproximadamente a mesma iluminação e foram tirados com a câmera a um pé da parede. As bordas foram cortadas uniformemente para torná-las 2048 por 2048 pixels e, em seguida, foram redimensionadas para 512 por 512. A imagem acima é a imagem A.
Estas são apenas miniaturas, clique nas imagens para ver em tamanho real!
Sua tarefa é escrever um programa que receba um número inteiro positivo de 1 a 2 16 como uma semente aleatória e, para cada valor, gera uma imagem distinta que parece ter sido a "décima primeira imagem" da minha parede. Se alguém olhando minhas 10 imagens e algumas suas não souberem dizer quais foram geradas por computador, você se saiu muito bem!
Exiba algumas das imagens geradas para que os espectadores possam vê-las sem precisar executar o código.
Percebo que a iluminação nas minhas imagens não é perfeitamente uniforme em intensidade ou cor. Sinto muito, mas é o melhor que posso fazer sem um equipamento de iluminação melhor. Suas imagens não precisam ter iluminação variável (embora possam). A textura é a coisa mais importante a ser focada.
Detalhes
- Você pode usar ferramentas e bibliotecas de processamento de imagens.
- Pegue a entrada da maneira que desejar (linha de comando, stdin, variável óbvia, etc).
- A imagem de saída pode estar em qualquer formato de arquivo de imagem sem perdas comum ou apenas pode ser exibida em uma janela / bowser.
- Você pode analisar programaticamente minhas 10 imagens, mas não presuma que todos que executam seu código tenham acesso a elas.
- Você deve gerar as imagens programaticamente. Você não pode codificar uma pequena variante de uma das minhas imagens ou de outra imagem. (As pessoas votariam em você de qualquer maneira.)
- Você pode usar geradores de números pseudoaleatórios incorporados e assumir que o período é 2 16 ou mais.
Pontuação
Este é um concurso de popularidade, para que a resposta mais votada ganhe.
fonte
Respostas:
GLSL (+ JavaScript + WebGL)
Demonstração ao vivo | Repositório do GitHub
Como usar
Recarregue a página para uma nova imagem aleatória. Se você deseja alimentar uma semente específica, abra o console do navegador e ligue
drawScreen(seed)
. O console deve exibir a semente usada no carregamento.Eu realmente não testei isso em muitas plataformas, então, deixe-me saber se não funciona para você. Obviamente, seu navegador precisa oferecer suporte ao WebGL. Os erros são exibidos na coluna à esquerda ou no console do navegador (dependendo do tipo de erro).
Novo: agora você pode dar vida às paredes um pouco, marcando a caixa de seleção "fonte de luz móvel".
O que é essa feitiçaria?
Eu tenho esse código padrão do WebGL flutuando em torno da minha conta do GitHub , que eu uso de vez em quando para prototipar rapidamente algumas coisas de gráficos 2D no WebGL. Com um pouco de mágica do shader, também podemos fazer com que pareça um pouco 3D, então achei que era a maneira mais rápida de obter bons efeitos. A maior parte da configuração é desse código padrão, e eu estou considerando que uma biblioteca para este envio não será incluída neste post. Se você estiver interessado, dê uma olhada no main.js no GitHub (e nos outros arquivos dessa pasta).
Tudo o que o JavaScript faz é configurar um contexto WebGL, armazenar a semente de maneira uniforme para o sombreador e, em seguida, renderizar um quad único em todo o contexto. O sombreador de vértice é um sombreador de passagem simples, portanto toda a mágica acontece no sombreador de fragmento. Por isso chamei isso de submissão GLSL.
A maior parte do código é realmente gerar o ruído Simplex, que eu encontrei no GitHub . Então, eu estou omitindo isso também na lista de códigos abaixo. A parte importante é que ela define uma função
snoise(vec2 coords)
que retorna ruído simplex sem usar uma textura ou pesquisa de matriz. Não é semeado, então o truque para obter um ruído diferente é usar a semente para determinar onde fazer a pesquisa.Então aqui vai:
É isso aí. Posso acrescentar mais explicações amanhã, mas a ideia básica é:
tanh
para nivelar o topo.fonte
Mathematica Spackling
O aplicativo abaixo aplica manchas em uma imagem aleatória. Clicar em "novo patch" gera uma nova imagem aleatória para trabalhar e depois aplica os efeitos de acordo com as configurações atuais. Os efeitos são pintura a óleo, filtro gaussiano, posterização e gravação em relevo. Cada efeito pode ser ajustado independentemente. A semente do gerador de números aleatórios pode ser qualquer número inteiro de 1 a 2 ^ 16.
Atualização : o filtro gaussiano, que suaviza as bordas, agora é o último efeito de imagem aplicado. Com essa modificação, o efeito de posterização não era mais necessário e, portanto, removido.
Explicação
A explicação é baseada em uma versão ligeiramente diferente, na qual a posterização foi empregada e
GaussianFilter
aplicada desde o início. Mas ainda serve para esclarecer como cada efeito de imagem altera uma imagem. O resultado final é uma textura de tinta com bordas mais nítidas. Quando o filtro gaussiano é aplicado apenas no final, o resultado será mais suave, como mostra a imagem acima.Vejamos alguns efeitos de imagem, um de cada vez.
Gere uma imagem inicial.
Lena nos mostrará como cada efeito de imagem transforma uma imagem realista.
Um efeito de pintura a óleo aplicado a Lena.
Um efeito de pintura a óleo aplicado à nossa imagem aleatória. O efeito foi intensificado (16 em vez de 8).
Um efeito de filtro gaussiano aplicado a Lena (não à versão com efeito de pintura a óleo de Lena). O raio é de 10 pixels. (Na versão final, na parte superior desta entrada, o GaussianFilter é aplicado como efeito final.)
Um efeito de filtro gaussiano um pouco mais suave aplicado a r1. O raio é de 5 pixels.
Um intenso efeito de posterização aplicado a Lena. (Na versão final do aplicativo, removi a posterização. Mas vamos deixá-lo na análise, pois os exemplos na análise foram baseados em uma versão anterior com posterização.)
Um efeito de posterização aplicado a r2.
Lena em relevo
A gravação de r3 completa o processamento da imagem. Isso tem a intenção de parecer com o teto do OP.
Para os curiosos, aqui está Lena com os mesmos efeitos de imagem aplicados.
fonte
RandomInteger
uma semente, garantindo assim uma produção específica. Ou você quer dizer outra coisa, como uma imagem inicial não aleatória à qual efeitos são aplicados?Lena will show us how each image effect transforms a life-like picture
me fez rir. O estranho é que a imagem final de Lena parece ter um asteca ou inca voltado para a esquerda, vestindo um cocar e segurando um galho como se fosse uma arma.POV-Ray
Muito potencial de golfe, corra com
povray /RENDER wall.pov -h512 -w512 -K234543
Primeiro, ele cria uma textura aleatória, mas, em vez de parar por aí, transforma a textura em um campo de altura 3D para tornar as sombras radiais da câmera mais realistas. E, para uma boa medida, adiciona outra textura de pequenas saliências no topo.
A única maneira de codificar a semente aleatória é usar a
clock
variável destinada às animações, que é passada com a-K{number}
flagfonte