A matemática inteira pode gerar padrões surpreendentes quando dispostos em uma grade. Mesmo as funções mais básicas podem produzir designs incrivelmente elaborados!
Seu desafio
Escreva 3 corpos de função Tweetable (significando 140 caracteres ou menos) para os valores de vermelho, verde e azul para uma imagem de 1024x1024.
A entrada para as funções será dois números inteiros i (número da coluna para o pixel especificado) ej (número da linha para o pixel especificado) e a saída será um curto não assinado entre 0 e 1023, inclusive, o que representa a quantidade do valor especificado cor presente no pixel (i, j).
Por exemplo, as três funções a seguir produzem a imagem abaixo:
/* RED */
return (unsigned short)sqrt((double)(_sq(i-DIM/2)*_sq(j-DIM/2))*2.0);
/* GREEN */
return (unsigned short)sqrt((double)(
(_sq(i-DIM/2)|_sq(j-DIM/2))*
(_sq(i-DIM/2)&_sq(j-DIM/2))
));
/* BLUE */
return (unsigned short)sqrt((double)(_sq(i-DIM/2)&_sq(j-DIM/2))*2.0);
/* RED */
return i&&j?(i%j)&(j%i):0;
/* GREEN */
return i&&j?(i%j)+(j%i):0;
/* BLUE */
return i&&j?(i%j)|(j%i):0;
As regras
- Dado esse código C ++ , substitua em suas funções. Forneci algumas macros e incluí a biblioteca, e você pode incluir complex.h. Você pode usar quaisquer funções dessas bibliotecas e / ou minhas macros. Por favor, não use nenhum recurso externo além disso.
Se essa versão não estiver funcionando para você, verifique se está compilando com:
g++ filename.cpp -std=c++11
Se isso não funcionar, use a versão alternativa usando caracteres não assinados em vez de curtos não assinados.
Michaelangelo forneceu uma versão de saída em cores de 24 ou 48 bits limpa .
- Você pode implementar sua própria versão em outro idioma, mas deve se comportar da mesma maneira que a versão C ++ fornecida e apenas funções dos recursos internos do C ++, da biblioteca ou das macros fornecidas podem ser usadas para torná-la justa.
- Poste apenas seus três corpos funcionais - não inclua meu código na sua postagem
- Inclua uma versão menor ou uma cópia incorporada da sua imagem. Eles são criados em um formato ppm e podem precisar ser convertidos em outro para uma visualização adequada no stackexchange.
- Os corpos das funções (sem incluir a assinatura) devem ter 140 caracteres ou menos.
- Este é um concurso de popularidade - a maioria dos votos vence
fonte
Respostas:
Mandelbrot 3 x 133 caracteres
A primeira coisa que me veio à mente foi "Mandelbrot!".
Sim, eu sei que já existe um envio de mandelbrot. Depois de confirmar que consigo obtê-lo abaixo de 140 caracteres, levei os truques e otimizações dessa solução para a minha (obrigado Martin e Todd). Isso deixou espaço para escolher um local e um zoom interessantes, além de um bom tema de cores:
132 caracteres no total
Tentei reduzi-lo a 140 para todos os 3 canais. Há um pouco de ruído colorido próximo à borda, e a localização não é tão interessante quanto a primeira, mas: 132 caracteres
fonte
Toalhas de mesa
Plano
Comecei colocando um padrão xadrez / guingão em perspectiva como uma toalha de mesa sem limites:
Ondulação
Introduzi uma ondulação (perspectiva não estritamente correta, mas ainda com 140 caracteres):
Cor
Depois, fiz algumas cores mais granuladas para dar detalhes em uma escala maior de escalas e para tornar a imagem mais colorida ...
Em movimento
Reduzir um pouco mais o código permite definir uma fase de onda P com 2 casas decimais, o que é suficiente para quadros próximos o suficiente para uma animação suave. Reduzi a amplitude nesta fase para evitar induzir a doença do mar e mudei a imagem inteira para mais 151 pixels (ao custo de 1 caractere extra) para empurrar o aliasing para o topo da imagem. O aliasing animado é fascinante.
fonte
#define P
. É necessário jogar golfe para permitir os caracteres adicionais#define P 6.03
.Pintor aleatório
Aqui está uma entrada baseada em aleatoriedade. Para cerca de 0,1% dos pixels, escolhe uma cor aleatória, para os outros usa a mesma cor que um pixel adjacente aleatório. Observe que cada cor faz isso de forma independente; portanto, isso é apenas uma sobreposição de uma imagem aleatória em verde, azul e vermelho. Para obter resultados diferentes em diferentes execuções, você precisará adicionar
srand(time(NULL))
àmain
função.Agora, para algumas variações.
Ao pular pixels, podemos torná-lo um pouco mais embaçado.
E então podemos mudar lentamente as cores, onde os transbordamentos resultam em mudanças bruscas que tornam isso mais parecido com pinceladas
Coisas que eu preciso descobrir:
srand
essas funções sem obter um segfault.Você também pode tornar a caminhada aleatória isotrópica, como
dar a voce
Pinturas mais aleatórias
Eu brinquei com isso um pouco mais e criei algumas outras pinturas aleatórias. Nem tudo isso é possível dentro das limitações deste desafio, por isso não quero incluí-las aqui. Mas você pode vê-los nesta galeria imgur, juntamente com algumas descrições de como eu os produzi.
Estou tentado a desenvolver todas essas possibilidades em um framework e colocá-lo no GitHub. (Ainda não existem coisas como essa, mas é divertido de qualquer maneira!)
fonte
Algumas coisas swirly pontudas
Sim, eu sabia exatamente como nomear.
EDIT: não usa mais
pow
. EDIT 2: @PhiNotPi apontou que não preciso usar tanto o abdômen.Você pode alterar os pontos de referência com bastante facilidade para obter uma imagem diferente:
@EricTressler apontou que minhas fotos têm Batman nelas.
fonte
Claro, tem que haver uma submissão de Mandelbrot.
Tentando melhorar o esquema de cores agora. É trapaça se eu definir o cálculo como uma macro
red_fn
e usá-la nas outras duas para ter mais caracteres para a seleção de cores sofisticadas em verde e azul?Edit: É realmente difícil criar esquemas de cores decentes com esses poucos bytes restantes. Aqui está outra versão:
E de acordo com a sugestão de githubphagocyte e com as melhorias de Todd Lehman, podemos facilmente escolher seções menores:
Por exemplo
dá
fonte
Conjuntos de Julia
Se houver um Mandelbrot, também deve haver um conjunto de Julia.
Você pode passar horas ajustando os parâmetros e funções, portanto, este é apenas um rápido, que parece decente.
Inspirado pela participação de Martin.
Gostaria de um pouco de RNG?
OK, o comentário de Sparr me colocou na pista para escolher aleatoriamente os parâmetros dessas pequenas Julias. Eu tentei primeiro fazer hackers em nível de bit com o resultado de
time(0)
mas o C ++ não permite literais de ponto flutuante hexadecimal, então esse era um beco sem saída (com meu conhecimento limitado pelo menos). Eu poderia ter usado um elenco pesado para consegui-lo, mas isso não se encaixaria nos 140 bytes.Eu não tinha muito espaço de qualquer maneira, então tive que largar a Julia vermelha para colocar minhas macros e ter um RNG mais convencional (
time
d seed e realrand()
, woohoo!).Opa, algo está faltando. Obviamente, esses parâmetros precisam ser estáticos ou você terá alguns resultados estranhos (mas engraçado, talvez eu investigue um pouco mais tarde se encontrar algo interessante).
Então aqui estamos, apenas com canais verde e azul:
Agora vamos adicionar um padrão vermelho simples para preencher o vazio. Não é realmente imaginativo, mas eu não sou um programador gráfico ... ainda :-)
E, finalmente, o novo código com parâmetros aleatórios:
Ainda resta espaço agora ...
fonte
Este é interessante porque não usa os parâmetros i, j. Em vez disso, ele se lembra do estado em uma variável estática.
fonte
fonte
Buddhabrot (+ Antibuddhabrot)
Edit: É um Buddhabrot adequado agora!
Edit: Consegui limitar a intensidade da cor dentro do limite de bytes, para que não haja mais pixels falsamente pretos devido ao estouro.
Eu realmente queria parar depois das quatro ... mas ...
Isso fica um pouco compactado durante o upload (e diminui ao incorporar); portanto, se você quiser admirar todos os detalhes, aqui está o interessante corte de 512 x 512 (que não é compactado e é exibido em tamanho real):
Obrigado ao githubphagocyte pela ideia. Isso exigiu um abuso bastante complicado das três funções de cores:
Restam alguns bytes para um melhor esquema de cores, mas até agora não encontrei nada que superasse a imagem em escala de cinza.
O código fornecido usa pontos iniciais de 4096 x 4096 e faz até 500.000 iterações em cada uma delas para determinar se as trajetórias escapam ou não. Isso levou entre 6 e 7 horas na minha máquina. Você pode obter resultados decentes com uma grade de 2k por 2k e iterações de 10k, o que leva dois minutos, e até mesmo uma grade de 1k por 1k com iterações de 1k parece bastante agradável (isso leva 3 segundos). Se você quiser mexer com esses parâmetros, há alguns lugares que precisam ser alterados:
5e5
inBL
na sua contagem de iterações.4096
emRD
que a resolução desejada e1024.
emGR
pelo mesmo fator para manter a escala correta.return c[i][j]
,GR
pois ela contém apenas o número absoluto de visitas de cada pixel. A cor máxima parece ser principalmente independente da contagem de iterações e é dimensionada linearmente com o número total de pontos de partida. Portanto, se você deseja usar uma grade de 1k por 1k, talvez queirareturn c[i][j]*16;
ou algo parecido, mas esse fator às vezes precisa de alguma brincadeira.Para aqueles que não estão familiarizados com o Buddhabrot (como eu há alguns dias), é baseado no cálculo de Mandelbrot, mas a intensidade de cada pixel é a frequência com que esse pixel foi visitado nas iterações das trajetórias de fuga. Se contamos as visitas durante trajetórias sem escape, é um Antibuddhabrot. Existe uma versão ainda mais sofisticada chamada Nebulabrot, na qual você usa uma profundidade de recursão diferente para cada canal de cor. Mas vou deixar isso para outra pessoa. Para mais informações, como sempre, Wikipedia .
Originalmente, não fazia distinção entre trajetórias de escape e não-escape. Isso gerou uma trama que é a união de um Buddhabrot e um Antibuddhabrot (como apontado pelos gitubagócitos).
Este parece um pouco com uma fotografia desbotada ... eu gosto disso.
fonte
Pentágono de Sierpinski
Você pode ter visto o método do jogo do caos de aproximar o triângulo de Sierpinski plotando pontos a meio caminho de um vértice escolhido aleatoriamente. Aqui eu segui a mesma abordagem usando 5 vértices. O código mais curto que eu pude escolher incluiu a codificação embutida dos 5 vértices, e não havia como encaixar tudo isso em 140 caracteres. Por isso, delegamos o componente vermelho a um pano de fundo simples e usei o espaço livre na função vermelho para definir uma macro para colocar as outras duas funções abaixo de 140 também. Então, tudo é válido ao custo de não ter componente vermelho no pentágono.
Agradecemos a Martin Büttner pela idéia mencionada nos comentários da pergunta sobre como definir uma macro em uma função para usar em outra e também por usar a memoisation para preencher os pixels em uma ordem arbitrária, em vez de restringir-se à ordem raster da função principal .
A imagem tem mais de 500 KB e é convertida automaticamente em jpg por troca de pilhas. Isso obscurece alguns dos detalhes mais delicados, então também incluí o quarto superior direito como um png para mostrar a aparência original:
fonte
Partitura
Música Sierpinski. : D Os caras no bate-papo dizem que parece mais o papel perfurado para caixas de música.
Alguns detalhes de como isso funciona ... na verdade, é apenas um zoom na renderização de alguns triângulos ondulados de Sierpinski. A aparência da partitura (e também do bloqueio) é o resultado do truncamento inteiro. Se eu mudar a função vermelha para, digamos,
o truncamento é removido e obtemos a renderização em resolução total:
Então, sim, isso é interessante.
fonte
Gerador de diagrama aleatório Voronoi alguém?
OK, este me deu um tempo difícil. Eu acho que é muito bom, mesmo que os resultados não sejam tão artísticos quanto alguns outros. Esse é o problema da aleatoriedade. Talvez algumas imagens intermediárias pareçam melhores, mas eu realmente queria ter um algoritmo totalmente funcional com diagramas de voronoi.
Editar:
Este é um exemplo do algoritmo final. A imagem é basicamente a superposição de três diagramas voronoi, um para cada componente de cor (vermelho, verde, azul).
Código
versão comentada e não-gasta no final
Foram necessários muitos esforços, então sinto vontade de compartilhar os resultados em diferentes estágios, e há bons (incorretos) para mostrar.
Primeiro passo: coloque alguns pontos aleatoriamente, com
x=y
Eu o convertei para jpeg porque o png original era muito pesado para upload (
>2MB
), aposto que são mais de 50 tons de cinza!Segundo: tenha uma melhor coordenada y
Eu não podia me dar ao luxo de ter outra tabela de coordenadas gerada aleatoriamente para o
y
eixo, então eu precisava de uma maneira simples de obter as " aleatórias " no menor número de caracteres possível. Eu fui usar ax
coordenada de outro ponto na tabela, fazendo um bitAND
de bit no índice do ponto.3º: não me lembro, mas está ficando bom
Mas, naquele momento, eu tinha mais de 140 caracteres, então precisava jogar bastante.
4º: scanlines
Brincadeirinha, isso não é desejado, mas meio legal, acho.
Ainda trabalhando na redução do tamanho do algoritmo, tenho orgulho de apresentar:
Edição StarFox
Voronoi instagram
5º: aumentar o número de pontos
Agora tenho um código de trabalho, então vamos de 25 para 60 pontos.
É difícil ver apenas uma imagem, mas os pontos estão quase todos localizados no mesmo
y
intervalo. Claro, não mudei a operação bit a bit,&42
é muito melhor:E aqui estamos, no mesmo ponto da primeira imagem deste post. Vamos agora explicar o código para os raros que estariam interessados.
Código explicado e não jogado
Obrigado pela leitura até agora.
fonte
O Fractal Lyapunov
A string usada para gerar isso foi AABAB e o espaço do parâmetro foi [2,4] x [2,4]. ( explicação da string e do espaço dos parâmetros aqui )
Com espaço limitado no código, achei essa cor bem legal.
Também fiz uma variação do conjunto de Mandelbrot. Ele usa um mapa semelhante ao mapa definido de Mandelbrot. Digamos que M (x, y) é o mapa de Mandelbrot. Então M (sin (x), cos (y)) é o mapa que eu uso e, em vez de verificar os valores de escape, eu uso x, y, pois eles sempre são limitados.
EDITAR
Depois de muita dor, finalmente consegui criar um gif da segunda imagem se transformando. Aqui está:
fonte
Porque unicórnios.
Não consegui obter a versão dos OPs
unsigned short
e os valores de cores até 1023 funcionando; portanto, até que isso seja corrigido, aqui está uma versão usandochar
o valor máximo de cores 255.fonte
Logistic Hills
As funções
Ungolfed
Todos os #defines devem caber no BL com menos de 140 caracteres. Aqui está a versão não destruída do algoritmo azul, ligeiramente modificada:
Onde os valores de x caem com mais frequência para um dado r (valor de j), o gráfico se torna mais claro (geralmente representado como mais escuro).
fonte
Agregação limitada por difusão
Eu sempre fui fascinado pela agregação limitada por difusão e pelo número de maneiras diferentes em que ela aparece no mundo real.
Achei difícil escrever isso em apenas 140 caracteres por função, então tive que tornar o código horrível (ou bonito, se você gosta de coisas como
++d%=4
efor(n=1;n;n++)
). As três funções de cores se chamam e definem macros para o outro usar, para que não sejam bem-interpretadas, mas cada função tem pouco menos de 140 caracteres.Para visualizar como as partículas se agregam gradualmente, produzi instantâneos em intervalos regulares. Cada quadro foi produzido substituindo o 1 in
for(n=1;n;n++)
por 0, -1 << 29, -2 << 29, -3 << 29, 4 << 29, 3 << 29, 2 << 29, 1 << 29, 1. Isso o manteve abaixo do limite de 140 caracteres para cada execução.Você pode ver que os agregados que crescem próximos um do outro privam um ao outro as partículas e crescem mais lentamente.
Ao fazer uma pequena alteração no código, é possível ver as partículas restantes que ainda não foram anexadas aos agregados. Isso mostra as regiões mais densas onde o crescimento ocorrerá mais rapidamente e as regiões muito esparsas entre os agregados, onde não há mais crescimento devido ao desgaste de todas as partículas.
Isso pode ser animado da mesma maneira que antes:
fonte
Espiral (140 exatamente)
São 140 caracteres exatamente se você não incluir os cabeçalhos e colchetes das funções. É tanta complexidade em espiral que eu poderia caber no limite de caracteres.
Gradualmente, construí uma espiral simples, adicionando padrões às bordas espirais e experimentando como diferentes espirais podem ser combinadas para parecerem legais. Aqui está uma versão não-gasta com comentários explicando o que cada peça faz. Mexer com os parâmetros pode produzir alguns resultados interessantes.
Brincando com parâmetros:
Aqui, as espirais estão alinhadas, mas têm padrões de borda diferentes. Em vez das arestas em blocos no exemplo principal, possui arestas inteiramente compostas por ondas de pecado.
Aqui, o gradiente foi removido:
Uma animação (
que por algum motivo não parece estar em loop após o upload, desculpe. Além disso, eu tive que reduzi-la. Basta abri-la em uma nova guia se você perdeu a animação):E aqui está o álbum imgur com todas as imagens. Eu adoraria ver se alguém pode encontrar outros padrões espirais legais. Além disso, devo dizer, este é de longe um dos maiores desafios por aqui que eu já vi. Desfrutar!
EDIT: Aqui estão alguns fundos feitos a partir dessas espirais com parâmetros alterados.
Além disso, combinando meus padrões de borda em espiral com alguns dos fractais que vi aqui através do uso de xor / e / ou operações, aqui está uma espiral final:
fonte
Homenagem a um clássico
V1 : Inspirado no "Seja feliz" da DreamWarrior, esse envio direto incorpora uma pequena imagem de pixel-art em cada canal de cores. Eu nem precisava jogar o código!
V2 : agora com código consideravelmente mais curto e uma borda preta grossa isolando apenas a "tela do jogo".
V3 : nave espacial, bala, alienígenas danificados e borda azul, oh meu! Tentando apontar para isso , aproximadamente.
Por acaso, deparei com uma edição de Umber Ferrule, cujo avatar me inspirou a adicionar outra entrada baseada em pixel art. Como a idéia central do código é bastante semelhante à do Space Invaders, anexo-a a esta entrada, embora os dois definitivamente tenham pontos de desafio diferentes. Para este, ficar bem rosa (às custas do branco) e o fato de ser um sprite bastante grande foram bons desafios. Os escapes hexadecimais (
\xFF
etc) no canal vermelho representam seus caracteres correspondentes no arquivo de origem (ou seja, o canal vermelho no arquivo de origem contém dados binários), enquanto os escapes octais são literais (ou seja, presentes no arquivo de origem).fonte
Pintura de ação
Eu queria tentar recriar algo semelhante ao trabalho de Jackson Pollock - pingando e derramando tinta sobre uma tela horizontal. Embora eu tenha gostado dos resultados, o código foi muito longo para ser postado nesta pergunta e meus melhores esforços ainda o reduziram a cerca de 600 bytes. Portanto, o código postado aqui (que possui funções de 139 bytes, 140 bytes e 140 bytes, respectivamente) foi produzido com uma enorme quantidade de ajuda de alguns dos gênios no bate-papo . Muito obrigado a:
para uma sessão de golfe em grupo implacável.
A macro E (q) é usada nas funções RD e GR. Alterar o valor do argumento altera a maneira como os componentes vermelho e verde das cores mudam. A macro J termina com um número usado para determinar quanto o componente azul é alterado, o que afeta os componentes vermelho e verde porque são calculados a partir dele. Incluí algumas imagens com os argumentos vermelho e verde de E variados para mostrar a variedade possível de combinações de cores. Passe o mouse sobre as imagens para obter os valores vermelho e verde, se você quiser executá-las.
Todas essas imagens podem ser visualizadas em tamanho real se você as baixar. O tamanho do arquivo é pequeno, pois a cor plana se adapta ao algoritmo de compactação PNG, portanto, nenhuma compactação com perdas foi necessária para fazer o upload para o site.
Se você quiser ver imagens de vários estágios do processo de golfe, como tentamos coisas diferentes, consulte o bate-papo sobre pintura de ação .
fonte
Achei que eu iria brincar com os parâmetros desse código ... Todo o crédito é para @Manuel Kasten. São tão legais que eu não pude resistir a postar.
BubbleGumRupture http://i57.tinypic.com/3150eqa.png
SeussZoom http://i59.tinypic.com/am3ypi.png
SeussEternalForest http://i61.tinypic.com/35akv91.png
fonte
Edit: Esta é agora uma resposta válida, graças às declarações avançadas de
GR
eBL
.Divertir-se com a sequência Q de Hofstadter! Se estivermos usando a distância radial de algum ponto como entrada e saída como cor inversa, obteremos algo parecido com vinil colorido.
A sequência é muito semelhante à sequência de Fibonacci, mas, em vez de recuar 1 e 2 etapas na sequência, você toma os dois valores anteriores para determinar a que distância voltar antes de obter a soma. Ela cresce aproximadamente linear, mas de vez em quando há uma explosão de caos (em intervalos crescentes) que então se estabelece em uma sequência quase linear novamente antes da próxima explosão:
Você pode ver essas ondulações na imagem depois de regiões com uma aparência muito "plana".
Obviamente, usar apenas uma cor é chato.
Agora para o código. Eu preciso da função recursiva para calcular a sequência. Para fazer isso, eu uso
RD
sempre quej
é negativo. Infelizmente, isso não deixa caracteres suficientes para calcular o valor do canal vermelho, então, porRD
sua vez, chamaGR
com um deslocamento para produzir o canal vermelho.Obviamente, esse é o uso mais simples possível da sequência, e há muitos caracteres restantes. Sinta-se livre para emprestá-lo e fazer outras coisas loucas com ele!
Aqui está outra versão em que o limite e as cores são determinados pela sequência Q. Nesse caso, havia espaço suficiente
RD
para que eu nem precisasse da declaração de encaminhamento:fonte
Isso calcula a transformação de Joukowsky de um conjunto de círculos concêntricos centralizados em um ponto ligeiramente deslocado da origem. Modifiquei levemente as intensidades no canal azul para dar um pouco de variação de cor.
fonte
Objetivo-C
Reescrevi o código C ++ no Objective-C porque não consegui compilar ... Ele deu os mesmos resultados que outras respostas ao executar no meu iPad, então está tudo bem.
Aqui está o meu envio:
O código por trás disso é bastante simples:
Você pode aplicar zoom em praças multiplicando
i
ej
por0.5
,0.25
etc. antes de serem processadas.fonte
x^(x-y)^y
(isso também me assustou pela primeira vez). Se você possui recursos para iOS, eis o meu código: gist.github.com/Jugale/28df46f87037d81d2a8fSierpinski Paint Splash
Eu queria brincar mais com as cores, então continuei mudando minha outra resposta (a swirly) e acabei acabando com isso.
É o meu avatar agora. : P
fonte
Sinto-me compelido a enviar esta entrada que chamarei de "comportamento indefinido", que ilustrará o que seu compilador faz com funções que deveriam retornar um valor, mas não:
Todos os pixels pretos:
Pixels pseudo-aleatórios:
E, é claro, uma série de outros resultados possíveis, dependendo do seu compilador, computador, gerenciador de memória, etc.
fonte
groovy
Apenas alguns truques de trigonometria e macro estranhos.
RD:
GR:
BL:
EDIT: se
M_PI
não for permitido por estar presente apenas em sistemas compatíveis com POSIX, ele poderá ser substituído pelo literal3.14
.fonte
acos(-1)
é um bom substituto paraM_PI
.Eu não sou bom em matemática. Eu sempre fui pobre aluno na aula de matemática. Então eu fiz um simples.
Eu usei o código Javascript do user1455003 modificado . E este é o meu código completo .
É muito curto, então todas as três funções se encaixam em um tweet.
Outras funções muito curtas. Encontrei esse padrão de sierpinski (e algum padrão tangente) enquanto brincava com várias funções matemáticas. Este é o código completo
fonte
i&j
processa o triângulo de Sierpinski, na verdade. O que é incrível .Javascript
Outra versão. os corpos das funções são twittáveis.
Função de renderização de imagem revisada. draw (rgbFunctions, setCloseEvent);
Roxa
fonte
Pintor Planetário
Inspirado pela entrada obviamente impressionante de Martin , essa é uma opinião diferente. Em vez de semear aleatoriamente uma parte dos pixels, começo com o canto superior esquerdo como RGB (512.512.512) e faço caminhadas aleatórias em cada cor a partir daí. O resultado parece algo de um telescópio (imo).
Cada pixel obtém a média dos pixels acima / à esquerda e adiciona um pouco de aleatoriamente. Você pode brincar com a variabilidade alterando a
p
variável, mas acho que estou usando um bom equilíbrio (principalmente porque gosto de azul, então mais volatilidade de desfoque dá bons resultados).Há uma leve tendência negativa da divisão inteira ao calcular a média. Mas acho que dá certo e dá um bom efeito de escurecimento no canto inferior.
Obviamente, para obter mais do que apenas um resultado, você precisará adicionar uma
srand()
linha à sua função principal.fonte
Ondas refletidas
Um padrão básico do tabuleiro de xadrez distorce de acordo com a posição de uma onda se expandindo de um ponto como uma pedra jogada em um lago (muito longe de ser fisicamente precisa!). A variável
w
é o número de pixels a partir desse ponto em que a onda se moveu. Sew
for grande o suficiente, a onda será refletida pelos lados da imagem.w
= 225w
= 360w
= 5390Aqui está um GIF mostrando uma sucessão de imagens à medida que a onda se expande. Forneci vários tamanhos diferentes, cada um mostrando quantos quadros o limite de tamanho do arquivo de 500 KB permitirá.
Se eu conseguir encontrar uma maneira de ajustá-lo, eu gostaria idealmente de modelar a interferência das ondas, para que as ondas pareçam mais realistas quando se cruzam. Estou satisfeito com a reflexão.
Observe que eu realmente não modelei a reflexão da onda em 3 lotes de 140 bytes. Não há realmente nenhuma reflexão acontecendo, apenas parece com isso. Escondi a explicação caso alguém queira adivinhar primeiro:
fonte