รูปภาพของมังกร


23

ฉันเห็นรูปโค้งมังกรคู่แฝดที่ทำจากสี่เหลี่ยมและสงสัยว่าจะเกิดอะไรขึ้นถ้าเราเริ่มจากภาพฐานอีกภาพ ดังนั้นฉันจึงเขียนโปรแกรมเพื่อทำสิ่งนี้

                                       

มันเจ๋งมากที่ฉันคิดว่ามันจะสนุกที่จะทำมันเป็นความท้าทาย

งาน

คุณจะถ่ายภาพสี่เหลี่ยมจัตุรัสที่มีความยาวขอบซึ่งเท่ากับกำลัง 2 (มากกว่า 4)

ในการทำให้ภาพนี้คุณควรเริ่มต้นด้วยการแบ่งภาพของคุณออกเป็นวงแนวตั้ง 4 วงที่มีขนาดเท่ากันและเลื่อนแถบที่อยู่ติดกันหนึ่งใน 8 ของขนาดของภาพในทิศทางตรงกันข้าม (วงที่เลื่อน จากนั้นคุณควรทำขั้นตอนนี้ซ้ำทุกครั้งที่แบ่งภาพออกเป็นสองเท่าของหลาย ๆ แผนกและเลื่อนครึ่งเท่าของเวลาก่อนหน้า การวนซ้ำแต่ละครั้งคุณควรสลับระหว่างการเลื่อนแนวตั้งและแนวนอน คุณควรวนซ้ำจนกว่าการเลื่อนจะทำให้คุณต้องเลื่อนตามจำนวนพิกเซลแบบเศษส่วน (ซึ่งจะเป็น 1/2 เสมอ) ณ จุดที่คุณทำ

เมื่อเลื่อนแถบเลขคี่แนวตั้งจากซ้าย (ดัชนีเป็นศูนย์) ควรเลื่อนลงในขณะที่เลื่อนขึ้น เมื่อเลื่อนแถบเลขคี่แนวนอนจากด้านบนควรเลื่อนไปทางซ้ายในขณะที่เลขที่มีวงก็ควรเลื่อนไปทางขวา

คุณต้องการเพียงผลลัพธ์ / แสดงผลลัพธ์สุดท้ายของการแปลงไม่ใช่ขั้นตอนกลางทั้งหมดเช่นใน gif

นี่คือดังนั้นเป้าหมายคือเพื่อลดความยาวของซอร์สโค้ดของคุณตามที่วัดเป็นไบต์

ทำงานผ่านตัวอย่าง

ฉันจะทำงานผ่าน cat gif ที่แสดงที่ด้านบนของเฟรมหน้าทีละเฟรม

นี่คือภาพเริ่มต้น:

ภาพนี้คือ 512 คูณ 512 พิกเซล เราจะแบ่งออกเป็น 4 แบนด์เพื่อเริ่มและเลื่อนแต่ละแบนด์โดย 1/8 ขนาดภาพ (64 พิกเซล) ในแนวตั้ง

ตอนนี้เราจะแบ่งออกเป็นสองเท่าของวงดนตรี (8 แบนด์) และเลื่อนครึ่งเท่าที่ผ่านมา (32 พิกเซล) คราวนี้เราจะเลื่อนในแนวนอน

ตอนนี้เราจะเลื่อนในแนวตั้งอีกครั้งคราวนี้แยกเป็น 16 แบนด์และเลื่อนแต่ละแบนด์เป็น 16 พิกเซล

32 วง, 8 พิกเซล, กะแนวนอน

64 แถบ, 4 พิกเซล, การเลื่อนในแนวตั้ง

128 แถบ, 2 พิกเซล, การเลื่อนในแนวนอน

256 แถบ, 1 พิกเซล, การเลื่อนในแนวตั้ง

เนื่องจากการเลื่อนครั้งต่อไปจะทำให้เราต้องเลื่อนแต่ละวงไปครึ่งพิกเซลเราจะหยุดที่จุดนี้และให้ผลลัพธ์ออกมา

กรณีทดสอบ

ฉันมีสคริปต์การทำงานที่สามารถสร้างภาพเหล่านี้ดังนั้นฉันคิดว่าฉันจะให้พวกคุณเลือกภาพสำหรับกรณีทดสอบ ดังนั้นหากคุณมีรูปสี่เหลี่ยมจัตุรัสซึ่งมีความกว้าง 2 เท่าที่คุณอยากเห็นกลายเป็นมังกร อย่าลังเลที่จะส่งมาให้ฉันและฉันจะทำให้เป็นกรณีทดสอบ

ทดสอบ 1 ออก 1

คุณควรทดสอบกับภาพสีขาวหรือสีดำล้วนเพื่อให้คุณสามารถระบุได้ว่าพิกเซลหายไปหรือไม่


ที่เกี่ยวข้อง , ที่เกี่ยวข้อง
Jonathan Allan

2
รูปมังกร ahem
Conor O'Brien

สิ่งสำคัญที่ทำให้เรื่องนี้ต้องปิดตัวลงฉันคิดว่ามันไม่ชัดเจนว่าควรเลื่อนภาพกี่ครั้ง หากคุณระบุจำนวนครั้งที่การเปลี่ยนแปลงเกิดขึ้นฉันคิดว่ามันจะใช้ได้ ไม่มีอะไรอื่นที่ชัดเจนสำหรับฉัน
สหาย 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 ที่สามจนกระทั่งจำนวนพิกเซลเป็นเศษส่วน ฉันไม่เห็นสิ่งที่ไม่ชัดเจนเกี่ยวกับเรื่องนี้
เลเวลริเวอร์เซนต์

Cartmanager เนื่องจากผู้คนไม่ได้รับสิ่งนี้ฉันคิดว่าตัวอย่างที่ใช้งานได้แสดงเฟรมแบบสแตติกสองสามตัวแรกของตัวอย่างที่ลิงก์ซึ่งแสดงสี่เหลี่ยมง่ายๆอาจช่วยและติดตามได้ง่ายกว่าแอนิเมชัน (ปล่อยให้อนิเมชั่นแมวที่มีอยู่ออกมาเท่ห์ แต่มันค่อนข้างยุ่งที่จะเข้าใจแนวคิดด้วย)
เลเวลริเวอร์เซนต์

คำตอบ:


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

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
ตามหลักเกณฑ์เว็บไซต์ของเราคุณสามารถใช้และคาดว่าจะถูกส่งผ่านเป็นสตริงที่จะได้รับการป้อนข้อมูลแทนinput() raw_input()
ข้าวสาลี Wizard

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

นี่คือลีนา:

Lena

นี่คือ Lena the Dragon:

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.