Ejderin Görüntüsü


23

Bir kare yapılmış ikiz ejderha eğrisi serin bir gif gördüm ve başka bir temel görüntüden başlarsak ne olacağını merak ettim. Bu yüzden bunu yapmak için bir program yazdım.

                                       

O kadar havalı ki, bunu bir meydan okuma olarak yapmanın eğlenceli olacağını düşündüm.

Görev

Kenar gücü 2 olan (4'ten büyük) kare görüntü alacaksınız.

Bu görüntüyü yapmak için, görüntünüzü eşit boyutta 4 dikey şeride bölerek ve bitişik şeritleri görüntünün boyutunun 8'inin zıt yönlere kaydırmasıyla başlamalısınız (değişen bantlar diğer tarafa sarılmalıdır). Daha sonra görüntüyü iki katına böldüğünüzde her seferinde bu işlemi tekrarlamanız ve önceki zamana göre yarıya kaydırmanız gerekir. Her yineleme dikey ve yatay vardiya arasında geçiş yapmalısınız. Kaydırma, yaptığınız noktada kesirli sayıda piksel (bu daima 1/2 olacaktır) ile kaydırmanızı gerektirinceye kadar yinelemelisiniz.

Dikey olarak kaydırıldığında, tek sayılı bantlar sola (sıfır indeksli) yukarı kaydırılırken aşağı kaydırılmalıdır. Yatay olarak tek sıralı bantlar üstten kaydırılırken, numaralandırılmış bantlar bile sağa kaydırılmalıdır.

Dönüştürme işleminin sonucunu çıktı / görüntülemeye ihtiyacınız var, gif'deki tüm ara adımlar değil.

Bu olduğundan amaç, kaynak kodunuzun uzunluğunu bayt olarak ölçtüğünüz en aza indirgemektir.

Örnek yoluyla çalıştı

Sayfa çerçevesinin üstünde gösterilen kedi gifini kare kare olarak çalışacağım.

İşte başlangıç ​​resmi:

Bu görüntü 512 x 512 pikseldir. Her bandın dikey olarak 1/8 boyutunda (64 piksel) başlatılması ve kaydırılması için 4 bantta parçalayacağız.

Şimdi onu iki kat daha fazla gruba (8 bant) ayıracağız ve son zamana kadar (32 piksel) yarıya kaydıracağız. Bu kez yatay olarak kayacağız.

Şimdi bu kez 16 gruba ayrılarak her bir bandı 16 piksel kaydırıp dikey olarak değiştireceğiz.

32 bant, 8 piksel, yatay kaydırma

64 bant, 4 piksel, dikey kaydırma.

128 bant, 2 piksel, yatay kaydırma.

256 bant, 1 piksel, dikey kaydırma.

Bir sonraki vardiya, her bir bandı yarım piksel hareket ettirmemizi gerektirdiğinden, bu noktada duracağız ve sonucu çıkaracağız.

Test durumları

Test görüntüleri için görüntüleri seçmenize izin vereceğimi düşündüğümden, bu görüntüleri oluşturabilecek çalışan bir senaryom var. Öyleyse, 2 genişlikteki kare bir görüntünüz varsa, görmek istediğiniz ejderha haline gelir. Bana göndermek için çekinmeyin ve bir test davası yapacağım.

Test 1 1 dışarı

Ayrıca, düz beyaz veya düz siyah bir görüntü üzerinde test etmelisiniz, böylece piksellerin kaybolup kaybolmadığını belirleyebilirsiniz.



2
Ejderhanın görüntüsü? ahem
Conor O'Brien

Bunun kapanmasına neden olan ana şey, görüntünün kaç kez kaydırılması gerektiği net olmadığı. Vardiyaların kaç kez olacağını belirtirseniz, bunun iyi olacağını düşünüyorum. Başka hiçbir şey bana açık değil.
Yoldaş SparklePony

1
@ LouisMendo **Start** by shifting one 8th of the size of the imageo repeat ... each time splitting the image into twice as many divisions and shifting half as far as the previous timezaman ilk kez 1/8, ikinci 1/16 olacaktır. üçüncü 1/32 piksel sayısı kesirli olana kadar. Bu konuda neyin belirsiz olduğunu anlamıyorum.
Seviye River St

Cartmanager İnsanlar bunu anlamadıklarında, basit bir kareyi gösteren bağlantılı örneğin ilk birkaç statik karesini gösteren çalışılmış bir örneğin, bir animasyondan ziyade yardımcı olacağını ve daha kolay olacağını düşünüyorum. (Mevcut kedi animasyonunu serin gibi bırakın, ancak konsepti kavramak oldukça meşgul.)
Level River St

Yanıtlar:


11

MATLAB, 237 bayt

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

Teknik özelliklerden prosedürü anlamadığım için biraz çalıştı, ancak çalıştığı resmin yardımı ile.


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
Site kurallarımıza uygun input()olarak girdi almak için bir dize olarak kullanılmasını bekleyebilir ve kullanabilirsiniz raw_input().
Buğday Sihirbazı

2

Mathematica, 177 bayt

Yavaş ve tamamen golf değil.

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

Bu Lena:

Lena

Bu Ejderha Lena:

görüntü tanımını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.