Образ Дракона

23

Я увидел крутой гиф из кривой двойного дракона, сделанный из квадрата, и подумал, что произойдет, если мы начнем с другого базового изображения. Поэтому я написал программу для этого.

                                       

Это так круто, что я подумал, что было бы весело сделать это как вызов.

задача

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

Чтобы сделать это изображение, вы должны начать с разделения вашего изображения на 4 вертикальные полосы одинакового размера и смещения смежных полос на одну восьмую от размера изображения в противоположных направлениях (смещенные полосы должны быть намотаны на другую сторону). Затем вы должны повторять этот процесс каждый раз, разбивая изображение на вдвое большее количество делений и сдвигаясь вдвое по сравнению с предыдущим временем. На каждой итерации вы должны чередовать вертикальные и горизонтальные сдвиги. Вы должны выполнять итерацию до тех пор, пока сдвиг не потребует от вас смещения на дробное число пикселей (это всегда будет 1/2), после чего вы закончите.

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

Вам нужно только вывести / отобразить конечный результат преобразования, а не все промежуточные шаги, как в GIF.

Это поэтому цель состоит в том, чтобы минимизировать длину исходного кода, измеряемую в байтах.

Работал через пример

Я буду работать с изображением кошки, показанным в верхней части страницы, кадр за кадром.

Вот начальное изображение:

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

Теперь мы разделим его на вдвое больше полос (8 полос) и сместим его вдвое меньше, чем в прошлый раз (32 пикселя). На этот раз мы сместимся по горизонтали.

Теперь мы снова сместимся по вертикали, на этот раз разделив на 16 полос и сдвинув каждую полосу на 16 пикселей.

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

64 полосы, 4 пикселя, вертикальный сдвиг.

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

256 полос, 1 пиксель, вертикальный сдвиг.

Поскольку следующий сдвиг потребует от нас перемещения каждой полосы на полпикселя, мы остановимся на этом и выведем результат.

Контрольные примеры

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

Тест 1 Out 1

Вам также следует проверить одноцветное или сплошное черное изображение, чтобы определить, исчезают ли пиксели или нет.

Мастер пшеницы
источник
связанные , связанные .
Джонатан Аллан
2
Изображение дракона? Гм
Конор О'Брайен
Думаю, главное, из-за чего это закрывается, - неясно, сколько раз должно быть смещено изображение. Если вы укажете, сколько раз должен произойти сдвиг, то я думаю, что все будет хорошо. Ничто другое неясно для меня.
Товарищ 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, пока количество пикселей не будет дробным. Я не вижу, что неясно по этому поводу.
Уровень Река St
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

Взял немного работы с угадыванием, так как я не понял процедуру из спецификаций, но с помощью изображения это сработало.

flawr
источник
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()
Dieter
источник
1
В соответствии с правилами нашего сайта вы можете использовать input()и ожидать, что он будет передан в виде строки для получения ввода вместо raw_input().
Пшеничный волшебник
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]&

Это Лена

Лена

Это Лена Дракон

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

alephalpha
источник