용의 이미지


23

사각형으로 만든 트윈 드래곤 커브 의 멋진 GIF 를 보았고 다른 기본 이미지에서 시작하면 어떻게 될지 궁금했습니다. 그래서 이것을하기위한 프로그램을 작성했습니다.

                                       

너무 시원해서 도전으로하는 것이 재미있을 것이라고 생각했습니다.

태스크

모서리 길이가 2 (4보다 큰) 인 정사각형 이미지를 촬영합니다.

이 이미지를 만들려면 먼저 이미지를 동일한 크기의 4 개의 수직 밴드로 나누고 인접한 밴드를 이미지 크기의 8 분의 1의 반대 방향으로 반대 방향으로 이동해야합니다 (이동 된 밴드는 다른쪽으로 감싸 야합니다). 그런 다음 이미지를 두 배의 분할로 나누고 이전 시간의 절반만큼 이동할 때마다이 프로세스를 반복해야합니다. 각 반복마다 수직 및 수평 시프트를 번갈아 가며 사용해야합니다. 시프트가 완료되는 시점에서 소수 픽셀 수만큼 이동해야 할 때까지 반복해야합니다 (이는 항상 1/2 임).

수직으로 홀수 번호의 밴드를 왼쪽에서 이동할 때 (0 인덱스) 위로 이동하는 동안 아래로 이동해야합니다. 수평 홀수 번호의 밴드를 이동할 때 상단부터 왼쪽으로 이동해야하며 짝수의 밴드는 오른쪽으로 이동해야합니다.

gif와 같은 모든 중간 단계가 아니라 변환의 최종 결과 만 출력 / 표시하면됩니다.

이것은 이므로 목표는 바이트 단위로 측정 한 소스 코드의 길이를 최소화하는 것입니다.

예제를 통해 작업

페이지 상단에 표시된 cat gif를 프레임 단위로 살펴 보겠습니다.

시작 이미지는 다음과 같습니다.

이 이미지는 512 x 512 픽셀입니다. 4 밴드로 나누고 각 밴드를 수직으로 이미지 크기 (64 픽셀)의 1/8만큼 시작하고 이동시킵니다.

이제 두 배의 밴드 (8 밴드)로 나누고 마지막 시간 (32 픽셀)까지 절반으로 이동합니다. 이번에는 수평으로 이동합니다.

이번에는 16 개 대역으로 분할하고 각 대역을 16 픽셀 씩 이동시켜 이번에는 수직으로 다시 이동합니다.

32 밴드, 8 픽셀, 수평 이동

64 밴드, 4 픽셀, 수직 이동.

128 밴드, 2 픽셀, 수평 이동.

256 밴드, 1 픽셀, 수직 이동.

다음 번 시프트에서는 각 밴드를 반 픽셀 씩 움직여야하므로이 시점에서 멈추고 결과를 출력합니다.

테스트 사례

이 이미지를 만들 수있는 작업 스크립트가 있으므로 테스트 사례에 대한 이미지를 선택할 수 있다고 생각했습니다. 따라서 2 너비의 제곱 인 정사각형 이미지가 있으면 용감하게됩니다. 저에게 보내 주시면 테스트 사례로 작성하겠습니다.

시험 1 아웃 1

픽셀이 사라지는 지 여부를 확인할 수 있도록 일반 흰색 또는 검은 색 이미지를 테스트해야합니다.



2
용의 이미지? ahem
코너 오브라이언

이것이 닫히는 주요 원인은 이미지를 몇 번이나 옮겨야하는지 불분명하다는 것입니다. 교대 발생 횟수를 지정하면 문제가 없을 것입니다. 나에게 분명하지 않은 것은 없습니다.
동지 SparklePony

1
@LuisMendo **Start** by shifting one 8th of the size of the image다음 repeat ... each time splitting the image into twice as many divisions and shifting half as far as the previous time첫 번째 시간은 1/8, 두 번째 1/16입니다. 픽셀 수가 소수가 될 때까지 세 번째 1/32 나는 이것에 대해 분명하지 않은 것을 보지 못한다.
Level River St

Cartmanager 사람들이 이것을 얻지 못함에 따라 간단한 사각형을 보여주는 링크 된 예제의 처음 몇 정적 프레임을 보여주는 실제 예제가 애니메이션보다 도움이되고 따르기가 더 쉽다고 생각합니다. (기존의 고양이 애니메이션은 멋지지만 개념을 파악하기에는 바쁘다.)
Level River St

답변:


11

MATLAB, 237 바이트

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

사양의 절차를 이해하지 못했지만 이미지의 도움으로 효과가 있었기 때문에 약간의 추측 작업을 수행했습니다.


7

파이썬 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
사이트 규칙 input()에 따라을 (를) 대신 입력하기 위해 문자열로 전달하고 사용할 수 있습니다 raw_input().
위트 마법사

2

Mathematica, 177 바이트

속도가 느리고 완전히 골프되지 않습니다.

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

레나입니다.

레나

레나 드래곤입니다.

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.