Gambar Naga


23

Saya melihat gif keren dari kurva naga kembar yang terbuat dari kotak, dan bertanya-tanya apa yang akan terjadi jika kita mulai dari gambar dasar lain. Jadi saya menulis sebuah program untuk melakukan ini.

                                       

Sangat keren sehingga saya pikir akan menyenangkan untuk melakukannya sebagai tantangan.

Tugas

Anda akan mengambil gambar persegi dengan panjang tepi yang memiliki kekuatan 2 (lebih besar dari 4).

Untuk membuat gambar ini, Anda harus mulai dengan membagi gambar Anda menjadi 4 pita vertikal dengan ukuran yang sama dan menggeser pita yang berdekatan satu per delapan dari ukuran gambar dalam arah yang berlawanan (pita bergeser harus membungkus ke sisi lain). Anda kemudian harus mengulangi proses ini setiap kali membagi gambar menjadi dua kali lebih banyak divisi dan menggeser setengah sejauh waktu sebelumnya. Setiap iterasi Anda harus bergantian antara pergeseran vertikal dan horizontal. Anda harus mengulangi sampai pergeseran mengharuskan Anda untuk menggeser dengan jumlah piksel fraksional (ini akan selalu 1/2) di titik mana Anda selesai.

Ketika menggeser band bernomor ganjil secara vertikal dari kiri (diindeks nol) harus bergeser ke bawah bahkan saat menggeser ke atas. Ketika menggeser band bernomor ganjil secara horizontal dari atas harus bergeser ke kiri sementara band bernomor genap harus bergeser ke kanan.

Anda hanya perlu menampilkan / menampilkan hasil akhir dari transformasi, tidak semua langkah menengah seperti di gif.

Ini adalah sehingga tujuannya adalah untuk meminimalkan panjang kode sumber Anda yang diukur dalam byte.

Bekerja melalui contoh

Saya akan bekerja melalui gif kucing yang ditunjukkan di bagian atas bingkai halaman demi bingkai.

Ini gambar awalnya:

Gambar ini berukuran 512 x 512 piksel. Kami akan memecahnya dalam 4 band untuk memulai dan menggeser masing-masing band dengan 1/8 ukuran gambar (64 piksel) secara vertikal.

Kami sekarang akan membaginya menjadi dua kali lebih banyak band (8 band) dan menggesernya setengah sejauh terakhir kali (32 piksel). Kali ini kami akan bergeser secara horizontal.

Kami sekarang akan bergeser secara vertikal lagi kali ini membelah menjadi 16 band dan menggeser masing-masing band dengan 16 piksel.

32 band, 8 piksel, pergeseran horizontal

64 band, 4 piksel, pergeseran vertikal.

128 band, 2 piksel, pergeseran horizontal.

256 band, 1 piksel, pergeseran vertikal.

Karena perubahan berikutnya akan mengharuskan kita untuk memindahkan setiap band dengan setengah piksel, kita akan berhenti pada titik ini dan mengeluarkan hasilnya.

Uji kasus

Saya memiliki skrip yang berfungsi yang dapat membuat gambar-gambar ini jadi saya pikir saya akan membiarkan kalian memilih gambar untuk kasus uji. Jadi, jika Anda memiliki gambar persegi yang memiliki kekuatan 2 lebar yang ingin Anda lihat menjadi naga. Jangan ragu untuk mengirimkannya kepada saya dan saya akan membuatnya menjadi test case

Tes 1 Keluar 1

Anda juga harus menguji pada gambar hitam putih polos atau padat sehingga Anda dapat menentukan apakah pikselnya hilang atau tidak.



2
Gambar naga? ahem
Conor O'Brien

Hal utama yang menyebabkan ini menjadi tertutup, saya pikir, adalah tidak jelas berapa kali gambar harus digeser. Jika Anda menentukan berapa kali pergeseran harus terjadi, maka saya pikir itu akan baik-baik saja. Tidak ada hal lain yang tidak jelas bagi saya.
Kamerad SparklePony

1
@LuisMendo **Start** by shifting one 8th of the size of the imagemaka repeat ... each time splitting the image into twice as many divisions and shifting half as far as the previous timepertama kali akan 1/8, 1/16 kedua. 1/32 ketiga hingga jumlah piksel fraksional. Saya tidak melihat apa yang tidak jelas tentang ini.
Level River St

Cartmanager Karena orang tidak mendapatkan ini, saya pikir contoh yang berfungsi menunjukkan beberapa frame statis pertama dari contoh terkait yang menunjukkan kotak sederhana mungkin membantu dan lebih mudah diikuti daripada animasi. (Biarkan animasi kucing yang ada tetap asik, tapi agak sibuk untuk memahami konsepnya.)
Level River St

Jawaban:


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

Butuh sedikit tebakan karena saya tidak mengerti prosedur dari spesifikasi, tetapi dengan bantuan gambar itu berhasil.


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
Sesuai dengan aturan situs kami, Anda dapat menggunakan input()dan mengharapkannya diteruskan sebagai string untuk mendapatkan input, bukan raw_input().
Wheat Wizard

2

Mathematica, 177 byte

Ini lambat dan tidak sepenuhnya 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]&

Ini Lena:

Lena

Ini adalah Lena sang Naga:

masukkan deskripsi gambar di sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.