サーキュラーブルース


21

正の整数Nを取り込んで、N×Nピクセル画像に合うようにスケーリングされたこの円のパターンを再作成するプログラムまたは関数を作成します。

ファンシーサークル

この画像は、N = 946の有効な出力例です。

明確でない場合、すべての小さな水色の円は同じ半径を持ち、同じように4つの濃い青の円に配置されます。濃い青の円はその半径が2倍で、同じように大きな水色の円に配置されています。

  • 青の2色の代わりに、視覚的に異なる2色を使用できます。

  • 背景の正方形に色を付ける必要があります。

  • アンチエイリアスはオプションです。

  • 画像をファイルに保存、表示、または生の画像データを標準出力にパイプします。

  • 一般的な画像ファイル形式はすべて許可されます。

バイト単位の最短コードが優先されます。

この円パターンの再帰的側面をさらにレベルに拡張すると、ブラウニーがポイントします。(チャレンジエントリとは区別してください。)


「背景の正方形に色を付ける必要がある」とはどういう意味ですか?デフォルトで背景に特定の色がある場合、明示的に塗りつぶさずに2色の1つとして使用できますか?
-aditsu

bgを3番目の異なる色にすることはできません
カルビンの趣味

回答:


5

CJam、83バイト

"P1"li___,.5f+2.@/f*1fm2m*{[3{_~mh1<[[VX][ZmqV]]_Wff*+@2f*f.+{~mh}$0=}*;0]0#2%}%]S*

オンラインで試す

CJamには専用の画像出力機能がありません。私のコードはPBM ASCIIで画像を生成します。投稿のために、GIMPを使用してその画像をPNGに変換しました。

円描画機能や、そのようなものは使用していません。画像はピクセルごとに計算されます。

サンプル出力

3コードの中央付近の定数を増やすことで、より高度な下位区分を簡単に作成できます。

次数4と5の画像は次のようになります。

学位4学位5

コードの全体的なシーケンスは次のとおりです。

  1. [-1.0、1.0]の範囲に正規化されたすべてのピクセルの座標を生成します。
  2. すべてのピクセルをループします。
  3. 細分化の度にループします。
  4. サブディビジョンごとに、ピクセルが内側/外側にあるかどうかを確認し、結果を保持します。ピクセル座標を4つのサブサークルの1つを中心とする座標系にスケール/変換します。変換された座標が中心に最も近いものを選択します。
  5. 各次数のバイナリの内部/外部結果から、ピクセルが外部にあった最初の次数に対応する最初の0を見つけ、そのモジュロ2を取得してピクセルの色を決定します。

説明:

"P1"    Start of header for PBM ASCII file.
li      Get input n.
__      Two copies for the width/height of the image in the PBM header.
_,      Generate [0 .. n - 1].
.5f+    Add 0.5 to each list entry, since we want to test the pixel centers.
2.@/    Calculate 2.0 / n, which is the distance between two pixels.
f*      Multiply the unscaled pixel coordinates with the pixel distance.
        We now have coordinates in the range [0.0, 2.0].
1fm     Subtract one from each, giving coordinates in range [-1.0, 1.0].
2m*     Cartesian power to calculate all y/x pairs.
{       Start loop over all pixel coordinates.
  [       Start wrapping the inside/outside results for all degrees.
  3{      Start loop over degrees.
    _~mh    Calculate distance from center.
    1<      Compare with 1. This gives inside/outside result for degree.
    [       Start building list of centers for 4 sub-circles.
    [VX]    One is at [0 1]. Note that coordinate order is y/x.
    [ZmqV]  Next one is at [sqrt(3) 0].
    ]       Wrap these two...
    _       ... and copy them.
    Wff*    Mirror all coordinates by multiplying with -1.
    +       Concatenate, giving the centers of all 4 sub-circles.
    @       Get current coordinates to top.
    2f*     Multiply them by 2. Note that the coordinates need to be scaled up by
            a factor 2 to give a circle with half the radius when we test the distance
            to the origin against 1.0.
    f.+     Add the current coordinates to the centers of all 4 sub-circles.
            For each sub-circle, this puts the current coordinates in a coordinate
            space with the origin at the center, and with a radius of 1.0
    {~mh}$  Sort them by distance to the origin...
    0=      ... and take the first one. This picks the sub-circle which has its
            center closest to the current coordinates.
            We now have one coordinate pair, for the closest sub-circle, and are
            ready for the next loop iteration, which tests the next degree of the
            subdivision.
  }*      End loop over degrees.
  ;       Have remaining coordinate pair on stack, pop it.
  0       Add a sentinel for find operation before, so that a 0 is always found.
  ]       End wrapping the inside/outside results for all degrees.
  0#      Find the first 0 (outside) degree.
  2%      Modulo 2 to determine color.
}%      End loop over all pixel coordinates.
]       Wrap the pieces of the PBM header and the pixel list.
S*      Join them with spaces, to produce the necessary spaces for the header.

