A imagem do dragão


23

Eu vi um gif legal da curva de dragão gêmeo feita de um quadrado e me perguntei o que aconteceria se começássemos de outra imagem de base. Então, eu escrevi um programa para fazer isso.

                                       

É tão legal que achei que seria divertido fazer isso como um desafio.

Tarefa

Você obterá uma imagem quadrada com um comprimento de borda que é uma potência de 2 (maior que 4).

Para criar essa imagem, comece dividindo a imagem em 4 bandas verticais de tamanho igual e deslocando as bandas adjacentes em um oitavo do tamanho da imagem em direções opostas (as bandas deslocadas devem envolver o outro lado). Você deve repetir esse processo sempre que dividir a imagem em duas vezes mais divisões e mudar pela metade até a hora anterior. Cada iteração você deve alternar entre os turnos vertical e horizontal. Você deve iterar até que a mudança exija um número fracionário de pixels (isso sempre será 1/2) no ponto em que você terminou.

Ao deslocar as bandas numeradas verticalmente ímpares da esquerda (indexado a zero), deve deslocar para baixo enquanto até deslocar para cima. Ao mudar horizontalmente, as bandas numeradas ímpares do topo devem mudar para a esquerda, enquanto as bandas numeradas pares devem mudar para a direita.

Você só precisa exibir / exibir o resultado final da transformação, nem todas as etapas intermediárias, como no gif.

Isso é portanto, o objetivo é minimizar o tamanho do seu código-fonte, medido em bytes.

Trabalhou através do exemplo

Vou trabalhar no gif de gato mostrado na parte superior da página, quadro a quadro.

Aqui está a imagem inicial:

Esta imagem é 512 por 512 pixels. Vamos dividi-lo em 4 bandas para iniciar e mudar cada banda em 1/8 do tamanho da imagem (64 pixels) verticalmente.

Agora vamos dividi-lo em duas vezes mais bandas (8 bandas) e deslocá-lo até a metade da última vez (32 pixels). Desta vez, mudaremos horizontalmente.

Agora, mudaremos verticalmente novamente, desta vez dividindo em 16 bandas e deslocando cada banda em 16 pixels.

32 bandas, 8 pixels, deslocamento horizontal

64 bandas, 4 pixels, deslocamento vertical.

128 bandas, 2 pixels, deslocamento horizontal.

256 bandas, 1 pixel, deslocamento vertical.

Como o próximo turno exigiria que movêssemos cada banda em meio pixel, paramos nesse ponto e produzimos o resultado.

Casos de teste

Eu tenho um script de trabalho que pode criar essas imagens, então pensei em deixar vocês escolherem as imagens para os casos de teste. Então, se você tem uma imagem quadrada com uma potência de 2 de largura que você gostaria de ver se transforma em dragão. Sinta-se à vontade para enviá-lo para mim e eu o tornarei um caso de teste.

Teste 1 Fora 1

Você também deve testar uma imagem em branco ou preto sólido, para poder determinar se os pixels estão desaparecendo ou não.



2
Imagem do dragão? ahem
Conor O'Brien

A principal coisa que faz com que isso seja fechado, acho, é que não está claro quantas vezes a imagem deve ser alterada. Se você especificar o número de vezes que o turno deve ocorrer, acho que tudo ficará bem. Nada mais está claro para mim.
precisa saber é o seguinte

1
@LuisMendo **Start** by shifting one 8th of the size of the imageentão repeat ... each time splitting the image into twice as many divisions and shifting half as far as the previous timea primeira vez será 1/8, a segunda 1/16. o terceiro 1/32 até o número de pixels ser fracionário. Não vejo o que não está claro sobre isso.
Level River St

Cartmanager Como as pessoas não estão entendendo isso, acho que um exemplo trabalhado mostrando os primeiros quadros estáticos do exemplo vinculado mostrando um quadrado simples pode ajudar e ser mais fácil de seguir do que uma animação. (Deixe a animação gato existente, uma vez que é legal, mas é bastante ocupado para entender o conceito com.)
Nível River St

Respostas:


11

MATLAB, 237 bytes

function A=r(A);n=size(A,1);p=@(a,v)permute(a,[v,3]);k=n/8;v=1:2;while k>=1;b=mod(0:n-1,4*k)<2*k;x=find(b);y=find(~b);c=[k+1:n,1:k;n-k+1:n,1:n-k];A=p(A,v);c=c(3-v,:);A(x,:,:)=A(x,c(1,:),:);A(y,:,:)=A(y,c(2,:),:);A=p(A,v);k=k/2;v=3-v;end

Demorou um pouco de palpite, pois eu não entendi o procedimento das especificações, mas com a ajuda da imagem funcionou.


7

Python 2, 317 313 304 298

from PIL import Image
I=Image.open(input())
w,h=I.size
b,p,q,s=4,w/8,1,1
while p>1:o=I.copy();o.paste(I,[(w-p,0),(0,w-p)][q==1]);o.paste(I,[(p-w,0),(0,p-w)][q==1]);q*=-1;x=0;exec'o.paste(I.crop([(0,x,w,x+p*2),(x,0,x+p*2,w)][s%2]),[(q*p,x),(x,q*p)][s%2]);q*=-1;x+=p*2;'*b;p/=2;I=o;s+=1;b*=2
o.show()

1
De acordo com as regras do site, você pode usar input()e esperar que seja passado como uma string para obter entrada em vez de raw_input().
Assistente de trigo

2

Mathematica, 177 bytes

É lento e não totalmente jogado.

r=ImageRotate;r[#2,Pi/2(3-#)]&@@Nest[{#+1,ImageAssemble@MapIndexed[RotateLeft[#,(-1)^#2]&]@ImagePartition[r@#2,Reverse@d/2^{#,#-1}]}&@@#&,{3,#},Log2@Min[d=ImageDimensions@#]-2]&

Esta é Lena:

Lena

Esta é Lena, a Dragão:

insira a descrição da imagem aqui

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.