Dairesel Blues


21

Pozitif N tamsayısına sahip bir program veya işlev yazın ve N × N piksel görüntüsüne uyması için ölçeklenen bu daire desenini yeniden oluşturun:

süslü daireler

Bu görüntü N = 946 için geçerli bir çıktı örneğidir.

Açık olmadığı takdirde, tüm küçük açık mavi daireler aynı yarıçapa sahiptir ve dört koyu mavi dairede aynı şekilde konumlandırılır. Koyu mavi daireler yarıçapı iki katına çıkar ve benzer şekilde büyük açık mavi dairede konumlandırılmış.

  • İki mavi tonun yerine görsel olarak birbirinden farklı iki renk kullanılabilir.

  • Arka plan karesinin renklendirilmesi gerekiyor.

  • Kenar yumuşatma isteğe bağlıdır.

  • Görüntüyü bir dosyaya kaydedin, görüntüleyin veya işlenmemiş görüntü verisini stdout'a yönlendirin.

  • Herhangi bir ortak resim dosyası formatına izin verilir.

Bayt cinsinden en kısa kod kazanır.

Brownie, bu daire şeklinin özyinelemeli yönlerini daha da ileri seviyelere uzatırsanız işaret eder. (Bunu meydan okuma girişinizden farklı tutun.)


"Arka plan karesinin renkli olması gerekiyor" derken ne demek istiyorsunuz? Arka plan varsayılan olarak belirli bir renge sahipse, açıkça doldurmadan 2 renkten biri olarak kullanabilir miyim?
aditsu

Yani bg üçüncü bir renkte olamaz
Calvin'in Hobileri

Yanıtlar:


5

CJam, 83 bayt

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

Çevrimiçi deneyin

CJam özel görüntü çıktısı işlevine sahip değildir. Kodum PBM ASCII'de bir görüntü oluşturuyor. Kayıt için, bu görüntüyü GIMP kullanarak bir PNG'ye dönüştürdüm.

Hiçbir daire çizme işlevi veya onun gibi bir şey kullanılmadığını unutmayın. Görüntü piksel tarafından piksel olarak hesaplanır.

Örnek çıktı

3Kodun ortasındaki sabiti artırarak, alt bölümlerin daha yüksek dereceleri kolaylıkla yaratılabilir .

4. ve 5. derece görüntüler şöyle görünür:

Derece 4Derece 5

Kodun genel sırası:

  1. [-1.0, 1.0] aralığına normalize edilen tüm piksellerin koordinatlarını oluşturun.
  2. Tüm piksellerin üzerinde döngü.
  3. Alt bölünme dereceleri üzerinde döngü.
  4. Her alt bölüm için, pikselin içeride / dışarıda olup olmadığını kontrol edin ve sonucu saklayın. Piksel koordinatlarını ölçekleme / çevirme, 4 alt daireden birinde merkezlenen koordinat sistemlerine. Dönüştürülen koordinatların merkeze en yakın olanı seçin.
  5. Her derecenin ikili iç / dış sonuçlarından, pikselin dışarıda olduğu birinci dereceye karşılık gelen ilk 0'ı bulun ve pikselin rengini belirlemek için modülünü 2 alın.

Açıklama:

"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 bayt

görüntü tanımını buraya girin

Bu yaklaşım özyinelemeli işlevini kullanarak her bir piksel koordinatının rengini belirler c. c(x,y,0)bir daire çizer; c(x,y,1)kesilmiş dört daireli bir daire çizer; c(x,y,2)OP'deki görüntüyü oluşturur. 2'den büyük herhangi bir şey bana kek puan kazandırır.

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")

Golfedilmemiş sürüm:

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")

Bonus ekstra özyinelemeli görüntü:

görüntü tanımını buraya girin


.save("p.png")Sadece kullanmak yerine.show()
Albert Renshaw

7

PostScript, 335 bayt.

%!
/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 hem vektör hem de bitmap özelliklerine sahip bir grafik dosyası formatı değildir, aslında nesne tabanlı bir Turing-komple programlama dilidir. Yukarıdaki kod oldukça yalındır bir özyinelemeli fonksiyon uygulamasıdır. Tüm PostScript operatörleri fonksiyonlardır ve kodu yoğunlaştırmak için yeniden tanımlamaları normaldir. PostScript'in Polonyaca Ters Not gösterimini kullandığını unutmayın (aka postfix notasyonu).

PostScript tercümanları genellikle dosyanın başlangıcındaki özel yorumlardan meta verileri (sayfa boyutu ve başlık gibi) okur; Açıkçası, girişimdeki temel PostScript imzası yorumu dışındaki herkesi kaldırdım %!, ancak yine de standart bir PostScript yorumlayıcısında, örneğin GhostScript veya Okular'da ok göstermesi gerekiyor. ImageMagick / GraphicsMagick ile birlikte gelen ekran yardımcı programını kullanarak da görüntülenebilir .

Dosyanın yeni bir satırda bitmesi gerektiğini unutmayın (bayt sayıma dahil ettik) veya yorumlayıcı üzülebilir.

NBu kod için boyut parametresi 512; özyinelemeli fonksiyonun ilk çağrısı için parametreler oluşturmak üzere 2'ye bölünür ve iki kez çoğaltılır f. Yineleme derinliği hemen önce verilir 2'dir fin 512 2 div dup dup 2 f. Boyutu küçük tutmak için çıktı siyah beyazdır. Herhangi bir makul olmayan negatif tamsayı özyineleme derinliği ayarlayabilseniz de, bu sürüm yalnızca derinliklerde iyi görünüyor.

