Das Bild des Drachen


23

Ich sah ein cooles GIF der Zwillingsdrachenkurve aus einem Quadrat und fragte mich, was wohl passieren würde, wenn wir von einem anderen Basisbild ausgehen würden. Also habe ich ein Programm dafür geschrieben.

                                       

Es ist so cool, dass ich dachte, es würde Spaß machen, es als Herausforderung zu tun.

Aufgabe

Sie nehmen ein quadratisches Bild mit einer Kantenlänge auf, die eine Potenz von 2 (größer als 4) ist.

Um dieses Bild zu erstellen, sollten Sie zunächst Ihr Bild in 4 vertikale Bänder gleicher Größe unterteilen und benachbarte Bänder um ein Achtel der Bildgröße in entgegengesetzte Richtungen verschieben (verschobene Bänder sollten sich auf die andere Seite legen). Sie sollten diesen Vorgang dann jedes Mal wiederholen, wenn Sie das Bild in doppelt so viele Bereiche aufteilen und um die Hälfte gegenüber dem vorherigen Mal verschieben. Bei jeder Iteration sollten Sie zwischen vertikalen und horizontalen Verschiebungen wechseln. Sie sollten iterieren, bis Sie durch die Verschiebung um einen Bruchteil der Pixel verschoben werden müssen (dies ist immer 1/2), an welcher Stelle Sie fertig sind.

Beim Verschieben von vertikal ungeraden Bändern von links (mit Nullindex) sollte nach unten verschoben werden, während gerade nach oben verschoben werden. Beim horizontalen Verschieben sollten ungerade Bänder von oben nach links verschoben werden, während gerade Bänder nach rechts verschoben werden sollten.

Sie müssen nur das Endergebnis der Transformation ausgeben / anzeigen, nicht alle Zwischenschritte wie im GIF.

Dies ist daher besteht das Ziel darin, die Länge Ihres Quellcodes, gemessen in Bytes, zu minimieren.

Beispiel durchgearbeitet

Ich werde das Cat-GIF, das oben auf der Seite angezeigt wird, Frame für Frame durcharbeiten.

Hier ist das Startbild:

Dieses Bild ist 512 mal 512 Pixel groß. Wir werden es in 4 Bänder aufteilen, um jedes Band zu starten und um 1/8 der Bildgröße (64 Pixel) vertikal zu verschieben.

Wir teilen es jetzt in doppelt so viele Bänder (8 Bänder) und verschieben es halb so weit wie beim letzten Mal (32 Pixel). Dieses Mal verschieben wir uns horizontal.

Wir werden dieses Mal wieder vertikal verschieben, indem wir uns in 16 Bänder aufteilen und jedes Band um 16 Pixel verschieben.

32 Bänder, 8 Pixel, horizontale Verschiebung

64 Bänder, 4 Pixel, vertikale Verschiebung.

128 Bänder, 2 Pixel, horizontale Verschiebung.

256 Bänder, 1 Pixel, vertikale Verschiebung.

Da wir bei der nächsten Verschiebung jedes Band um ein halbes Pixel verschieben müssten, halten wir an dieser Stelle an und geben das Ergebnis aus.

Testfälle

Ich habe ein funktionierendes Skript, mit dem diese Bilder erstellt werden können, also dachte ich, ich würde euch die Bilder für die Testfälle auswählen lassen. Wenn Sie also ein quadratisches Bild mit einer Breite von 2 haben, möchten Sie sehen, dass es sich dragonisiert. Sie können es mir gerne zusenden und ich werde es zu einem Testfall machen.

Test 1 Out 1

Sie sollten auch ein einfaches weißes oder festes schwarzes Bild testen, um festzustellen, ob Pixel verschwinden oder nicht.



2
Bild des Drachen? ahem
Conor O'Brien

Ich denke, die Hauptsache, die dazu führt, dass dies geschlossen wird, ist, dass nicht klar ist, wie oft das Bild verschoben werden soll. Wenn Sie die Häufigkeit angeben, mit der die Verschiebung erfolgen soll, ist dies meiner Meinung nach in Ordnung. Sonst ist mir nichts unklar.
Genosse SparklePony

1
@LuisMendo wird **Start** by shifting one 8th of the size of the imagedann repeat ... each time splitting the image into twice as many divisions and shifting half as far as the previous timealso das erste mal 1/8, das zweite 1/16 sein. die dritte 1/32 bis die Anzahl der Pixel gebrochen ist. Ich verstehe nicht, was daran unklar ist.
Level River St

Cartmanager Da die Leute das nicht verstehen, denke ich, dass ein funktionierendes Beispiel, das die ersten statischen Frames des verknüpften Beispiels zeigt, das ein einfaches Quadrat zeigt, hilfreich und leichter zu verfolgen ist als eine Animation. (Belassen Sie die vorhandene Katzenanimation als cool, aber sie ist ziemlich beschäftigt, um das Konzept zu verstehen.)
Level River St

Antworten:


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

Ich habe ein bisschen geraten, da ich die Vorgehensweise aus den Spezifikationen nicht verstand, aber mit Hilfe des Bildes funktionierte es.


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
In Übereinstimmung mit unseren Site-Regeln können Sie davon ausgehen, input()dass es als Zeichenfolge übergeben wird, um Eingaben zu erhalten, anstatt raw_input().
Weizen-Assistent

2

Mathematica, 177 Bytes

Es ist langsam und nicht voll bespielt.

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

Das ist Lena:

Lena

Das ist Lena die Drache:

Bildbeschreibung hier eingeben

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.