ドラゴンのイメージ


23

正方形から作られた双竜の曲線のクールなGIFを見て別のベース画像から始めたらどうなるのだろうと思った。そこで、これを行うプログラムを作成しました。

                                       

とてもクールなので、チャレンジとしてそれをするのは楽しいと思いました。

仕事

エッジの長さが2の累乗(4より大きい)の正方形の画像を取り込みます。

この画像を作成するには、画像を同じサイズの4つの垂直バンドに分割し、隣接するバンドを画像のサイズの1/8の反対方向にシフトすることから始めます(シフトしたバンドは反対側に回り込む必要があります)。その後、イメージを2倍の分割に分割し、前の半分までシフトするたびに、このプロセスを繰り返す必要があります。各反復では、垂直シフトと水平シフトを交互に行う必要があります。シフトを行うには、ピクセルの端数(これは常に1/2になる)だけシフトする必要があるまで、その時点で繰り返す必要があります。

垂直に奇数のバンドを左からシフトする場合(インデックスがゼロ)、下にシフトし、偶数にシフトします。水平方向に奇数のバンドを上からシフトする場合は、左にシフトし、偶数のバンドを右にシフトする必要があります。

変換の最終結果を出力/表示するだけでよく、gifのようなすべての中間ステップではありません。

これはので、目標は、ソースコードの長さをバイト単位で最小化することです。

例を通して働いた

ページの上部に表示される猫のgifをフレームごとに処理します。

これが開始イメージです。

この画像は512 x 512ピクセルです。4つのバンドに分割して、各バンドを開始し、画像サイズの1/8(64ピクセル)ずつ垂直にシフトします。

これを2倍のバンド(8バンド)に分割し、前回の半分(32ピクセル)までシフトします。今回は水平にシフトします。

今度は再び垂直方向にシフトし、今回は16バンドに分割し、各バンドを16ピクセルずつシフトします。

32バンド、8ピクセル、水平シフト

64バンド、4ピクセル、垂直シフト。

128バンド、2ピクセル、水平シフト。

256バンド、1ピクセル、垂直シフト。

次のシフトでは各バンドを半ピクセルずつ移動する必要があるため、この時点で停止して結果を出力します。

テストケース

これらの画像を作成できる作業スクリプトがあるので、テストケースの画像を選択できるようにしたいと思いました。したがって、幅が2のべき乗である正方形の画像があり、その画像をドラゴンにしたい場合があります。それを私に送ってください、そして、私はそれをテストケースにします。

テスト1 アウト1

また、ピクセルが消えているかどうかを判断できるように、白または黒一色のイメージでテストする必要があります。



2
ドラゴンのイメージ?ahem
コナーオブライエン

これが閉じられる主な理由は、画像を何回シフトする必要があるかが不明だからです。シフトが発生する回数を指定すると、問題はないと思います。私にとって不明確なものは他にありません。
同志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、2 番目は1/16になります。ピクセル数が小数になるまでの3番目の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

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()
小麦ウィザード

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

これはレナです:

レナ

これはレナ・ザ・ドラゴンです:

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.