Bu görüntü bir vektör grafiğidir, bu nedenle kullanılan PostScript yorumlayıcısının / yazıcının kalitesine ve ayarlarına bağlı olarak, pikselleşmeden herhangi bir çözünürlükte görüntülenebilir. (FWIW, PostScript, dairesel yaylar çizmek için Bézier kübik eğrileri kullanır, hatanın her zaman aygıt alanında bir pikselden daha az olmasını sağlamak için yeterli eğriye sahiptir). ImageMagick'in ekranını oldukça yüksek kalitede görüntülemek için aşağıdakileri yapabilirsiniz:

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

ImageMagick'i convertbaşka bir formata dönüştürmek için kullanmak istiyorsanız aynı parametreler de iyidir . Örneğin, işte PNG'ye dönüştürülen yukarıdaki PostScript kodunun 640x640 sürümü:

640x640 B & W daire fraktal


İşte RGB renk ve tuhaf özyineleme derinliklerini idare eden biraz daha büyük bir versiyon:

%!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

Ayrıca size parametresini Nve dbetiğin tepesine yakın özyineleme derinliğini ayarlamanızı sağlar .

640x640 renk çemberi fraktal, derinlik == 2


Son olarak, işte kodun daha okunaklı şekli. (Ne yazık ki, burada PostScript için kullanılan sözdizimi vurgulanması çok arzulanan bir şey bırakıyor , ama sanırım hiç yoktan iyidir ...). Akıllı PostScript tercümanları, sayfa geometrisini %%BoundingBox:özel yorumdan okuyacaktır .

%!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

Ve işte PNG formatındaki derinlik == 4 çıktısı, bir kez daha convert kullanılarak yaratıldı (ve optipng ile optimize edildi ):

640x640 renk çemberi fraktal, derinlik == 4


6

Python 2 + PIL, 361 bayt

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")

Görüntüyü siyah beyaz dosyaya kaydeder c.png:

örnek çıktı

Temel olarak görüntüdeki yarım boyutlu dairelerden birini oluşturuyorum J. Daha sonra, şekli Iana daireye sahip olan görüntü üzerine boyamak için kendini maske olarak kullanıyorum .

I.show()Sonunda kullanmak yerine kısaltılabilir I.save("c.png"), ancak Python 2 üzerinde çalışmasını sağlayamadım. Birisi Python 2 üzerinde çalıştığını onaylayabiliyorsa bunu değiştireceğim.

Aşağıdaki program, sorudaki gibi görüntüyü oluşturur (419 bytes):

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, Calvin'in görüntüsü kadar güzel değil;)
Beta Decay

.Show () 'nin işe yaradığını onaylayabilirim
Albert Renshaw

Tamam, teşekkürler, bunun yerine onu kullanacağım save.
Kevin,

3

SVG (1249 karakter)

Evet, çok fazla karakter. Ancak statiktir ve herhangi bir boyutta iş yapar, bu yüzden ona biraz bonus verir.

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

Görüntülenebilir snippet:

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’nun söylediği gibi, SVG’nin bir programlama dili olarak nitelenme kriterlerimizi karşılamadığını unutmayın . Ancak, OP yine de bu cevaba izin vermeyi seçebilir; ona kalmış.
Alex A.

Bu durumda SVG iyidir.
Calvin'in Hobileri

0Kayan nokta sabitlerinde liderliği atlayabilir misiniz ? Örneğin, yerine 0.4göre .4? Çoğu dilde bu geçerlidir. Ve SVG teknik özelliklerine çok hızlı bir bakış, muhtemelen onların da işe yaraması gerektiğini gösteriyor.
Reto Koradi

@RetoKoradi Evet, muhtemelen verimli bir şekilde yuvarlayarak ya da boyutu daha az ondalık basmaya ihtiyaç duyacak şekilde değiştirerek, ancak tbh olarak birkaç rakam daha da kullanabilirsiniz. Ortaya çıkan yollar bunun için çok büyük bir fark yaratmayacak kadar karmaşık. Fakat daha sonra maskeleri kullanarak başka bir çözüm deneyebilirim.
dürtmek

2

Mathematica 336 359 bayt

Temel grafik nesneleri, denklemlerin mantıksal kombinasyonları ile tanımlanan bölgelerdir.

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

pic


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();}}

Çoğunlukla sadece JavaFX ile deneme yapıyoruz.

Ekran görüntüsü:

ekran görüntüsü

Brownie puanları için, 2( d(n,2,0,0)) kodunu farklı bir numarayla değiştirin.

Eski versiyon, 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();}}

Bu ekran görüntüsünde görebileceğiniz gibi bazı istenmeyen kenarları bırakır .


0

JavaScript (ES6), 279

Tekrarlayan şekilde tuvaller oluşturun ve alt tuvali dört kez üst tuvaline ekleyin. Alt katmanda, tuval tek bir çemberdir; Bu tuval bir üst tuval üzerine dört kez damgalanır ve ardından o tuval son ana tuval üzerine dört kez damgalanır.

(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`)

gönderim resmi

Çalıştırılabilir demo:

Beyaz boşluk, yorum ve hafifçe temelsiz:

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
)

Bu, ilk o-2veya daha büyük bir o-zdeğeri değiştirerek kolayca daha derin özyineleme katmanları üretebilir .

Bunun, yalnızca ES6 özelliklerinin kullanımı ve tuval API'sindeki fillve clipbağımsız değişkenler için tutarsızlık nedeniyle Firefox'ta yayınlanacağını unutmayın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.