Blues circolare


21

Scrivi un programma o una funzione che accetta un numero intero positivo N e ricrea questo modello di cerchi ridimensionati per adattarsi a un'immagine pixel N × N:

cerchi fantasiosi

Questa immagine è un esempio di output valido per N = 946.

Nel caso in cui non sia chiaro, tutti i piccoli cerchi blu chiaro hanno lo stesso raggio e sono posizionati nei quattro cerchi blu scuro allo stesso modo. I cerchi blu scuro hanno il doppio del raggio e sono posizionati in modo simile nel grande cerchio azzurro.

  • È possibile utilizzare due colori visivamente distinti al posto delle due tonalità di blu.

  • Il quadrato di sfondo deve essere colorato.

  • L'antialiasing è facoltativo.

  • Salvare l'immagine in un file, visualizzarlo o reindirizzare i dati di immagine grezzi a stdout.

  • È consentito qualsiasi formato di file immagine comune.

Vince il codice più breve in byte.

Brownie indica se estendi gli aspetti ricorsivi di questo modello di cerchio ad ulteriori livelli. (Tieni questo distinto dalla voce della sfida.)


Cosa intendi con "Il quadrato dello sfondo deve essere colorato"? Se lo sfondo ha un determinato colore di default, posso semplicemente usarlo come uno dei 2 colori senza riempirlo esplicitamente?
aditsu,

Voglio dire, il BG non può essere un terzo colore diverso
Calvin's Hobbies,

Risposte:


5

CJam, 83 byte

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

Provalo online

CJam non ha funzionalità di output delle immagini dedicate. Il mio codice genera un'immagine in PBM ASCII. Per la pubblicazione, ho convertito quell'immagine in un PNG usando GIMP.

Nota che nessuna funzionalità di disegno circolare, o qualcosa del genere, ha usato. L'immagine viene calcolata pixel per pixel.

Uscita campione

Gradi più alti della suddivisione possono essere facilmente creati aumentando la costante 3attorno al centro del codice.

Le immagini di grado 4 e 5 si presentano così:

Grado 4Grado 5

La sequenza generale del codice è:

  1. Genera le coordinate di tutti i pixel, normalizzate nell'intervallo [-1,0, 1,0].
  2. Passa sopra tutti i pixel.
  3. Passa sopra i gradi di suddivisione.
  4. Per ogni suddivisione, controlla se il pixel è interno / esterno e mantieni il risultato. Ridimensiona / traduce le coordinate dei pixel nei sistemi di coordinate centrati in uno dei 4 sotto-cerchi. Scegli quello in cui le coordinate trasformate sono più vicine al centro.
  5. Dai risultati binari interni / esterni di ciascun grado, trova il primo 0, corrispondente al primo grado in cui il pixel era esterno, e prendi il suo modulo 2 per determinare il colore del pixel.

Spiegazione:

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

inserisci qui la descrizione dell'immagine

Questo approccio determina il colore di ogni singola coordinata di pixel usando la funzione ricorsiva c. c(x,y,0)rende un cerchio; c(x,y,1)rende un cerchio con quattro cerchi ritagliati; c(x,y,2)rende l'immagine nell'OP. Qualcosa di più grande di 2 mi fa guadagnare punti brownie.

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

Versione non golfata:

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

Immagine extra ricorsiva bonus:

inserisci qui la descrizione dell'immagine


Invece di .save("p.png")usare.show()
Albert Renshaw il

7

PostScript, 335 byte.

%!
/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 non è solo un formato di file grafico con funzionalità sia vettoriali che bitmap, è in realtà un linguaggio di programmazione completo di Turing basato su oggetti. Il codice sopra è un'implementazione della funzione ricorsiva abbastanza diretta. Tutti gli operatori PostScript sono funzioni ed è banale ridefinirli per condensare il codice. Nota che PostScript utilizza la notazione polacca inversa ( nota anche come notazione postfix).

Gli interpreti PostScript generalmente leggono i metadati (come la dimensione della pagina e il titolo) da commenti speciali all'inizio del file; ovviamente ho rimosso tutti i commenti della firma PostScript, tranne quelli essenziali, %!dalla mia voce, ma dovrebbe comunque essere visualizzato correttamente in qualsiasi interprete PostScript standard, ad esempio GhostScript o Okular. Può anche essere visualizzato utilizzando l' utilità di visualizzazione fornita con ImageMagick / GraphicsMagick.

Si noti che il file dovrebbe terminare con una nuova riga (che ho incluso nel mio conteggio dei byte), altrimenti l'interprete potrebbe arrabbiarsi.

Il parametro size Nper questo codice è 512; è diviso per 2 e duplicato due volte per creare i parametri per la chiamata iniziale della funzione ricorsiva f. La profondità di ricorsione è 2, che viene indicata poco prima di fin 512 2 div dup dup 2 f. Per mantenere le dimensioni ridotte, l'output è in bianco e nero. Sebbene sia possibile impostare una profondità di ricorsione intera non ragionevole ragionevole, questa versione ha un bell'aspetto solo con profondità pari.