17

Python 2 + PIL、262バイト

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

このアプローチは、再帰関数を使用して個々のピクセル座標の色を決定しますcc(x,y,0)円をレンダリングします。c(x,y,1)4つの円が切り取られた円をレンダリングします。c(x,y,2)OPで画像をレンダリングします。2より大きいものはブラウニーポイントを獲得します。

import PIL.Image as I
d=3**.5/2
c=lambda x,y,l=0:c(x,y)&~any(c((x+i)*2,(y+j)*2,l-1)for i,j in[(.5,0),(-.5,0),(0,d),(0,-d)])if l else x*x+y*y<1
z=input()
f=lambda s:2.*s/z-1
I.frombytes("L",(z,z),"".join(" ~"[c(f(i%z),f(i/z),2)]for i in range(z*z))).save("p.png")

非ゴルフバージョン:

from PIL import Image
import math
def in_shape(x,y, level=0):
    d = math.sqrt(3)/2
    if level == 0:
        return x**2 + y**2 <= 1
    else:
        t = True
        for dx,dy in [(0.5, 0), (-0.5, 0), (0, d), (0,-d)]:
            if in_shape((x+dx)*2, (y+dy)*2, level-1):
                t = False
        return in_shape(x,y) and t

f = lambda s: ((2*s / float(size))-1)

size = input()
img = Image.new("RGB", (size, size))
pix = img.load()
for i in range(size):
    for j in range(size):
        if in_shape(f(i), f(j), 2):
            pix[i,j] = (0,0,0)
        else:
            pix[i,j] = (255,255,255)
img.save("output.png")

ボーナスの再帰的画像:

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


.save("p.png")単に使用する代わりに.show()
アルバートレンショー

7

PostScript、335バイト。

%!
/D{def}def/B{bind D}D/E{exch}B/A{add}D/c{3 copy 3 -1 roll A E moveto 0 360 arc}B/f{5 dict begin/d E D/r E D/y E D/x E D gsave x y r c clip d 2 mod setgray x y r c fill d 0 gt{/h 3 sqrt 2 div r mul D/r r 2 div D/d d 1 sub D x r A y r d f x r sub y r d f x y h A r d f x y h sub r d f}if grestore end}B 512 2 div dup dup 2 f showpage

PostScriptは、ベクターとビットマップの両方の機能を備えた単なるグラフィックファイル形式ではなく、実際にはオブジェクトベースのチューリング完全なプログラミング言語です。上記のコードは、かなり単純な再帰関数の実装です。すべてのPostScript演算子は関数であり、コードを凝縮するためにそれらを再定義することは一般的です。PostScriptは逆ポーランド記法(別名、後置記法)を使用することに注意してください。

PostScriptインタープリターは通常、ファイルの先頭にある特別なコメントからメタデータ(ページサイズやタイトルなど)を読み取ります。明らかに%!、エントリから基本的なPostScript署名コメントを除いてすべて削除しましたが、GhostScriptやOkularなどの標準のPostScriptインタープリターでも問題なく表示されるはずです。ImageMagick / GraphicsMagickに付属の表示ユーティリティを使用して表示することもできます。

ファイルは改行(バイトカウントに含めた)で終わる必要があります。そうしないと、インタープリターが混乱する可能性があります。

Nこのコードのサイズパラメータは512です。これは2で除算され、2回複製されて、再帰関数の初期呼び出しのパラメーターが作成されますf。再帰の深さは2で、finの直前に指定され512 2 div dup dup 2 fます。サイズを小さく保つため、出力は白黒です。妥当な非負の整数再帰深度を設定できますが、このバージョンは深度が同じ場合にのみ適切に見えます。

この画像はベクターグラフィックなので、使用するPostScriptインタープリター/プリンターの品質と設定に応じて、ピクセル化せずに任意の解像度で表示できます。(FWIW、PostScriptはベジエ3次曲線を使用して円弧を描画し、デバイス空間でエラーが常に1ピクセル未満になるように十分なスプラインを使用します)。ImageMagickのディスプレイを使用して合理的に高品質で表示するには、次のようにします。

