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.
Regras
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.
fonte
Respostas:
Mathematica
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.
Código
fonte
Java
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):
0:
1:
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!
Código:
O código consiste em três classes
Main.java
,VoronoiPoint.java
eVector.java
:Main.java
:VoronoiPoint.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
, ondenumber
está a semente (pode ser qualquer coisa até 2 31 -1), ou corra comojava -jar Soil.jar
, e escolhe uma semente por si só. Haverá alguma saída de depuração.fonte
Python 3 (usando a biblioteca Kivy e GLSL)
Primeira imagem gerada
Código Python:
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
.png
arquivo.Atualização: distorção de lente adicionada, vinhetas e aberração cromática para torná-lo mais foto-realista. Adicionado sub-voronoi padrão.
fonte
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.Java
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.
Algumas saídas:
Algumas das etapas intermediárias para essa última:
(O primeiro diagrama voronoi)
(O composto dos dois diagramas de voronoi)
(Após a etapa de detecção da borda, mas antes da recoloração final)
fonte