Dada uma imagem que possui apenas pixels preto e branco e um local (x, y) que é um pixel branco, pinte os pixels brancos com base na distância mínima de Manhattan de (x, y) em um caminho que envolva apenas o deslocamento de outros pixels brancos.
A tonalidade dos pixels coloridos deve ser proporcional à sua distância de (x, y), para que o pixel em (x, y) tenha uma tonalidade de 0 ° (vermelho puro) e os pixels mais distantes de (x, y) terá um matiz de 360 ° (também vermelho), com os outros matizes se mesclando de maneira uniforme e linear no meio. A saturação e o valor devem ser 100%.
Se um pixel branco não estiver conectado a (x, y) por outros pixels brancos, ele deverá permanecer em branco.
Detalhes
- A entrada consistirá no nome do arquivo da imagem ou nos dados brutos da imagem, além dos números xey.
- A imagem de saída pode ser salva em um arquivo ou em bruto para stdout em qualquer formato de arquivo de imagem comum ou simplesmente exibida.
- O valor x é 0 nos pixels mais à esquerda e aumenta para a direita. O valor y é 0 nos pixels mais altos e aumenta a diminuir. (x, y) estará sempre nos limites da imagem.
- Programas e funções completos são permitidos.
O código mais curto em bytes vence.
Exemplos
Todas essas imagens foram reduzidas para economizar espaço. Clique neles para ver em tamanho real.
Imagem de entrada:
(x,y) = (165,155)
e (x,y) = (0,0)
Entrada de imagem e saída com (x,y) = (0,0)
:
Entrada de imagem e saída com (x,y) = (600,350)
:
Entrada de imagem e saída com (x,y) = (0,0)
:
Entrada de imagem e saída com (x,y) = (0,0)
:
Bônus opcional de -30%: use a distância euclidiana. Uma sugestão para o seu algoritmo é a seguinte (descrição geral):
- Tenha um pixel inicial.
- Preenchimento a partir desse pixel.
- Para cada pixel atingido no preenchimento de inundação,
- Mova do pixel inicial para o pixel em etapas de meia unidade, em uma linha reta.
- Em cada etapa, aplique
int()
às coordenadas x e y. Se o pixel nessas coordenadas for preto, pare. Caso contrário, continue. (Este é um método de linha de visão.) - Qualquer pixel atingido que contorne um pixel branco e / ou um pixel que foi rotulado anteriormente com uma distância significativamente maior (ou seja, +10) se torna um pixel inicial.
Em um sentido mais meta, esse algoritmo se espalha para todos os pixels acessíveis em uma linha reta a partir de pixels iniciais / já coloridos, e então "polegadas" em torno das bordas. O bit "distância significativamente maior" destina-se a acelerar o algoritmo. Honestamente, realmente não importa como você implementa a distância euclidiana, apenas tem que se parecer com isso.
É assim que o primeiro exemplo se parece com a distância euclidiana, usando o algoritmo acima:
Insira a imagem e (x,y) = (165,155)
Muito obrigado ao Calvin'sHobbies e ao trichoplax por ajudar a escrever esse desafio! Diverta-se!