Estou procurando gerar ruído parecido com este:
(imagens cortesia de Understanding Perlin Noise )
Basicamente, estou procurando barulho com muitas pequenas "ondulações". O seguinte é indesejável:
Existe algum simples maneiras de fazer isso? Estou estudando o perlin e o simplex há uma semana e não consigo fazê-lo funcionar em JavaScript ou, quando o faço, não tenho os parâmetros corretos para gerar essas imagens ou é torturante. lento.
Entendo que as 3 imagens que publiquei provavelmente poderiam ser obtidas pelo mesmo algoritmo, mas em uma escala diferente, mas não preciso desse algoritmo. Eu só preciso de um algoritmo muito simples para conseguir algo como na primeira imagem idealmente. Talvez algum tipo de desfoque funcione, mas não consigo obter resultados.
Estou desenvolvendo isso em JavaScript, mas qualquer tipo de código ou mesmo uma explicação simples e detalhada funcionará.
Respostas:
Enquanto as respostas existentes fornecem uma boa maneira de alcançar o que as imagens na pergunta mostram, os comentários revelaram que o objetivo é gerar uma imagem, como mostrado abaixo:
Esse tipo de ruído é bem diferente do ruído mostrado nas imagens da pergunta, pois forma bolhas próximas e isoladas.
Acontece que esse tipo de ruído é chamado turbulência, que (de acordo com este artigo sobre CPU Gems ) é implementado da seguinte maneira (onde
noise
está sua função de ruído Perlin retornando valores de -1..1):A combinação dessa implementação de JavaScript Perlin-noise com a função de turbulência descrita acima gera um ruído bastante semelhante à imagem acima:
O código JavaScript usado para gerar a imagem acima pode ser encontrado neste jsFiddle .
fonte
return Math.abs(this.noise(x,y,z)*2)-.5
.Suas imagens de exemplo parecem muito com ruído rosa. É gerado assim:
Primeiro, temos algum tipo de ruído aleatório suave. Geralmente, isso é alcançado calculando valores pseudo-aleatórios em pontos com coordenadas inteiras e interpolando esses valores de alguma forma. O resultado nesta fase é semelhante a este:
Em seguida, pegamos esse ruído e o "esprememos", aumentando sua frequência. A fórmula mais simples para isso é n2 (x, y) = n1 (x f, y f). Dessa maneira, o padrão de ruído é pressionado f vezes nos dois diretórios. Melhores algoritmos de ruído também giram e / ou convertem o padrão de ruído nesta etapa, a fim de quebrar as regularidades.
Em seguida, esse padrão compactado é multiplicado por algum valor (menor que 1) e adicionado ao primeiro padrão. Com efeito, adicionamos pequenas variações de alta frequência sobre o padrão de baixa frequência. O resultado é mais ou menos assim:
Os passos 2 e 3 podem ser repetidos várias vezes, adicionando detalhes cada vez mais finos. o resultado líquido geralmente se parece com o seu exemplo com a cruz vermelha. No entanto, observe que temos três parâmetros em nosso algoritmo para jogar:
aqui estão alguns exemplos:
Alta persistência:
Lacunaridade alta:
Baixa lacunaridade:
Brincar com esses parâmetros não é a única coisa que você pode fazer. Uma técnica interessante que pode adicionar caracteres aos padrões de ruído é usar perturbação , ou seja, adicionar algum ruído às coordenadas de entrada da sua função de ruído.
Por exemplo, suponha que você tenha alguma função que gera ruído dadas coordenadas e semente aleatória:
Noise(x,y, seed)
. Do que você pode usar algo parecidoNoise(x+Noise(x,y,234), y+Noise(x,y,6544), seed)
para obter valor perturbado. Isso pode levar a padrões como este (a perturbação é aplicada ao padrão circular aqui, não ao ruído):Se você quiser saber mais, sugiro que dê uma olhada em libnoise (C ++) ou CoherentNoise (C #). Infelizmente, não conheço nenhuma biblioteca de geração de ruído Javascript.
fonte
O código está comentado. O crédito é para Sean McCullough. http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf
Além disso, se você usar um PRNG com isso, poderá obter facilmente resultados facilmente instáveis
fonte
Use texturas pré-geradas ou coloque um gerador de textura de ruído permanente em um servidor e consulte imagens de ruído permanente.
fonte