display -density 300 -geometry 512x512 -page 512x512

ImageMagickを使用convertして別の形式に変換する場合も、同じパラメーターが適しています。たとえば、PNGに変換された上記のPostScriptコードの640x640バージョンは次のとおりです。

640x640白黒サークルフラクタル


以下は、RGBカラーと奇妙な再帰深度を処理するわずかに大きなバージョンです。

%!PS-Adobe-3.0
/D{def}def/N 512 D/d 2 D/B{bind D}D/E{exch}B/A{add}D/c{3 copy 3 -1 roll A E moveto 0 360 arc}B/k{2 mod 0 eq{.3 .6 .9}{0 .2 .5}ifelse setrgbcolor}B d 1 A k 0 0 N N rectfill/f{5 dict begin/d E D/r E D/y E D/x E D gsave x y r c clip d k x y r c fill d 0 gt{/h 3 sqrt 2 div r mul D/r r 2 div D/d d 1 sub D x r A y r d f x r sub y r d f x y h A r d f x y h sub r d f}if grestore end}B N 2 div dup dup d f showpage

また、スクリプトの上部付近でサイズパラメーターNと再帰の深さを設定することもできますd

640x640カラーサークルフラクタル、深度== 2


最後に、より読みやすい形式のコードを示します。(残念ながら、ここで使用されているPostScriptの構文の強調表示には、多くの要望が残されていますが、何もないよりはましだと思います...)。スマートPostScriptインタープリターは、%%BoundingBox:特別なコメントからページジオメトリを読み取ります。

%!PS-Adobe-3.0
%%BoundingBox: 0 0 640 640
%%Title: Circle fractal
%%Creator: PM 2Ring
%%Creationdate: (Oct 29 2015)
%%Pages: 1 1
%%EndComments

% for http://codegolf.stackexchange.com/questions/61989/circular-blues

% ----------------------------------------------------------------------

16 dict begin

%Total image width & height in points / pixels
/N 640 def

%Maximum recursion depth
/Depth 4 def

% ----------------------------------------------------------------------

%Draw a circle centred at (x,y), radius r. x y r circle -
/circle{
    3 copy      % x y r  x y r
    3 -1 roll   % x y r  y r x
    add exch    % x y r  x+r y
    moveto
    0 360 arc 
}bind def

% ----------------------------------------------------------------------

%Select 1st color if n is even, select 2nd color if n is odd. n color -
/color{
    2 mod 0 eq
    {.36 .6 .9}
    {0 .25 .5}
    ifelse
    setrgbcolor
}bind def

%Do background square
Depth 1 add color
0 0 N N rectfill

/Q 3 sqrt 2 div def

%Recursive circle pattern. x y r Depth cfrac -
/cfrac{
    5 dict begin
    /Depth exch def
    /r exch def
    /y exch def
    /x exch def

    gsave
    x y r circle clip
    Depth color
    x y r circle fill

    Depth 0 gt
    {
        /dy Q r mul def
        /r r 2 div def
        /Depth Depth 1 sub def 

        x r add y r Depth cfrac
        x r sub y r Depth cfrac
        x y dy add r Depth cfrac
        x y dy sub r Depth cfrac
    }if
    grestore
    end
}bind def

%Call it!
N 2 div dup dup Depth cfrac

showpage

% ----------------------------------------------------------------------

%%Trailer
end
%%EOF

そして、ここにPNG形式のdepth == 4出力があり、改めてconvertを使用して作成されています(そしてoptipngで最適化されています):

640x640カラーサークルフラクタル、深度== 4


6

Python 2 + PIL、361バイト

import PIL.Image as p,PIL.ImageDraw as d
W=input()
q=W/4
h=2*q
t=3*q
e=W/8
o=int(q*3**.5)
I,J=[p.new("1",(s,s),s>h)for s in[W,h]]
Q=lambda i,x,y,s=q,c=0:d.Draw(i).ellipse((x,y,x+s,y+s),fill=c)
Q(I,0,0,W)
Q(J,0,0,h,1)
[Q(J,k,e)for k in[0,q]]
[Q(J,e,e+k/2)for k in[-o,o]]
[I.paste(1,k,J)for k in[(0,q,h,t),(h,q,4*q,t),(q,q-o,t,t-o),(q,q+o,t,t+o)]]
I.save("c.png")

画像を白黒でファイルに保存しますc.png

出力例

