Créditos ao Hobbies de Calvin por empurrar minha ideia de desafio na direção certa.
Considere um conjunto de pontos no plano, que chamaremos de sites , e associe uma cor a cada site. Agora você pode pintar o plano inteiro colorindo cada ponto com a cor do site mais próximo. Isso é chamado de mapa de Voronoi (ou diagrama de Voronoi ). Em princípio, os mapas de Voronoi podem ser definidos para qualquer métrica de distância, mas simplesmente usaremos a distância euclidiana usual r = √(x² + y²)
. ( Observação: você não precisa necessariamente saber como calcular e renderizar um deles para competir nesse desafio.)
Aqui está um exemplo com 100 sites:
Se você olhar para qualquer célula, todos os pontos nessa célula estarão mais próximos do site correspondente do que em qualquer outro site.
Sua tarefa é aproximar uma determinada imagem com um mapa de Voronoi. Você recebe a imagem em qualquer formato gráfico de varredura conveniente, além de um N inteiro . Você deve produzir até N sites e uma cor para cada site, de modo que o mapa Voronoi baseado nesses sites se assemelhe à imagem de entrada o mais próximo possível.
Você pode usar o snippet de pilha na parte inferior deste desafio para renderizar um mapa Voronoi a partir de sua saída ou pode renderizá-lo você mesmo, se preferir.
Você pode usar funções internas ou de terceiros para calcular um mapa Voronoi a partir de um conjunto de sites (se necessário).
Como é um concurso de popularidade, ganha a resposta com o maior número de votos. Os eleitores são incentivados a julgar as respostas
- quão bem as imagens originais e suas cores são aproximadas.
- quão bem o algoritmo funciona em diferentes tipos de imagens.
- quão bem o algoritmo funciona para N pequeno .
- se o algoritmo agrupa adaptativamente pontos nas regiões da imagem que exigem mais detalhes.
Imagens de teste
Aqui estão algumas imagens para testar seu algoritmo (alguns de nossos suspeitos comuns, outros novos). Clique nas imagens para versões maiores.
A praia na primeira fila foi desenhada por Olivia Bell e incluída com sua permissão.
Se você quer um desafio extra, tente Yoshi com um fundo branco e acerte a linha da barriga.
Você pode encontrar todas essas imagens de teste nesta galeria de imagens, onde é possível fazer o download de todas elas como um arquivo zip. O álbum também contém um diagrama aleatório de Voronoi como outro teste. Para referência, aqui estão os dados que os geraram .
Inclua diagramas de exemplo para uma variedade de imagens diferentes e N , por exemplo, 100, 300, 1000, 3000 (além de pastas para algumas das especificações de célula correspondentes). Você pode usar ou omitir bordas pretas entre as células como achar melhor (isso pode parecer melhor em algumas imagens do que em outras). Não inclua os sites (exceto em um exemplo separado, talvez se você quiser explicar como o posicionamento do site funciona, é claro).
Se você deseja mostrar um grande número de resultados, pode criar uma galeria no imgur.com , para manter o tamanho das respostas razoáveis. Como alternativa, coloque miniaturas em sua postagem e faça links para imagens maiores, como fiz na resposta de referência . Você pode obter as pequenas miniaturas anexando s
o nome do arquivo no link imgur.com (por exemplo, I3XrT.png
-> I3XrTs.png
). Além disso, fique à vontade para usar outras imagens de teste, se encontrar algo legal.
Renderer
Cole sua saída no seguinte snippet de pilha para renderizar seus resultados. O formato exato da lista é irrelevante, desde que cada célula seja especificada por 5 números de ponto flutuante na ordem x y r g b
, onde x
e y
são as coordenadas do site da célula e r g b
os canais de cores vermelho, verde e azul no intervalo 0 ≤ r, g, b ≤ 1
.
O trecho fornece opções para especificar uma largura de linha das bordas da célula e se os sites da célula devem ou não ser exibidos (o último principalmente para fins de depuração). Mas observe que a saída só é renderizada novamente quando as especificações da célula são alteradas - portanto, se você modificar algumas das outras opções, adicione um espaço às células ou algo assim.
Créditos maciços a Raymond Hill por escrever esta realmente agradável biblioteca JS Voronoi .