Зображення Дракона


23

Я побачив крутий gif кривої близнюка дракона, зробленого з квадрата, і задумався, що буде, якщо ми почнемо з іншого базового зображення. Тому я написав програму для цього.

                                       

Це так круто, що я подумав, що це було б цікаво зробити це як виклик.

Завдання

Ви візьмете квадратне зображення з довжиною ребра, потужністю 2 (більше 4).

Щоб зробити це зображення, слід почати з поділу зображення на 4 вертикальних смуги однакового розміру і зміщення сусідніх смуг на одну восьму розміру зображення в протилежні сторони (зміщені смуги повинні обернутись на іншу сторону). Потім слід повторювати цей процес щоразу, розбиваючи зображення на подвійне ділення та зміщуючи їх удвічі, ніж попередній раз. Кожну ітерацію ви повинні чергувати між вертикальним і горизонтальним зсувом. Ви повинні повторювати, доки зміна не вимагає зміщення на дробову кількість пікселів (це завжди буде 1/2), в який момент ви закінчите.

При зсуві вертикально нечетних пронумерованих смуг зліва (з нульовим індексом) слід зміщуватись вниз, навіть зсуваючись вгору. При зсуві горизонтальних непарних пронумерованих смуг зверху слід зміщувати ліворуч, а навіть нумеровані смуги повинні зміщуватися праворуч.

Вам потрібно лише вивести / відобразити кінцевий результат перетворення, а не всі проміжні кроки, як у gif.

Це тому мета - мінімізувати довжину вихідного коду, виміряну в байтах.

Працювали на прикладі

Я буду працювати над gif-котом, показаним вгорі сторінки за кадром.

Ось початкове зображення:

Це зображення становить 512 на 512 пікселів. Ми розділимо його на 4 діапазони, щоб почати і змістити кожну смугу на 1/8 розміру зображення (64 пікселя) по вертикалі.

Зараз ми поділимо його на два рази більше діапазонів (8 діапазонів) і змістимо його наполовину, ніж минулого разу (32 пікселі). Цього разу ми зсунемо горизонтально.

Зараз ми знову перемістимо вертикально на цей раз, розділивши на 16 смуг і змістивши кожну смугу на 16 пікселів.

32 діапазони, 8 пікселів, горизонтальний зсув

64 діапазони, 4 пікселі, вертикальний зсув.

128 діапазонів, 2 пікселі, горизонтальний зсув.

256 діапазонів, 1 піксель, вертикальний зсув.

Оскільки наступна зміна вимагатиме від нас переміщення кожної смуги на половину пікселя, ми зупинимось на цьому і виведемо результат.

Тестові справи

У мене є робочий сценарій, який може зробити ці зображення, тому я подумав, що дозволю вам вибрати образи для тестових випадків. Тож, якщо у вас є квадратне зображення, що має потужність у 2 ширини, яке ви хотіли б побачити, як воно дратується. Не соромтеся надіслати це мені, і я зроблю його для тесту.

Тест 1 Вихід 1

Також слід перевірити звичайне біле або суцільне чорне зображення, щоб ви могли визначити, зникають чи ні пікселі чи ні.



2
Зображення дракона? ахем
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 Оскільки люди не отримують цього, я думаю, що спрацьований приклад, що показує перші кілька статичних кадрів зв'язаного прикладу, що показують простий квадрат, може допомогти і легше наслідувати, ніж анімація. (Залиште існуючу анімаційну кішку, як це круто, але вона досить зайнята, щоб зрозуміти концепцію.)
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

Математика, 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]&

Це Лена:

Лена

Це Лена Дракон:

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.