La imagen del dragón


23

Vi un gif genial de la curva del dragón gemelo hecha de un cuadrado, y me pregunté qué pasaría si comenzáramos desde otra imagen base. Entonces escribí un programa para hacer esto.

                                       

Es tan genial que pensé que sería divertido hacerlo como un desafío.

Tarea

Tomarás una imagen cuadrada con una longitud de borde que es una potencia de 2 (mayor que 4).

Para hacer esta imagen, debe comenzar dividiendo su imagen en 4 bandas verticales de igual tamaño y desplazando las bandas adyacentes una octava parte del tamaño de la imagen en direcciones opuestas (las bandas desplazadas deben envolverse hacia el otro lado). Luego debe repetir este proceso cada vez dividiendo la imagen en el doble de divisiones y desplazándola a la mitad hasta el momento anterior. Cada iteración debe alternar entre cambios verticales y horizontales. Debe iterar hasta que el cambio requiera que cambie por un número fraccionario de píxeles (esto siempre será 1/2) en el momento en que haya terminado.

Al cambiar verticalmente, las bandas numeradas impares desde la izquierda (indexado a cero) deben desplazarse hacia abajo mientras que incluso hacia arriba. Al cambiar horizontalmente, las bandas numeradas impares desde la parte superior deben desplazarse hacia la izquierda, mientras que las bandas numeradas pares deben desplazarse hacia la derecha.

Solo necesita generar / mostrar el resultado final de la transformación, no todos los pasos intermedios como en el gif.

Este es el por lo que el objetivo es minimizar la longitud de su código fuente medido en bytes.

Trabajado a través del ejemplo

Trabajaré en el gif de gato que se muestra en la parte superior de la página cuadro por cuadro.

Aquí está la imagen de inicio:

Esta imagen es de 512 por 512 píxeles. Lo dividiremos en 4 bandas para comenzar y desplazar cada banda en 1/8 del tamaño de la imagen (64 píxeles) verticalmente.

Ahora lo dividiremos en el doble de bandas (8 bandas) y lo desplazaremos la mitad hasta la última vez (32 píxeles). Esta vez cambiaremos horizontalmente.

Ahora volveremos a cambiar verticalmente esta vez dividiéndonos en 16 bandas y cambiando cada banda por 16 píxeles.

32 bandas, 8 píxeles, desplazamiento horizontal

64 bandas, 4 píxeles, desplazamiento vertical.

128 bandas, 2 píxeles, desplazamiento horizontal.

256 bandas, 1 píxel, desplazamiento vertical.

Dado que el próximo cambio requeriría que moviéramos cada banda medio píxel, nos detendremos en este punto y mostraremos el resultado.

Casos de prueba

Tengo un script de trabajo que puede hacer estas imágenes, así que pensé que les permitiría elegir las imágenes para los casos de prueba. Entonces, si tiene una imagen cuadrada que tiene una potencia de 2 de ancho que le gustaría ver convertirse en dragonificada. No dudes en enviármelo y lo convertiré en un caso de prueba.

Prueba 1 Fuera 1

También debe probar en una imagen en blanco o negro sólido para poder determinar si los píxeles están desapareciendo o no.



2
Imagen del dragón? ejem
Conor O'Brien

Creo que lo principal que hace que esto se cierre es que no está claro cuántas veces se debe cambiar la imagen. Si especifica la cantidad de veces que debe ocurrir el cambio, entonces creo que estará bien. Nada más me queda claro.
Camarada SparklePony

1
@LuisMendo **Start** by shifting one 8th of the size of the imageentonces repeat ... each time splitting the image into twice as many divisions and shifting half as far as the previous timela primera vez será 1/8, la segunda 1/16. el tercero 1/32 hasta que el número de píxeles sea fraccionario. No veo lo que no está claro sobre esto.
Level River St el

Cartmanager Como la gente no entiende esto, creo que un ejemplo trabajado que muestra los primeros fotogramas estáticos del ejemplo vinculado que muestra un cuadrado simple podría ayudar y ser más fácil de seguir que una animación. (Deje la animación de gatos existente ya que es genial, pero está bastante ocupado para comprender el concepto).
Level River St

Respuestas:


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

Tuve que adivinar un poco, ya que no entendía el procedimiento de las especificaciones, pero con la ayuda de la imagen funcionó.


7

Pitón 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 acuerdo con las reglas de nuestro sitio, puede usar input()y esperar que se pase como una cadena para obtener información en lugar de raw_input().
Wheat Wizard

2

Mathematica, 177 bytes

Es lento y no está totalmente golfizado.

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 es Lena:

Lena

Esta es Lena el Dragón:

ingrese la descripción de la imagen aquí

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.