L'image du dragon

23

J'ai vu un gif cool de la courbe du dragon jumeau fabriqué à partir d'un carré, et je me suis demandé ce qui se passerait si nous partions d'une autre image de base. J'ai donc écrit un programme pour ce faire.

                                       

C'est tellement cool que j'ai pensé que ce serait amusant de le faire comme un défi.

Tâche

Vous prendrez une image carrée avec une longueur de bord qui est une puissance de 2 (supérieure à 4).

Pour créer cette image, vous devez commencer par diviser votre image en 4 bandes verticales de taille égale et en décalant les bandes adjacentes d'un huitième de la taille de l'image dans des directions opposées (les bandes décalées doivent s'enrouler de l'autre côté). Vous devez ensuite répéter ce processus à chaque fois en divisant l'image en deux fois plus de divisions et en la déplaçant de moitié autant que la fois précédente. À chaque itération, vous devez alterner entre les décalages verticaux et horizontaux. Vous devez répéter jusqu'à ce que le décalage vous oblige à décaler d'un nombre fractionnaire de pixels (ce sera toujours 1/2) à quel point vous avez terminé.

Lorsque vous déplacez verticalement des bandes numérotées impaires vers la gauche (indexées sur zéro), vous devez déplacer vers le bas tout en augmentant même vers le haut. Lors du décalage horizontal, les bandes numérotées impaires à partir du haut doivent se déplacer vers la gauche tandis que les bandes paires doivent se déplacer vers la droite.

Vous devez seulement afficher / afficher le résultat final de la transformation, pas toutes les étapes intermédiaires comme dans le gif.

Il s'agit de , l'objectif est donc de minimiser la longueur de votre code source, mesurée en octets.

A travaillé par l'exemple

Je vais travailler à travers le gif de chat affiché en haut de la page, cadre par cadre.

Voici l'image de départ:

Cette image mesure 512 x 512 pixels. Nous allons le diviser en 4 bandes pour démarrer et décaler chaque bande de 1/8 de la taille de l'image (64 pixels) verticalement.

Nous allons maintenant le diviser en deux fois plus de bandes (8 bandes) et le déplacer de moitié jusqu'à la dernière fois (32 pixels). Cette fois, nous allons décaler horizontalement.

Nous allons maintenant déplacer à nouveau verticalement cette fois en se divisant en 16 bandes et en décalant chaque bande de 16 pixels.

32 bandes, 8 pixels, décalage horizontal

64 bandes, 4 pixels, décalage vertical.

128 bandes, 2 pixels, décalage horizontal.

256 bandes, 1 pixel, décalage vertical.

Puisque le prochain changement nous obligerait à déplacer chaque bande d'un demi-pixel, nous nous arrêterons à ce point et produirons le résultat.

Cas de test

J'ai un script qui peut faire ces images, donc j'ai pensé que je vous laisserais choisir les images pour les cas de test. Donc, si vous avez une image carrée d'une puissance de 2 de large que vous aimeriez voir devenir dragonifiée. N'hésitez pas à me l'envoyer et j'en ferai un cas de test.

Test 1 Sortie 1

Vous devez également tester sur une image blanche ou noire unie afin de pouvoir déterminer si les pixels disparaissent ou non.

Assistant de blé
la source
liés , liés .
Jonathan Allan
2
Image du dragon? ahem
Conor O'Brien
Je pense que la principale cause de la fermeture de cette situation est qu'il n'est pas clair combien de fois l'image doit être décalée. Si vous spécifiez le nombre de fois que le changement doit se produire, je pense que ce sera bien. Rien d'autre n'est clair pour moi.
Camarade SparklePony
1
@LuisMendo **Start** by shifting one 8th of the size of the imagealors repeat ... each time splitting the image into twice as many divisions and shifting half as far as the previous timela première fois sera 1/8, la seconde 1/16. le troisième 1/32 jusqu'à ce que le nombre de pixels soit fractionnaire. Je ne vois pas ce qui n'est pas clair à ce sujet.
Level River St
Cartmanager Comme les gens ne comprennent pas cela, je pense qu'un exemple fonctionnel montrant les premières images statiques de l'exemple lié montrant un simple carré pourrait aider et être plus facile à suivre qu'une animation. (Laissez l'animation de chat existante car c'est cool, mais c'est plutôt occupé à saisir le concept avec.)
Level River St

Réponses:

11

MATLAB, 237 octets

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

A pris un peu de devinettes car je ne comprenais pas la procédure des spécifications, mais avec l'aide de l'image, cela a fonctionné.

flawr
la source
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()
diète
la source
1
Conformément aux règles de notre site, vous pouvez utiliser input()et vous attendre à ce qu'il soit transmis sous forme de chaîne pour obtenir une entrée au lieu de raw_input().
Wheat Wizard
2

Mathematica, 177 octets

Il est lent et pas entièrement golfé.

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]&

Voici Lena:

Lena

Voici Lena le Dragon:

entrez la description de l'image ici

alephalpha
la source