Obraz smoka

23

Widziałem fajny gif bliźniaczej smoczej krzywej wykonanej z kwadratu i zastanawiałem się, co by się stało, gdybyśmy zaczęli od innego podstawowego obrazu. Więc napisałem program, aby to zrobić.

                                       

To tak fajne, że pomyślałem, że fajnie byłoby to zrobić jako wyzwanie.

Zadanie

Zrobisz kwadratowy obraz o długości krawędzi wynoszącej 2 (więcej niż 4).

Aby zrobić ten obraz, należy zacząć od podzielenia obrazu na 4 pionowe pasy o równej wielkości i przesunięcia sąsiednich pasów o jedną ósmą rozmiaru obrazu w przeciwnych kierunkach (przesunięte pasma powinny owinąć się na drugą stronę). Powinieneś następnie powtórzyć ten proces za każdym razem, dzieląc obraz na dwa razy więcej podziałów i przesuwając o połowę w stosunku do poprzedniego czasu. Każdą iterację należy przełączać między przesunięciami pionowymi i poziomymi. Powtarzaj, dopóki przesunięcie nie będzie wymagało przesunięcia o ułamkową liczbę pikseli (zawsze będzie to 1/2).

Podczas przesuwania pionowych pasm o nieparzystych numerach z lewej strony (indeksowane od zera) należy przesunąć w dół, a nawet przesunąć w górę. Podczas przesuwania poziomo nieparzystych pasm z góry należy przesunąć w lewo, podczas gdy parzyste pasma powinny przesunąć się w prawo.

Potrzebujesz tylko wyjścia / wyświetlenia końcowego wyniku transformacji, a nie wszystkich pośrednich kroków jak w gif.

To jest więc celem jest zminimalizowanie długości kodu źródłowego mierzonego w bajtach.

Przepracowany przykład

Będę pracował nad kotem gif pokazanym na górze strony klatka po klatce.

Oto obraz początkowy:

Ten obraz ma rozmiar 512 na 512 pikseli. Podzielimy go na 4 pasma, aby rozpocząć i przesunąć każde pasmo o 1/8 rozmiaru obrazu (64 piksele) w pionie.

Teraz podzielimy go na dwa razy więcej pasm (8 pasm) i przesuniemy go o połowę do ostatniego razu (32 piksele). Tym razem przesuniemy się w poziomie.

Teraz ponownie przesuniemy w pionie, tym razem dzieląc na 16 pasm i przesuwając każde pasmo o 16 pikseli.

32 pasma, 8 pikseli, przesunięcie w poziomie

64 pasma, 4 piksele, przesunięcie pionowe.

128 pasm, 2 piksele, przesunięcie w poziomie.

256 pasm, 1 piksel, przesunięcie pionowe.

Ponieważ następne przesunięcie wymagałoby przesunięcia każdego pasma o pół piksela, zatrzymamy się w tym momencie i wyprowadzimy wynik.

Przypadki testowe

Mam działający skrypt, który może tworzyć te obrazy, więc pomyślałem, że pozwolę wam wybrać obrazy dla przypadków testowych. Więc jeśli masz kwadratowy obraz o sile 2 szerokości, który chciałbyś, aby stał się smoczony. Wyślij do mnie, a zrobię z niego przypadek testowy.

Test 1 Out 1

Powinieneś również przetestować na zwykłym białym lub jednolitym czarnym obrazie, abyś mógł określić, czy piksele znikają, czy nie.

Kreator pszenicy
źródło
powiązane , powiązane .
Jonathan Allan
2
Obraz smoka? ahem
Conor O'Brien
Myślę, że główną przyczyną tego zamknięcia jest to, że nie jest jasne, ile razy obraz powinien zostać przesunięty. Jeśli określisz, ile razy powinna nastąpić zmiana, myślę, że będzie dobrze. Nic innego nie jest dla mnie niejasne.
Towarzysz SparklePony,
1
@LuisMendo **Start** by shifting one 8th of the size of the imagepotem repeat ... each time splitting the image into twice as many divisions and shifting half as far as the previous timetak po raz pierwszy będzie 1/8, drugi 1/16. trzecia 1/32, aż liczba pikseli będzie ułamkowa. Nie rozumiem, co jest w tym niejasne.
Level River St
Cartmanager Ponieważ ludzie tego nie rozumieją, myślę, że działający przykład pokazujący kilka pierwszych statycznych ramek połączonego przykładu przedstawiającego prosty kwadrat może pomóc i być łatwiejszy do naśladowania niż animacja. (Pozostaw istniejącą animację kota, ponieważ jest fajna, ale raczej zajęta jest uchwycenie tej koncepcji.)
Level River St

Odpowiedzi:

11

MATLAB, 237 bajtów

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

Zajęło mi to trochę zgadywania, ponieważ nie zrozumiałem procedury ze specyfikacji, ale przy pomocy obrazu zadziałało.

wada
źródło
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()
dieter
źródło
1
Zgodnie z naszymi zasadami witryny możesz używać input()i oczekiwać, że zostanie przekazany jako ciąg, aby uzyskać dane wejściowe zamiast raw_input().
Kreator pszenicy
2

Mathematica, 177 bajtów

Jest wolny i nie w pełni golfowy.

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

To jest Lena:

Lena

Oto Lena the Dragon:

wprowadź opis zdjęcia tutaj

alephalpha
źródło