基本的に、画像に半分のサイズの円を生成しJます。次に、自分自身をマスクとして使用Iして、メインサークルを持つimage に形状をペイントします。

I.show()最後にを使用して短縮することもできますがI.save("c.png")、Python 2では動作しませんでした。Python2で動作することを誰かが確認できたら、それに変更します。

次のプログラムは、質問のようにイメージを生成します(419バイト):

import PIL.Image as p,PIL.ImageDraw as d
W=int(input())
q=W/4
h=2*q
t=3*q
e=W/8
o=int(q*3**.5)
I,J=[p.new(["1","RGB"][s>h],(s,s),s>h and"rgb(13,55,125)")for s in[W,h]]
Q=lambda i,x,y,s=q,c=0:d.Draw(i).ellipse((x,y,x+s,y+s),fill=c)
Q(I,0,0,W,"rgb(97,140,224)")
Q(J,0,0,h,1)
[Q(J,k,e)for k in[0,q]]
[Q(J,e,e+k/2)for k in[-o,o]]
[I.paste("rgb(13,55,125)",k,J)for k in[(0,q,h,t),(h,q,4*q,t),(q,q-o,t,t-o),(q,q+o,t,t+o)]]
I.save("c.png")

-1カルバンの画像ほどきれいではありません;)
ベータ崩壊

.show()が機能することを確認できます
アルバートレンショー

OK、ありがとう、代わりにそれを使用しますsave
ケビン

3

SVG(1249文字)

ええ、たくさんのキャラクター。ただし、静的であり、任意のサイズでレンダリングされるため、ボーナスがあります。

<svg xmlns="http://www.w3.org/2000/svg"><path d="M15,33c-2.5,0-4.6,1.9-4.9,4.3c2.8,1.6,6.1,2.6,9.5,2.6c0.3-0.6,0.4-1.3,0.4-2C20,35.2,17.8,33,15,33zM15,7c2.8,0,5-2.2,5-5c0-0.7-0.1-1.4-0.4-2c-3.5,0.1-6.7,1-9.5,2.6C10.4,5.1,12.5,7,15,7zM25,33c-2.8,0-5,2.2-5,5c0,0.7,0.1,1.4,0.4,2c3.5-0.1,6.7-1,9.5-2.6C29.6,34.9,27.5,33,25,33zM25,7c2.5,0,4.6-1.9,4.9-4.3C27.1,1,23.9,0.1,20.4,0C20.1,0.6,20,1.3,20,2C20,4.7,22.2,7,25,7zM35,28.7C34.8,26,32.6,24,30,24s-4.8,2.1-5,4.7c-3-1.7-5-5-5-8.7c0,3.7-2,6.9-5,8.7C14.8,26,12.6,24,10,24S5.2,26,5,28.7c-3-1.7-5-5-5-8.7c0,7.4,4,13.9,10,17.3c0.1-1.2,0.4-2.4,0.8-3.4c0.9-1.9,2.3-3.5,4.1-4.5c0,0,0,0,0.1,0c0.2,2.6,2.3,4.7,5,4.7s4.8-2.1,5-4.7c0,0,0,0,0.1,0c1.8,1,3.2,2.6,4.1,4.5c0.5,1.1,0.8,2.2,0.8,3.4c6-3.5,10-9.9,10-17.3C40,23.7,38,26.9,35,28.7zM5,11.3c0.2,2.6,2.3,4.7,5,4.7s4.8-2.1,5-4.7c3,1.7,5,5,5,8.7c0-3.7,2-6.9,5-8.7c0.2,2.6,2.3,4.7,5,4.7s4.8-2.1,5-4.7c3,1.7,5,5,5,8.7c0-7.4-4-13.9-10-17.3c-0.1,1.2-0.4,2.4-0.8,3.4C28.3,8,26.8,9.6,25,10.6c0,0,0,0-0.1,0C24.8,8,22.6,6,20,6s-4.8,2.1-5,4.7c0,0,0,0-0.1,0c-1.8-1-3.2-2.6-4.1-4.5C10.4,5,10.1,3.9,10,2.6C4,6.1,0,12.6,0,20C0,16.3,2,13,5,11.3z"/><circle cx="15" cy="20" r="5"/><circle cx="5" cy="20" r="5"/><circle cx="35" cy="20" r="5"/><circle cx="25" cy="20" r="5"/></svg>

表示可能なスニペット:

