Hình ảnh của rồng


23

Tôi nhìn thấy một gif tuyệt vời của đường cong rồng đôi được làm từ một hình vuông, và tự hỏi điều gì sẽ xảy ra nếu chúng ta bắt đầu từ một hình ảnh cơ sở khác. Vì vậy, tôi đã viết một chương trình để làm điều này.

                                       

Thật tuyệt vời đến nỗi tôi nghĩ sẽ rất vui nếu làm điều đó như một thử thách.

Bài tập

Bạn sẽ chụp ảnh vuông có độ dài cạnh bằng 2 (lớn hơn 4).

Để tạo hình ảnh này, bạn nên bắt đầu bằng cách chia hình ảnh của bạn thành 4 dải dọc có kích thước bằng nhau và dịch chuyển các dải liền kề một phần 8 kích thước của hình ảnh theo hướng ngược lại (các dải dịch chuyển phải quấn quanh phía bên kia). Sau đó, bạn nên lặp lại quá trình này mỗi lần chia hình ảnh thành gấp đôi số lần phân chia và thay đổi một nửa so với lần trước. Mỗi lần lặp bạn nên xen kẽ giữa các ca dọc và ngang. Bạn nên lặp đi lặp lại cho đến khi sự thay đổi yêu cầu bạn thay đổi một số lượng pixel (phần này sẽ luôn là 1/2) tại thời điểm bạn hoàn thành.

Khi dịch chuyển các dải số lẻ theo chiều dọc từ bên trái (không có chỉ số) nên dịch chuyển xuống trong khi thậm chí dịch chuyển lên. Khi dịch chuyển các dải số lẻ theo chiều ngang từ trên xuống nên dịch chuyển sang trái trong khi các dải được đánh số chẵn sẽ dịch chuyển sang phải.

Bạn chỉ cần xuất / hiển thị kết quả cuối cùng của phép chuyển đổi, không phải tất cả các bước trung gian như trong gif.

Đây là vì vậy mục tiêu là giảm thiểu độ dài của mã nguồn của bạn như được đo bằng byte.

Làm việc qua ví dụ

Tôi sẽ làm việc thông qua gif mèo được hiển thị ở đầu khung trang theo khung.

Đây là hình ảnh bắt đầu:

Hình ảnh này là 512 x 512 pixel. Chúng tôi sẽ chia nó thành 4 dải để bắt đầu và dịch chuyển từng dải bằng 1/8 kích thước hình ảnh (64 pixel) theo chiều dọc.

Bây giờ chúng tôi sẽ chia nó thành gấp đôi số băng tần (8 băng tần) và dịch chuyển nó một nửa so với lần trước (32 pixel). Lần này chúng ta sẽ thay đổi theo chiều ngang.

Bây giờ chúng ta sẽ dịch chuyển theo chiều dọc một lần nữa, lần này chia thành 16 dải và dịch chuyển mỗi dải bằng 16 pixel.

32 băng tần, 8 pixel, dịch chuyển ngang

64 dải, 4 pixel, dịch chuyển dọc.

128 băng tần, 2 pixel, dịch chuyển ngang.

256 dải, 1 pixel, dịch chuyển dọc.

Vì sự thay đổi tiếp theo sẽ yêu cầu chúng tôi di chuyển mỗi băng tần bằng một nửa pixel, chúng tôi sẽ dừng lại tại thời điểm này và đưa ra kết quả.

Các trường hợp thử nghiệm

Tôi có một kịch bản làm việc có thể tạo ra những hình ảnh này vì vậy tôi nghĩ tôi sẽ cho phép các bạn chọn hình ảnh cho các trường hợp thử nghiệm. Vì vậy, nếu bạn có một hình ảnh vuông có sức mạnh 2 chiều rộng mà bạn muốn thấy trở thành rồng hóa. Vui lòng gửi nó cho tôi và tôi sẽ biến nó thành một trường hợp thử nghiệm.

Kiểm tra 1 Ra 1

Bạn cũng nên kiểm tra trên một hình ảnh trắng hoặc đen đơn giản để bạn có thể xác định xem các pixel có biến mất hay không.



2
Hình ảnh con rồng? ahem
Conor O'Brien

Điều chính khiến điều này bị đóng cửa, tôi nghĩ, là không rõ hình ảnh nên được dịch chuyển bao nhiêu lần. Nếu bạn chỉ định số lần thay đổi sẽ xảy ra, thì tôi nghĩ nó sẽ ổn. Không có gì khác là không rõ ràng với tôi.
Đồng chí SparklePony

1
@LuisMendo **Start** by shifting one 8th of the size of the imagethì repeat ... each time splitting the image into twice as many divisions and shifting half as far as the previous timelần đầu tiên sẽ là 1/8, lần thứ hai 1/16. 1/32 thứ ba cho đến khi số pixel là phân số. Tôi không thấy những gì không rõ ràng về điều này.
Cấp sông St

Cartmanager Khi mọi người không hiểu điều này, tôi nghĩ rằng một ví dụ hoạt động hiển thị một vài khung hình tĩnh đầu tiên của ví dụ được liên kết hiển thị hình vuông đơn giản có thể giúp ích và dễ theo dõi hơn hoạt hình. (Để lại hoạt hình con mèo hiện tại là tuyệt, nhưng nó khá bận để nắm bắt khái niệm này.)
Level River St

Câu trả lời:


11

MATLAB, 237 byte

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

Mất một chút công việc đoán vì tôi không hiểu quy trình từ thông số kỹ thuật, nhưng với sự trợ giúp của hình ảnh nó đã hoạt động.


7

Con tră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
Theo quy tắc trang web của chúng tôi, bạn có thể sử dụng input()và hy vọng nó sẽ được thông qua dưới dạng chuỗi để nhận đầu vào thay vì raw_input().
Thuật sĩ lúa mì

2

Toán học, 177 byte

Đó là chậm và không đầy đủ 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]&

Đây là Lena:

Lena

Đây là Lena the Dragon:

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.