Escreva um programa que inclua um número inteiro de 0 a 65535 (2 16 -1) e gere uma imagem única de 500 × 500 pixels que seja o mais semelhante possível a essas 6 imagens da vida real de solo rachado:
Essas são miniaturas, clique nelas para ver as imagens em tamanho real de 500 × 500.
O objetivo aqui é tornar as imagens geradas por computador o mais realistas possível . Idealmente, se qualquer uma das imagens geradas pelo seu programa fosse misturada com as 6 imagens acima, alguém vendo as imagens pela primeira vez não seria capaz de diferenciar as geradas por computador das reais.
O fotorrealismo perfeito é complicado, no entanto, faça o melhor que puder. Este é um concurso de popularidade, para que as respostas com resultados mais realistas sejam mais votadas e mais propensas a vencer.
Você pode usar funções ou bibliotecas de processamento de imagem.
Você pode basear seu algoritmo nas informações coletadas das 6 imagens de amostra, mas suas possíveis imagens de saída 65536 (2 16 ) devem ser visualmente distintas uma da outra e das imagens de amostra, especialmente no que diz respeito à disposição das rachaduras. Você deve realmente gerar suas imagens, não apenas girar e traduzir uma seleção de uma foto preexistente.
Caso contrário, você não deve codificar suas saídas. Um algoritmo genérico deve ser usado e números maiores que 65535 devem, teoricamente, produzir saídas válidas. (Eu o restringi apenas para acomodar tipos inteiros com um máximo pequeno).
O número inteiro de entrada pode ser pensado como uma semente que resulta em uma imagem aleatória de saída do solo rachado. Porém, deve ser determinístico, portanto a mesma entrada sempre deve resultar na mesma saída.
As imagens de saída devem ter exatamente 500 × 500 pixels.
As imagens de saída podem ser salvas em qualquer formato de arquivo de imagem comum ou simplesmente exibidas.
Certifique-se de incluir alguns exemplos de imagens de saída em sua resposta e os números de entrada correspondentes.
A resposta com mais votos vence. É claro que os eleitores devem votar de forma positiva as respostas que tentam produzir imagens semelhantes às 6 amostras, e as de votos negativos que violam regras ou dão resultados inconsistentes.
As 6 imagens de amostra foram tiradas em texturelib.com . As seleções de área de 1000 × 1000 pixels foram obtidas de duas imagens maiores de solo rachado e redimensionadas para 500 × 500. Você pode usar a análise dessas imagens maiores em seu programa, mas a saída deve imitar especificamente as 6 imagens de amostra escolhidas.
Votei em encerrar este desafio como Muito Amplo, porque não possui critérios objetivos de validade .
@HelkaHomba Se um desafio antigo foi bem recebido ou não, não deveria ter influência se um desafio agora se encaixa nas regras do site, conforme decidido por consenso. Os PopCons tiveram uma tremenda discussão nos últimos meses, um dos resultados foi que todos os PopCons precisam de um critério de validade objetivo. Este desafio não tem isso. Portanto, é muito amplo.
As regras atuais sobre os contras do pop são tão estúpidas que eu aproveitaria a chance para ignorá-las e ver como as coisas funcionam. Este tópico foi abordado na meta, onde é discutido até a morte, mas nada realmente muda, então acho que a melhor chance de algo acontecer é manter alguns contras pop e ver como eles acontecem.
Os critérios de validade objetivo aqui são "exclusivos" (distintos dos outros 65535) e "500x500 pixels". A semelhança com as imagens de exemplo não pode ser definida objetivamente, ou isso não seria um concurso de popularidade, mas um desafio de código.
Vejo maus pop como "fazer algo bonito" sem restrição, e bons pop como "corresponder a esta especificação" com humanos votando em qual combina melhor. Definitivamente, vejo esse desafio como bom.
Um diagrama de Voronoi se parece com este desenho, da Wikipedia, mostrando 19 células, cada uma contendo um único ponto inicial. Uma célula consiste na sub-região de pontos aos quais o respectivo ponto de geração está mais próximo do que qualquer outro ponto de semente.
O código abaixo gera um diagrama a partir de 80 pontos aleatórios (na região quadrada delimitada por (-1, -1) e (1,1)).
Ele usa as primitivas de polígono (em 2D) no diagrama para criar poliedros (em 3D). Imagine que cada polígono tem, logo abaixo, uma tradução (-.08 em z) de si mesma. Pense nos dois polígonos como a face superior e inferior de um poliedro. "Faces laterais" são então adicionadas para completar o poliedro.
Cada poliedro é então traduzido para fora, a partir do centro da imagem, no plano xy; afasta-se do meio. A magnitude da tradução varia diretamente com a distância entre o ponto aleatório de geração original do poliedro e o centro da tela. Essa "expansão" do poliedro no plano xy resulta em fendas.
Convém adaptar-se a isso para um criador de padrões de vidro quebrado.
@ Sparr, sim, parece vidro quebrado (ou ladrilhos).
@cat Não, não é jogado golfe.
@DavidC Onde está todo o espaço em branco? Você escreve assim? O Wolfram aplica código ilegível?
Eu usei uma abordagem baseada em diagramas recursivos de Voronoi. As saídas não parecem muito realistas, mas acho que estão bem.
Aqui estão alguns exemplos de imagens (redimensionadas para 250x250 para não preencher a tela inteira):
Mais detalhes sobre o algoritmo:
Todas as imagens nesta seção estão usando a mesma semente.
O algoritmo começa gerando um diagrama de Voronoi com 5 pontos:
Se olharmos para as imagens originais no desafio, podemos ver que as linhas não são todas retas assim, então pesamos a distância por um valor aleatório, com base no ângulo do ponto, além disso, ângulos mais próximos fornecem valores mais próximos :
Agora, desenhamos recursivamente esses tipos de diagramas de Voronoi dentro de cada região, com linhas mais finas e transparentes, e removemos o fundo, com uma profundidade de recursão máxima de 3, e obtemos:
Agora, basta adicionar o fundo marrom claro e pronto!
O código consiste em três classes Main.java, VoronoiPoint.javae Vector.java:
Vector.java: (Esta classe é copiada de um dos meus outros projetos, portanto, contém algum código desnecessário)
Mas não quero compilar um monte de classes Java!
Aqui está um arquivo JAR que você pode executar para gerar essas imagens você mesmo. Corra como java -jar Soil.jar number, onde numberestá a semente (pode ser qualquer coisa até 2 31 -1), ou corra como java -jar Soil.jar, e escolhe uma semente por si só. Haverá alguma saída de depuração.
Por alguma razão, acho essas imagens bastante realistas e também completamente falsas. A falta de sombras naturais está me excitando.
Se ajudar, você pode fazer upload de imagens em tamanho real e fazer pequenas miniaturas, como no post de desafio, ou imagens médias que se encaixam em 2 e ocupam menos espaço vertical. Na fonte do desafio, você pode ver como adicionar um "s" no endereço imgur torna as imagens pequenas e também é possível usar um "m" para mídia. A fonte também mostra como transformar a imagem pequena em um link para a imagem em tamanho real.
Eu acho que as cores podem estar muito mais próximas - mais cinza, menos bege. Mas de outra maneira boa resposta!
Python 3 (usando a biblioteca Kivy e GLSL)
Primeira imagem gerada
Arquivo KV:
Código GLSL:
A função voronoi no código GLSL é de Íñigo Quílez. Todo cálculo relacionado a voronoi acontece inteiramente no shader de fragmento, com algumas funções de ruído de procedimento para criar manchas e perturbar um pouco as linhas do padrão de voronoi.
Ao pressionar o espaço, a semente será aumentada em 1 e uma nova imagem será gerada e salva como um .pngarquivo.
Atualização: distorção de lente adicionada, vinhetas e aberração cromática para torná-lo mais foto-realista. Adicionado sub-voronoi padrão.
Isso também pode receber uma semente como entrada?
A classe ShaderSurface tem um membro da classe seed. Isso será canalizado para o shader como uma variável flutuante uniforme. Na função de trinca do shader, a semente é usada para traduzir o ponto pelo valor da semente.
— Gábor Fekete 27/06
Cria um composto de dois diagramas aleatórios, que são executados através de uma simples detecção de aresta e finalmente convertidos no resultado final.