svg { fill: #9FD7FF; background: #2176AA; }
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="400" viewBox="0 0 40 40">
  <path d="M15,33c-2.5,0-4.6,1.9-4.9,4.3c2.8,1.6,6.1,2.6,9.5,2.6c0.3-0.6,0.4-1.3,0.4-2C20,35.2,17.8,33,15,33zM15,7c2.8,0,5-2.2,5-5c0-0.7-0.1-1.4-0.4-2c-3.5,0.1-6.7,1-9.5,2.6C10.4,5.1,12.5,7,15,7zM25,33c-2.8,0-5,2.2-5,5c0,0.7,0.1,1.4,0.4,2c3.5-0.1,6.7-1,9.5-2.6C29.6,34.9,27.5,33,25,33zM25,7c2.5,0,4.6-1.9,4.9-4.3C27.1,1,23.9,0.1,20.4,0C20.1,0.6,20,1.3,20,2C20,4.7,22.2,7,25,7zM35,28.7C34.8,26,32.6,24,30,24s-4.8,2.1-5,4.7c-3-1.7-5-5-5-8.7c0,3.7-2,6.9-5,8.7C14.8,26,12.6,24,10,24S5.2,26,5,28.7c-3-1.7-5-5-5-8.7c0,7.4,4,13.9,10,17.3c0.1-1.2,0.4-2.4,0.8-3.4c0.9-1.9,2.3-3.5,4.1-4.5c0,0,0,0,0.1,0c0.2,2.6,2.3,4.7,5,4.7s4.8-2.1,5-4.7c0,0,0,0,0.1,0c1.8,1,3.2,2.6,4.1,4.5c0.5,1.1,0.8,2.2,0.8,3.4c6-3.5,10-9.9,10-17.3C40,23.7,38,26.9,35,28.7zM5,11.3c0.2,2.6,2.3,4.7,5,4.7s4.8-2.1,5-4.7c3,1.7,5,5,5,8.7c0-3.7,2-6.9,5-8.7c0.2,2.6,2.3,4.7,5,4.7s4.8-2.1,5-4.7c3,1.7,5,5,5,8.7c0-7.4-4-13.9-10-17.3c-0.1,1.2-0.4,2.4-0.8,3.4C28.3,8,26.8,9.6,25,10.6c0,0,0,0-0.1,0C24.8,8,22.6,6,20,6s-4.8,2.1-5,4.7c0,0,0,0-0.1,0c-1.8-1-3.2-2.6-4.1-4.5C10.4,5,10.1,3.9,10,2.6C4,6.1,0,12.6,0,20C0,16.3,2,13,5,11.3z"/>
  <circle cx="15" cy="20" r="5"/>
  <circle cx="5" cy="20" r="5"/>
  <circle cx="35" cy="20" r="5"/>
  <circle cx="25" cy="20" r="5"/>
</svg>


Megoが言ったように、SVGはプログラミング言語としての資格基準を満たしいないことに注意してください。ただし、OPはとにかくこの回答を許可することを選択できます。それは彼次第です。
アレックスA.

この場合、SVGは問題ありません。
カルビンの趣味

0浮動小数点定数の先頭を省略できますか?たとえば、置き換える0.4ことで.4?ほとんどの言語では、それは有効です。また、SVG仕様を非常に簡単に見てみると、おそらく同様に機能するはずです。
レトコラディ

@RetoKoradiええ、あなたはおそらく効率的に丸めるか、必要な小数点以下の数を減らすようにサイズを変更することにより、いくつかのより多くの数字をクランチすることができますが、tbh。結果のパスは非常に複雑であるため、大きな違いを生むことはできません。しかし、後でマスクを使用して別のソリューションを試すことができます。
突く

2

Mathematica 336 359バイト

主要なグラフィックスオブジェクトは、方程式の論理的な組み合わせによって定義される領域です。

r=Red;i=ImplicitRegion;m=i[-2<x<2&&-2<y<2,{x,y}];n=Input[];
t[a_,b_,c_]:=i[(x+a)^2+(y+b)^2<=c,{x,y}];
a_~f~b_:={t[a,b,1],t[-.5+a,b,1/4],t[.5+a,b,1/4],t[a,b-.865,1/4],t[a,b+.865, 1/4]}
g@d_:=RegionIntersection[m,BooleanRegion[#1&&!#2&&!#3&&!#4&&!#5&,d]]
RegionPlot[{m,t[0,0,4],g@f[1,0],g@f[-1,0],g@f[0,1.75], 
g@f[0, -1.75]},ImageSize->n,PlotStyle->{r,Blue,r,r,r,r}]

写真


1

Java、550

import javafx.application.*;import javafx.scene.*;import javafx.scene.layout.*;import javafx.scene.shape.*;import javafx.stage.*;public
class C extends Application{static long n;Shape d(float m,float k,float x,float y){float h=m/2;Shape
s=new Circle(x+h,y+h,h);return k>0?s.subtract(s,s.union(s.union(s.union(d(h,k-1,x,y+m/4),d(h,k-1,x+h,y+m/4)),d(h,k-1,x+m/4,y-m*.183f)),d(h,k-1,x+m/4,y+m*.683f))):s;}public
void start(Stage s){s.setScene(new Scene(new Pane(d(n,2,0,0))));s.show();}public
static void main(String[]a){n=Long.valueOf(a[0]);launch();}}

ほとんどの場合、JavaFXを試しています。

スクリーンショット:

スクリーンショット

ブラウニーポイントの場合2は、コード(d(n,2,0,0))を別の番号に変更します。

古いバージョン、810

import javafx.application.*;import javafx.scene.*;import javafx.scene.canvas.*;import javafx.scene.effect.*;import javafx.scene.layout.*;import javafx.scene.paint.*;import javafx.stage.*;public
class C extends Application{static long n;Canvas c;GraphicsContext g;void
d(float m,float k,float x,float y){if(k>0){float
h=m/2;g.save();g.beginPath();g.arc(x+h,y+h,h,h,0,360);g.clip();g.fillRect(x,y,m,m);d(h,k-1,x,y+m/4);d(h,k-1,x+h,y+m/4);d(h,k-1,x+m/4,y-m*.183f);d(h,k-1,x+m/4,y+m*.683f);g.restore();}}public
void start(Stage s){c=new Canvas(n,n);g=c.getGraphicsContext2D();g.setGlobalBlendMode(BlendMode.DIFFERENCE);g.setFill(Color.TAN);g.fillRect(0,0,n,n);d(n,3,0,0);Pane
p=new Pane();p.getChildren().add(c);s.setScene(new Scene(p));s.show();}public
static void main(String[]a){n=Long.valueOf(a[0]);launch();}}

このスクリーンショットでわかるように、不要なエッジが残っています。


0

JavaScript(ES6)、279

再帰的にキャンバスを作成し、子キャンバスをその親キャンバスに4回追加します。最下層では、キャンバスは単一の円です。そのキャンバスは親キャンバスに4回スタンプされ、その後、そのキャンバスは最終マスターキャンバスに4回スタンプされます。

(n,o=0)=>(r=o-2&&f(n/2,o+1),c=document.createElement`canvas`,X=c.getContext`2d`,d=(x,Q)=>(X.drawImage(r,x,k+Q*k*Math.sqrt(3)),d),c.width=c.height=n,m=n/2,k=n/4,X.fillStyle=o%2||"red",X.fill(X.clip(X.arc(m,m,m,0,7))),r&&d(0,0)(m,0)(k,-1)(k,1),o?c:location=c.toDataURL`image/jpeg`)

提出画像

実行可能なデモ:

空白、コメント、やや手間いらず:

f=(n,o=0)=>(
    // recursively create another canvas if we're not at the deepest layer
    var r;
    if(o < 2) { r = f(n/2,o+1); }

    // create this canvas
    c=document.createElement("canvas"),
    c.width=c.height=n,
    X=c.getContext("2d"),

    // helpful postions
    m=n/2, k=n/4, q=k*Math.sqrt(3),

    // draw a circle and clip future draws within this circle
    // either fills red (the shortest color name) or a non-color that defaults to black
    X.fillStyle= o%2 || "red",
    X.arc(m,m,m,0,7),
    X.clip(),
    X.fill(),

    // define a chainable `drawImage` alias (the `d` function returns itself)
    d=(x,y)=>(X.drawImage(r,x,y),d)

    // if we have a recursive canvas, draw it four times by chaining `d`
    if(r) { d(0,k)(m,k)(k,k-q)(k,k+q); }

    // if this is the top-layer (o==0), show the final jpeg
    if(o == 0) { location = c.toDataURL("image/jpeg"); }

    // return this canvas, to be used recursively
    c
)

これにより、初期値o-2またはそれより大きなo-z値を変更することで、より深い再帰層を簡単に作成できます。

ES6の機能の使用と、キャンバスAPI fillおよびclip引数の不整合のため、これはFirefoxでのみ実行されることに注意してください。

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