Questa immagine è una grafica vettoriale, quindi può essere visualizzata in qualsiasi risoluzione senza pixelizzazione, a seconda della qualità e delle impostazioni dell'interprete / stampante PostScript utilizzata. (FWIW, PostScript utilizza curve cubiche di Bézier per disegnare archi circolari, con abbastanza spline utilizzate per garantire che l'errore sia sempre inferiore a un pixel nello spazio del dispositivo). Per visualizzarlo utilizzando il display di ImageMagick con una qualità ragionevolmente elevata, puoi fare:

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

gli stessi parametri sono buoni anche se si desidera utilizzare ImageMagick convertper convertirlo in un altro formato. Ad esempio, ecco una versione 640x640 del codice PostScript sopra convertito in PNG:

640x640 Frattale cerchio B&W


Ecco una versione leggermente più grande che gestisce il colore RGB e le profondità di ricorsione dispari:

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

Inoltre, consente di impostare il parametro size Ne la profondità di ricorsione dnella parte superiore dello script.

Frattale cerchio di colore 640x640, profondità == 2


Infine, ecco la forma più leggibile del codice. (Sfortunatamente, l'evidenziazione della sintassi usata qui per PostScript lascia molto a desiderare, ma immagino sia meglio di niente ...). Gli interpreti Smart PostScript leggeranno la geometria della pagina dal %%BoundingBox:commento speciale.

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

Ed ecco l'output depth == 4 in formato PNG, ancora una volta creato usando convert (e ottimizzato con optipng ):

Frattale cerchio di colore 640x640, profondità == 4


6

Python 2 + PIL, 361 byte

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

Salva l'immagine in bianco e nero nel file c.png:

esempio di output

Fondamentalmente ho generato uno dei cerchi di mezza grandezza nell'immagine J . Quindi uso se stesso come maschera per dipingere la forma sull'immagine I, che ha il cerchio principale.

Potrebbe essere abbreviato usando I.show() alla fine invece di I.save("c.png"), ma non l'ho fatto funzionare su Python 2. Se qualcuno può confermare che funziona su Python 2, lo cambierò.

Il seguente programma genera l'immagine come nella domanda (419 byte):

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 non bello come l'immagine di Calvino;)
Decadimento beta

Posso confermare che .show () funziona
Albert Renshaw,

Ok, grazie, lo userò invece di save.
Kevin,

3

SVG (1249 caratteri)

Sì, molti personaggi. Ma è statico e si trasforma in qualsiasi dimensione, quindi questo gli dà qualche bonus.

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

Snippet visualizzabile:

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>


Si noti che, come diceva Mego, SVG non soddisfa i nostri criteri per qualificarsi come linguaggio di programmazione . Tuttavia, il PO può scegliere di consentire comunque questa risposta; dipende da lui.
Alex A.

SVG va bene in questo caso.
Calvin's Hobbies,

Riesci a omettere il comando principale 0nelle costanti in virgola mobile? Ad esempio, sostituire 0.4con .4? Nella maggior parte delle lingue, è valido. E una rapida occhiata alle specifiche SVG suggerisce che probabilmente dovrebbe funzionare anche loro.
Reto Koradi,

@RetoKoradi Sì, e probabilmente puoi sgretolare qualche altro numero arrotondando in modo efficiente o modificando le dimensioni in modo da avere bisogno di meno decimali, ma tbh. i percorsi risultanti sono semplicemente troppo complicati per fare una differenza enorme. Ma potrei provare un'altra soluzione usando le maschere più tardi.
colpì il

2

Mathematica 336 359 byte

I principali oggetti grafici sono regioni definite attraverso combinazioni logiche di equazioni.

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

Principalmente solo sperimentando JavaFX.

Immagine dello schermo:

immagine dello schermo

Per i punti brownie, modifica il 2nel codice ( d(n,2,0,0)) con un numero diverso.

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

Lascia alcuni bordi indesiderati come puoi vedere in questo screenshot .


0

JavaScript (ES6), 279

Crea ricorsivamente tele e aggiungi la tela figlio quattro volte alla tela madre. Sul livello inferiore, la tela è un singolo cerchio; quella tela viene stampata quattro volte su una tela madre e quindi quella tela viene stampata quattro volte sulla tela matrice finale.

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

immagine di presentazione

Demo eseguibile:

Con spazi bianchi, commenti e leggermente non golfati:

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
)

Ciò può facilmente produrre strati di ricorsione più profondi modificando il valore iniziale o-2o qualsiasi o-zvalore più grande .

Si noti che questo invio verrà eseguito solo in Firefox, a causa dell'uso delle funzionalità ES6 e dell'incongruenza nell'API canvas fille clipargomenti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.