Tweetable Mathematical Art [chiuso]


330

La matematica integer può generare schemi sorprendenti se disposta su una griglia. Anche le funzioni più elementari possono produrre progetti incredibilmente elaborati!

La tua sfida

Scrivi 3 corpi funzione Tweetable (che significano 140 caratteri o meno) per i valori rosso, verde e blu per un'immagine 1024x1024.

L'input per le funzioni sarà di due numeri interi i (numero di colonna per il pixel dato) e j (numero di riga per il pixel dato) e l'output sarà un corto senza segno tra 0 e 1023, incluso, che rappresenta la quantità del dato colore presente nel pixel (i, j).

Ad esempio, le seguenti tre funzioni producono l'immagine seguente:

/* RED */
    return (unsigned short)sqrt((double)(_sq(i-DIM/2)*_sq(j-DIM/2))*2.0);
/* GREEN */
    return (unsigned short)sqrt((double)(
        (_sq(i-DIM/2)|_sq(j-DIM/2))*
        (_sq(i-DIM/2)&_sq(j-DIM/2))
    )); 
/* BLUE */
    return (unsigned short)sqrt((double)(_sq(i-DIM/2)&_sq(j-DIM/2))*2.0);

Pattern-1

/* RED */
    return i&&j?(i%j)&(j%i):0;
/* GREEN */
    return i&&j?(i%j)+(j%i):0;
/* BLUE */
    return i&&j?(i%j)|(j%i):0;

Pattern-2

Le regole

  • Dato questo codice C ++ , sostituiscilo con le tue funzioni. Ho fornito alcune macro e ho incluso la libreria e potresti includere complex.h. È possibile utilizzare qualsiasi funzione di queste librerie e / o macro personali. Si prega di non utilizzare risorse esterne oltre a questo.
  • Se quella versione non funziona per te, assicurati di compilare con:

    g++ filename.cpp -std=c++11
    

    Se il problema persiste , utilizza la versione alternativa utilizzando caratteri non firmati anziché short senza segno.

Michaelangelo ha fornito una versione di output a colori a 24 o 48 bit ripulita .

  • È possibile implementare la propria versione in un'altra lingua, ma deve comportarsi allo stesso modo della versione C ++ fornita, e solo le funzioni degli incorporati C ++, della libreria o delle macro fornite possono essere utilizzate per renderlo corretto.
  • Pubblica solo i tuoi tre corpi funzione - per favore non includere il mio codice nel tuo post
  • Includi una versione più piccola o una copia incorporata della tua immagine. Sono realizzati in un formato ppm e potrebbe essere necessario convertirli in un altro per una corretta visualizzazione su stackexchange.
  • I corpi funzione (esclusa la firma) devono contenere almeno 140 caratteri.
  • Questo è un concorso di popolarità - la maggior parte dei voti vince

3
Aggiunto tag C ++ perché la natura delle regole esclude altre lingue. In genere preferiamo le sfide indipendenti dalla lingua a meno che non abbiano una buona ragione per richiedere un set specifico.
algoritmo

4
Per gli elettori stretti che lo chiamano troppo ampio, prova prima a scrivere una risposta a questo. È sorprendentemente restrittivo ...
trichoplax

8
Questa è la mia cosa preferita che abbia mai visto qui in assoluto!
David Conrad,

4
Adoro che questa domanda sembri una scena demo di vecchia scuola.
mskfisher,

23
Questo tipo di domanda incoraggia la partecipazione al golf del codice . In genere non sono incline a rispondere a una domanda sul golf in quanto non sono sicuro di fare bene. Con questo tipo di domanda il limite di byte mi fa provare una risposta semplice, apprendere le tecniche di golf lungo la strada e quindi usarle per rendere le risposte più complesse. È come un trampolino di lancio per rispondere alle domande sul golf. Penso che potrebbe essere la chiave per
coinvolgere

Risposte:


120

Mandelbrot 3 x 133 caratteri

La prima cosa che mi è venuta in mente è stata "Mandelbrot!".

Sì, lo so che esiste già una presentazione mandelbrot. Dopo aver confermato che sono in grado di portarlo al di sotto di 140 caratteri, ho preso i trucchi e le ottimizzazioni da quella soluzione nella mia (grazie Martin e Todd). Ciò ha lasciato spazio per scegliere una posizione e uno zoom interessanti, oltre a un bel tema cromatico:

mandelbrot

unsigned char RD(int i,int j){
   double a=0,b=0,c,d,n=0;
   while((c=a*a)+(d=b*b)<4&&n++<880)
   {b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;}
   return 255*pow((n-80)/800,3.);
}
unsigned char GR(int i,int j){
   double a=0,b=0,c,d,n=0;
   while((c=a*a)+(d=b*b)<4&&n++<880)
   {b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;}
   return 255*pow((n-80)/800,.7);
}
unsigned char BL(int i,int j){
   double a=0,b=0,c,d,n=0;
   while((c=a*a)+(d=b*b)<4&&n++<880)
   {b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;}
   return 255*pow((n-80)/800,.5);
}

132 caratteri in totale

Ho provato a farlo scendere a 140 per tutti e 3 i canali. C'è un po 'di rumore cromatico vicino al bordo e la posizione non è interessante come la prima, ma: 132 caratteri

mandelbrot ridotto

unsigned char RD(int i,int j){
  double a=0,b=0,d,n=0;
  for(;a*a+(d=b*b)<4&&n++<8192;b=2*a*b+j/5e4+.06,a=a*a-d+i/5e4+.34);
  return n/4;
}
unsigned char GR(int i,int j){
  return 2*RD(i,j);
}
unsigned char BL(int i,int j){
  return 4*RD(i,j);
}

8
Quei colori sono stupendi!
Martin Ender,

Adoro questa, l'immagine più bella di sempre!
Roy van Rijn,

4
Questo è il mio sfondo adesso.
Cipher

209

Tovaglie

Piatto

Ho iniziato mettendo in prospettiva un motivo a quadri / a quadretti come una tovaglia senza confini:

unsigned char RD(int i,int j){
    float s=3./(j+99);
    return (int((i+DIM)*s+j*s)%2+int((DIM*2-i)*s+j*s)%2)*127;
}
unsigned char GR(int i,int j){
    float s=3./(j+99);
    return (int((i+DIM)*s+j*s)%2+int((DIM*2-i)*s+j*s)%2)*127;
}
unsigned char BL(int i,int j){
    float s=3./(j+99);
    return (int((i+DIM)*s+j*s)%2+int((DIM*2-i)*s+j*s)%2)*127;
}

tovaglia piatta

Ondulazione

Poi ho introdotto un'increspatura (prospettiva non strettamente corretta, ma comunque in 140 caratteri):

unsigned char RD(int i,int j){
    float s=3./(j+99);
    float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;
    return (int((i+DIM)*s+y)%2+int((DIM*2-i)*s+y)%2)*127;
}
unsigned char GR(int i,int j){
    float s=3./(j+99);
    float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;
    return (int((i+DIM)*s+y)%2+int((DIM*2-i)*s+y)%2)*127;
}
unsigned char BL(int i,int j){
    float s=3./(j+99);
    float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;
    return (int((i+DIM)*s+y)%2+int((DIM*2-i)*s+y)%2)*127;
}

tovaglia increspata

Colore

Quindi ho reso alcuni dei colori a grana più fine per dare dettagli su una gamma più ampia di scale e per rendere l'immagine più colorata ...

unsigned char RD(int i,int j){
    float s=3./(j+99);
    float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;
    return (int((i+DIM)*s+y)%2+int((DIM*2-i)*s+y)%2)*127;
}
unsigned char GR(int i,int j){
    float s=3./(j+99);
    float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;
    return (int(5*((i+DIM)*s+y))%2+int(5*((DIM*2-i)*s+y))%2)*127;
}
unsigned char BL(int i,int j){
    float s=3./(j+99);
    float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;
    return (int(29*((i+DIM)*s+y))%2+int(29*((DIM*2-i)*s+y))%2)*127;
}

tovaglia colorata

In movimento

Ridurre leggermente il codice consente di definire una fase d'onda P con 2 posizioni decimali, che è appena sufficiente per i frame abbastanza vicini per un'animazione fluida. Ho ridotto l'ampiezza in questa fase per evitare di indurre il mal di mare e ho spostato l'intera immagine di altri 151 pixel (al costo di 1 carattere extra) per spingere l'aliasing dalla parte superiore dell'immagine. L'aliasing animato è affascinante.

unsigned char RD(int i,int j){
#define P 6.03
float s=3./(j+250),y=(j+sin((i*i+_sq(j-700)*5)/100./DIM+P)*15)*s;return (int((i+DIM)*s+y)%2+int((DIM*2-i)*s+y)%2)*127;}

unsigned char GR(int i,int j){
float s=3./(j+250);
float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM+P)*15)*s;
return (int(5*((i+DIM)*s+y))%2+int(5*((DIM*2-i)*s+y))%2)*127;}

unsigned char BL(int i,int j){
float s=3./(j+250);
float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM+P)*15)*s;
return (int(29*((i+DIM)*s+y))%2+int(29*((DIM*2-i)*s+y))%2)*127;}

tovaglia animata


15
Questo è leggendario. (Y) Continuate così. : P
Mohammad Areeb Siddiqui,

Ma come viene implementato esattamente il movimento? Nel framework originale non esiste una logica di cambio frame, vero?
esteewhy

2
@esteeperché è possibile produrre solo immagini fisse. La GIF mostra una sequenza di fotogrammi fissi, ognuno dei quali è stato prodotto modificando il valore dopo #define P. Ha richiesto il golf verso il basso per consentire i personaggi aggiuntivi per #define P 6.03.
trichoplax,

4
FERMARE! Vuoi davvero votare la risposta migliore? Ci sono alcuni molto più interessanti se scorri le due pagine successive.
trichoplax,

1
Consiglio di ordinare le risposte per "più vecchio" e quindi puoi vedere come si sono sviluppati nuovi approcci man mano che arrivavano nuove risposte.
trichoplax,

192

Pittore casuale

inserisci qui la descrizione dell'immagine

char red_fn(int i,int j){
#define r(n)(rand()%n)
    static char c[1024][1024];return!c[i][j]?c[i][j]=!r(999)?r(256):red_fn((i+r(2))%1024,(j+r(2))%1024):c[i][j];
}
char green_fn(int i,int j){
    static char c[1024][1024];return!c[i][j]?c[i][j]=!r(999)?r(256):green_fn((i+r(2))%1024,(j+r(2))%1024):c[i][j];
}
char blue_fn(int i,int j){
    static char c[1024][1024];return!c[i][j]?c[i][j]=!r(999)?r(256):blue_fn((i+r(2))%1024,(j+r(2))%1024):c[i][j];
}

Ecco una voce basata sulla casualità. Per circa lo 0,1% dei pixel sceglie un colore casuale, per gli altri utilizza lo stesso colore di un pixel adiacente casuale. Si noti che ogni colore lo fa in modo indipendente, quindi in realtà è solo una sovrapposizione di un'immagine verde, blu e rossa a caso. Per ottenere risultati diversi su corse diverse, è necessario aggiungere srand(time(NULL))alla mainfunzione.

Ora per alcune varianti.

Saltando i pixel possiamo renderlo un po 'più sfocato.

inserisci qui la descrizione dell'immagine

E poi possiamo cambiare lentamente i colori, dove gli overflow provocano bruschi cambiamenti che rendono questo aspetto ancora più simile a tratti di pennello

inserisci qui la descrizione dell'immagine

Cose che devo capire:

  • Per qualche motivo non riesco a mettere sranddentro quelle funzioni senza ottenere un segfault.
  • Se potessi fare le passeggiate casuali su tutti e tre i colori, potrebbe apparire un po 'più ordinato.

Puoi anche rendere la camminata casuale isotropica, come

static char c[1024][1024];return!c[i][j]?c[i][j]=r(999)?red_fn((i+r(5)+1022)%1024,(j+r(5)+1022)%1024):r(256):c[i][j];

per darti

inserisci qui la descrizione dell'immagine

Più dipinti casuali

Ci ho giocato un po 'di più e ho creato altri dipinti casuali. Non tutti questi sono possibili entro i limiti di questa sfida, quindi non voglio includerli qui. Ma puoi vederli in questa galleria imgur insieme ad alcune descrizioni di come li ho prodotti.

Sono tentato di sviluppare tutte queste possibilità in un framework e metterlo su GitHub. (Non che cose del genere non esistano già, ma è comunque divertente!)


12
Adoro questi. Non mi ero reso conto che sarebbe stato possibile prendere in considerazione i pixel adiacenti senza avere accesso ai dati dei pixel - lavoro regolare!
trichoplax,

1
Mi ricorda molto questo vecchio concorso in cui le regole dovevano mettere un pixel di ogni colore nell'immagine.
Internet è fatto di Catz il

2
Wow! Queste immagini sono assolutamente belle!
raptortech97,

1
Bella galleria, quelle radiali sono pulite.
Internet è fatto di Catz il

2
Vedo Reptar : ultima immagine nel post (quella isotropica), quadrante in alto a destra.
Tim Pederick,

162

Alcune cose a punta swirly

Sì, sapevo esattamente come chiamarlo.

Alcune cose a punta swirly

unsigned short RD(int i,int j){
    return(sqrt(_sq(73.-i)+_sq(609-j))+1)/(sqrt(abs(sin((sqrt(_sq(860.-i)+_sq(162-j)))/115.0)))+1)/200;
}
unsigned short GR(int i,int j){
    return(sqrt(_sq(160.-i)+_sq(60-j))+1)/(sqrt(abs(sin((sqrt(_sq(86.-i)+_sq(860-j)))/115.0)))+1)/200;
}
unsigned short BL(int i,int j){
    return(sqrt(_sq(844.-i)+_sq(200-j))+1)/(sqrt(abs(sin((sqrt(_sq(250.-i)+_sq(20-j)))/115.0)))+1)/200;
}

EDIT: non utilizza più pow. EDIT 2: @PhiNotPi ha sottolineato che non ho bisogno di usare gli addominali tanto.

È possibile modificare i punti di riferimento abbastanza facilmente per ottenere un'immagine diversa:

Alcune cose più appuntite

unsigned short RD(int i,int j){
    return(sqrt(_sq(148.-i)+_sq(1000-j))+1)/(sqrt(abs(sin((sqrt(_sq(500.-i)+_sq(400-j)))/115.0)))+1)/200;
}
unsigned short GR(int i,int j){
    return(sqrt(_sq(610.-i)+_sq(60-j))+1)/(sqrt(abs(sin((sqrt(_sq(864.-i)+_sq(860-j)))/115.0)))+1)/200;
}
unsigned short BL(int i,int j){
    return(sqrt(_sq(180.-i)+_sq(100-j))+1)/(sqrt(abs(sin((sqrt(_sq(503.-i)+_sq(103-j)))/115.0)))+1)/200;
}

@EricTressler ha sottolineato che le mie foto contengono Batman.

Batman


1
@JayKominek Non saprei, non ero in giro allora d:
cjfaure


1
@cjfaure oh wow! grazie! sembra che la versione finale della descrizione sia su: web.archive.org/web/20031205062033/http://www.blorf.com/~mrad/… e il codice sia stato spostato su sourceforge. aggiornato anche l'anno scorso! sourceforge.net/projects/libswirlies
Jay Kominek il

1
Uno dei miei preferiti!
Hobby di Calvin il

1
Questo è carino - ma non riesco a riprodurlo affatto! Il più vicino che posso ottenere è quando il PPM viene generato in modo improprio (LSB invece di MSB) e anche allora sembra solo una varietà di cerchi alfa di colore diverso.
DreamWarrior,

123

Certo, ci deve essere una richiesta di Mandelbrot.

inserisci qui la descrizione dell'immagine

char red_fn(int i,int j){
    float x=0,y=0;int k;for(k=0;k++<256;){float a=x*x-y*y+(i-768.0)/512;y=2*x*y+(j-512.0)/512;x=a;if(x*x+y*y>4)break;}return k>31?256:k*8;
}
char green_fn(int i,int j){
    float x=0,y=0;int k;for(k=0;k++<256;){float a=x*x-y*y+(i-768.0)/512;y=2*x*y+(j-512.0)/512;x=a;if(x*x+y*y>4)break;}return k>63?256:k*4;
}
char blue_fn(int i,int j){
    float x=0,y=0;int k;for(k=0;k++<256;){float a=x*x-y*y+(i-768.0)/512;y=2*x*y+(j-512.0)/512;x=a;if(x*x+y*y>4)break;}return k;
}

Prova a migliorare la combinazione di colori ora. È imbarazzante se definisco il calcolo come è una macro red_fne uso quella macro negli altri due, quindi ho più caratteri per la selezione di colori fantasia in verde e blu?

Modifica: è davvero difficile trovare combinazioni di colori decenti con questi pochi byte rimanenti. Ecco un'altra versione:

/* RED   */ return log(k)*47;
/* GREEN */ return log(k)*47;
/* BLUE  */ return 128-log(k)*23;

inserisci qui la descrizione dell'immagine

E come suggerito dai githubphagocyte e con i miglioramenti di Todd Lehman, possiamo facilmente selezionare sezioni più piccole:

Per esempio

char red_fn(int i,int j){
    float x=0,y=0,k=0,X,Y;while(k++<256e2&&(X=x*x)+(Y=y*y)<4)y=2*x*y+(j-89500)/102400.,x=X-Y+(i-14680)/102400.;return log(k)/10.15*256;
}
char green_fn(int i,int j){
    float x=0,y=0,k=0,X,Y;while(k++<256e2&&(X=x*x)+(Y=y*y)<4)y=2*x*y+(j-89500)/102400.,x=X-Y+(i-14680)/102400.;return log(k)/10.15*256;
}
char blue_fn(int i,int j){
    float x=0,y=0,k=0,X,Y;while(k++<256e2&&(X=x*x)+(Y=y*y)<4)y=2*x*y+(j-89500)/102400.,x=X-Y+(i-14680)/102400.;return 128-k/200;
}

inserisci qui la descrizione dell'immagine


12
@tomsmeding Devo confessare, questa è la prima volta che implemento il set Mandelbrot.
Martin Ender,

2
Per quanto iconico sia il set completo di Mandelbrot (+1, a proposito!), Sembra che ti sia lasciato abbastanza spazio per regolare i parametri e pubblicare una risposta con alcuni dei dettagli incredibilmente contorti di uno zoom profondo.
trichoplax,

1
@githubphagocyte Ci avevo già pensato, ma non potevo ancora preoccuparmi di ricompilare, rieseguire e convertire ogni volta fino a quando non avessi capito parametri decenti;). Potrebbe farlo più tardi. Per prima cosa devo provare una funzione completamente diversa. ;)
Martin Ender il

2
@githubphagocyte è finalmente riuscito ad aggiungerlo. grazie per il suggerimento!
Martin Ender,

2
Grazie @Todd, ho aggiornato l'immagine finale con quello. Ho usato 25600 iterazioni, troppo a lungo. ;)
Martin Ender il

110

Julia imposta

Se c'è un Mandelbrot, dovrebbe esserci anche un set di Julia.

inserisci qui la descrizione dell'immagine

Puoi passare ore a modificare i parametri e le funzioni, quindi è veloce e sembra decente.

Ispirato dalla partecipazione di Martin.

unsigned short red_fn(int i, int j){
#define D(x) (x-DIM/2.)/(DIM/2.)
float x=D(i),y=D(j),X,Y,n=0;while(n++<200&&(X=x*x)+(Y=y*y)<4){x=X-Y+.36237;y=2*x*y+.32;}return log(n)*256;}

unsigned short green_fn(int i, int j){
float x=D(i),y=D(j),X,Y,n=0;while(n++<200&&(x*x+y*y)<4){X=x;Y=y;x=X*X-Y*Y+-.7;y=2*X*Y+.27015;}return log(n)*128;}

unsigned short blue_fn(int i, int j){
float x=D(i),y=D(j),X,Y,n=0;while(n++<600&&(x*x+y*y)<4){X=x;Y=y;x=X*X-Y*Y+.36237;y=2*X*Y+.32;}return log(n)*128;}

Vuoi un po 'di RNG?

OK, il commento di Sparr mi ha messo in pista per randomizzare i parametri di questa piccola Julias. Per prima cosa ho provato a fare hacking a livello di bit con il risultato di, time(0)ma C ++ non consente letterali esadecimali in virgola mobile quindi questo è stato un vicolo cieco (almeno con le mie conoscenze limitate). Avrei potuto usare un casting pesante per raggiungerlo, ma ciò non si sarebbe adattato ai 140 byte.

Non mi era rimasto molto spazio, quindi ho dovuto rilasciare la Julia rossa per mettere le mie macro e avere un RNG più convenzionale ( timed seed e real rand(), woohoo!).

inserisci qui la descrizione dell'immagine

Spiacenti, manca qualcosa. Ovviamente, questi parametri devono essere statici altrimenti si ottengono risultati strani (ma divertente, forse indagherò un po 'più tardi se trovo qualcosa di interessante).

Quindi eccoci qui, con solo i canali verde e blu:

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Ora aggiungiamo un semplice motivo rosso per riempire il vuoto. Non molto fantasioso, ma non sono un programmatore grafico ... ancora :-)

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

E infine il nuovo codice con parametri casuali:

unsigned short red_fn(int i, int j){
static int n=1;if(n){--n;srand(time(0));}
#define R rand()/16384.-1
#define S static float r=R,k=R;float
return _cb(i^j);}

unsigned short green_fn(int i, int j){
#define D(x) (x-DIM/2.)/(DIM/2.),
S x=D(i)y=D(j)X,Y;int n=0;while(n++<200&&(X=x)*x+(Y=y)*y<4){x=X*X-Y*Y+r;y=2*X*Y+k;}return log(n)*512;}

unsigned short blue_fn(int i, int j){
S x=D(i)y=D(j)X,Y;int n=0;while(n++<200&&(X=x)*x+(Y=y)*y<4){x=X*X-Y*Y+r;y=2*X*Y+k;}return log(n)*512;}

C'è ancora spazio ora ...


hai spazio per randomizzare i parametri ogni corsa con srand (time (0) e rand ()? o solo time (0)?
Sparr

2
Quest'ultimo sta andando sul mio muro.
cjfaure,

@Sparr aggiornato con il tuo suggerimento. Mi sono divertito un po ':-).
Internet è fatto di Catz il

4
Non so cosa piaccia di più: la tua risposta o il tuo nome utente
William Barbosa,

107

Questo è interessante perché non usa affatto i parametri i, j. Invece ricorda lo stato in una variabile statica.

unsigned char RD(int i,int j){
   static double k;k+=rand()/1./RAND_MAX;int l=k;l%=512;return l>255?511-l:l;
}
unsigned char GR(int i,int j){
   static double k;k+=rand()/1./RAND_MAX;int l=k;l%=512;return l>255?511-l:l;
}
unsigned char BL(int i,int j){
   static double k;k+=rand()/1./RAND_MAX;int l=k;l%=512;return l>255?511-l:l;
}

colorato


Sarebbe interessante vedere i risultati di questo codice su diverse piattaforme / compilatori. Il valore di RAND_MAX varia ampiamente e potrebbe dare immagini completamente diverse ...
trichoplax

5
Non dovrebbe cambiare molto. (double) rand () / RAND_MAX dovrebbe essere sempre compreso nell'intervallo [0.0, 1.0].
Manuel Kasten,

2
Questo è uno dei miei preferiti!
Hobby di Calvin il

2
Non è solo interessante - è bello!
Martin Thoma,

104

Immagine

/* RED */
    int a=(j?i%j:i)*4;int b=i-32;int c=j-32;return _sq(abs(i-512))+_sq(abs(j-512))>_sq(384)?a:int(sqrt((b+c)/2))^_cb((b-c)*2);
/* GREEN */
    int a=(j?i%j:i)*4;return _sq(abs(i-512))+_sq(abs(j-512))>_sq(384)?a:int(sqrt((i+j)/2))^_cb((i-j)*2);
/* BLUE */
    int a=(j?i%j:i)*4;int b=i+32;int c=j+32;return _sq(abs(i-512))+_sq(abs(j-512))>_sq(384)?a:int(sqrt((b+c)/2))^_cb((b-c)*2);

3
È davvero bellissimo, +1.
Milo,

3
Questo è il mio preferito. Sembra un pezzo di design grafico realizzato professionalmente. : D
cjfaure,

4
Sembra un wafer di microprocessori. macrophotographer.net/images/ss_rvsi_5.jpg
s0rce

Sembra uno sfondo minimalista .
AL

1

82

Buddhabrot (+ Antibuddhabrot)

Modifica: ora è un Buddhabrot vero!

Modifica: sono riuscito a limitare l'intensità del colore entro il limite di byte, quindi non ci sono più pixel falsamente neri a causa dell'overflow.

Volevo davvero smettere dopo le quattro ... ma ...

inserisci qui la descrizione dell'immagine

Questo viene leggermente compresso durante il caricamento (e ridotto al momento dell'incorporamento), quindi se vuoi ammirare tutti i dettagli, ecco l'interessante 512x512 ritagliato (che non viene compresso e viene visualizzato a dimensioni intere):

inserisci qui la descrizione dell'immagine

Grazie a githubphagocyte per l'idea. Ciò ha richiesto un abuso piuttosto complicato di tutte e tre le funzioni di colore:

unsigned short RD(int i,int j){
    #define f(a,b)for(a=0;++a<b;)
    #define D float x=0,y=0
    static int z,m,n;if(!z){z=1;f(m,4096)f(n,4096)BL(m-4096,n-4096);};return GR(i,j);
}
unsigned short GR(int i,int j){
    #define R a=x*x-y*y+i/1024.+2;y=2*x*y+j/1024.+2
    static float c[DIM][DIM],p;if(i>=0)return(p=c[i][j])>DM1?DM1:p;c[j+DIM][i/2+DIM]+=i%2*2+1;
}
unsigned short BL(int i,int j){
    D,a,k,p=0;if(i<0)f(k,5e5){R;x=a;if(x*x>4||y*y>4)break;GR(int((x-2)*256)*2-p,(y-2)*256);if(!p&&k==5e5-1){x=y=k=0;p=1;}}else{return GR(i,j);}
}

Sono rimasti alcuni byte per una migliore combinazione di colori, ma finora non ho trovato nulla che superi l'immagine della scala dei grigi.

Il codice fornito usa 4096x4096 punti di partenza e fa fino a 500.000 iterazioni su ciascuno di essi per determinare se le traiettorie sfuggono o meno. Ci sono volute tra le 6 e le 7 ore sulla mia macchina. Puoi ottenere risultati decenti con una griglia 2k per 2k e iterazioni 10k, che richiede due minuti, e anche solo una griglia 1k per 1k con iterazioni 1k sembra abbastanza bella (richiede circa 3 secondi). Se vuoi giocherellare con quei parametri, ci sono alcuni posti che devono cambiare:

  • Per modificare la profondità di ricorsione di Mandelbrot, regolare entrambe le istanze di 5e5in in base BLal conteggio delle iterazioni.
  • Per modificare la risoluzione della griglia, cambia tutti e quattro 4096nella RDrisoluzione desiderata e 1024.in GRcon lo stesso fattore per mantenere il ridimensionamento corretto.
  • Probabilmente dovrai anche ridimensionare il valore return c[i][j]in GRquanto contiene solo il numero assoluto di visite di ciascun pixel. Il colore massimo sembra essere per lo più indipendente dal conteggio delle iterazioni e si ridimensiona linearmente con il numero totale di punti di partenza. Quindi, se si desidera utilizzare una griglia 1k per 1k, è possibile che si desideri return c[i][j]*16;o simili, ma quel fattore a volte ha bisogno di un po 'di armeggiamento.

Per coloro che non hanno familiarità con Buddhabrot (come me un paio di giorni fa), si basa sul calcolo di Mandelbrot, ma l'intensità di ogni pixel è la frequenza con cui quel pixel è stato visitato nelle iterazioni delle traiettorie in fuga. Se contiamo le visite durante traiettorie non in fuga, è un Antibuddhabrot. Esiste una versione ancora più sofisticata chiamata Nebulabrot in cui si utilizza una profondità di ricorsione diversa per ciascun canale di colore. Ma lo lascerò a qualcun altro. Per ulteriori informazioni, come sempre, Wikipedia .

Inizialmente, non distinguevo tra traiettorie in fuga e non in fuga. Ciò ha generato una trama che è l'unione di un Buddhabrot e un Antibuddhabrot (come sottolineato da githubphagocyte).

unsigned short RD(int i,int j){
    #define f(a)for(a=0;++a<DIM;)
    static int z;float x=0,y=0,m,n,k;if(!z){z=1;f(m)f(n)GR(m-DIM,n-DIM);};return BL(i,j);
}
unsigned short GR(int i,int j){
    float x=0,y=0,a,k;if(i<0)f(k){a=x*x-y*y+(i+256.0)/512;y=2*x*y+(j+512.0)/512;x=a;if(x*x+y*y>4)break;BL((x-.6)*512,(y-1)*512);}return BL(i,j);
}
unsigned short BL(int i,int j){
    static float c[DIM][DIM];if(i<0&&i>-DIM-1&&j<0&&j>-DIM-1)c[j+DIM][i+DIM]++;else if(i>0&&i<DIM&&j>0&&j<DIM)return log(c[i][j])*110;
}

inserisci qui la descrizione dell'immagine

Questa sembra un po 'una fotografia sbiadita ... Mi piace.


8
Lo trasformerò in un cappello.
cjfaure,

6
Sono davvero sorpreso che tu abbia ottenuto questo fino a 3 lotti di 140 byte. La nuova immagine di buddabrot è bellissima.
trichoplax,

4
Questo è davvero impressionante.
copumpkin

Il primo è davvero abile. Mi ricorda le meduse. +1
Igby Largeman,

1
Questa è la mia proposta preferita. Bel lavoro!
thomallen,

76

Pentagono Sierpinski

Potresti aver visto il metodo del gioco del caos per approssimare il Triangolo di Sierpinski tracciando punti a metà strada verso un vertice scelto casualmente. Qui ho adottato lo stesso approccio usando 5 vertici. Il codice più breve su cui potevo accontentarmi includeva la codifica rigida dei 5 vertici, e non avrei mai potuto inserire tutto in 140 caratteri. Quindi ho delegato il componente rosso a un semplice sfondo e ho usato lo spazio libero nella funzione rossa per definire una macro per portare anche le altre due funzioni sotto 140. Quindi tutto è valido al costo di non avere componenti rossi nel pentagono.

unsigned char RD(int i,int j){
#define A int x=0,y=0,p[10]={512,9,0,381,196,981,827,981,DM1,381}
auto s=99./(j+99);return GR(i,j)?0:abs(53-int((3e3-i)*s+j*s)%107);}

unsigned char GR(int i,int j){static int c[DIM][DIM];if(i+j<1){A;for(int n=0;n<2e7;n++){int v=(rand()%11+1)%5*2;x+=p[v];x/=2;y+=p[v+1];y/=2;c[x][y]++;}}return c[i][j];}

unsigned char BL(int i,int j){static int c[DIM][DIM];if(i+j<1){A;for(int n=0;n<3e7;n++){int v=(rand()%11+4)%5*2;x+=p[v];x/=2;y+=p[v+1];y/=2;c[x][y]++;}}return c[i][j];}

Grazie a Martin Büttner per l'idea menzionata nei commenti della domanda sulla definizione di una macro in una funzione per poi usarla in un'altra, e anche per l'uso della memoisation per riempire i pixel in un ordine arbitrario piuttosto che limitarsi all'ordine raster della funzione principale .

pentagono

L'immagine supera i 500 KB, quindi viene automaticamente convertita in jpg tramite scambio di stack. Questo offusca alcuni dei dettagli più fini, quindi ho anche incluso solo il quarto in alto a destra come png per mostrare l'aspetto originale:

in alto a destra


73

Spartito

Musica Sierpinski. : D I ragazzi in chat dicono che assomiglia di più alla carta perforata per i carillon.

Spartito

unsigned short RD(int i,int j){
    return ((int)(100*sin((i+400)*(j+100)/11115)))&i;
}
unsigned short GR(int i,int j){
    return RD(i,j);
}
unsigned short BL(int i,int j){
    return RD(i,j);
}

Alcuni dettagli su come funziona ... um, in realtà è solo uno zoom su un rendering di alcuni triangoli ondulati di Sierpinski. L'aspetto dello spartito (e anche il blocco) è il risultato del troncamento dei numeri interi. Se cambio la funzione rossa in, diciamo,

return ((int)(100*sin((i+400)*(j+100)/11115.0)));

il troncamento viene rimosso e otteniamo il rendering a piena risoluzione:

Spartiti non blocky

Quindi sì, è interessante.


1
È come Squarepusher trascritto in neume
ossifrage schizzinoso il

1
@squeamishossifrage Cosa ho appena visto ...?
cjfaure,

:-) I video di Chris Cunningham sono un po 'strani, vero?
ossifrage squeamish

14
il secondo sembra muoversi quando scorro la pagina
user13267

5
Scorrendo il sito, l'ultimo sembrava davvero muoversi. Bella illusione ottica.
Kyle Kanos,

61

Generatore di diagrammi Voronoi casuali qualcuno?

OK, questo mi ha fatto passare un brutto momento. Penso che sia piuttosto carino, anche se i risultati non sono così artistici come alcuni altri. Questo è il problema della casualità. Forse alcune immagini intermedie sembrano migliori, ma volevo davvero avere un algoritmo completamente funzionante con diagrammi voronoi.

inserisci qui la descrizione dell'immagine

Modificare:

inserisci qui la descrizione dell'immagine

Questo è un esempio dell'algoritmo finale. L'immagine è fondamentalmente la sovrapposizione di tre diagrammi voronoi, uno per ogni componente di colore (rosso, verde, blu).

Codice

alla fine non commentato, versione commentata

unsigned short red_fn(int i, int j){
int t[64],k=0,l,e,d=2e7;srand(time(0));while(k<64){t[k]=rand()%DIM;if((e=_sq(i-t[k])+_sq(j-t[42&k++]))<d)d=e,l=k;}return t[l];
}

unsigned short green_fn(int i, int j){
static int t[64];int k=0,l,e,d=2e7;while(k<64){if(!t[k])t[k]=rand()%DIM;if((e=_sq(i-t[k])+_sq(j-t[42&k++]))<d)d=e,l=k;}return t[l];
}

unsigned short blue_fn(int i, int j){
static int t[64];int k=0,l,e,d=2e7;while(k<64){if(!t[k])t[k]=rand()%DIM;if((e=_sq(i-t[k])+_sq(j-t[42&k++]))<d)d=e,l=k;}return t[l];
}

Mi ci sono voluti molti sforzi, quindi ho voglia di condividere i risultati in diverse fasi e ce ne sono di carini (errati) da mostrare.

Primo passo: posiziona alcuni punti in modo casuale, con x=y

inserisci qui la descrizione dell'immagine

L'ho convertito in jpeg perché il png originale era troppo pesante per upload ( >2MB), scommetto che è molto più di 50 sfumature di grigio!

Secondo: avere una coordinata y migliore

Non potevo permettermi di avere un'altra tabella di coordinate generata casualmente per l' yasse, quindi avevo bisogno di un modo semplice per ottenere quelle " casuali " nel minor numero di caratteri possibile. Sono andato per usare le xcoordinate di un altro punto nella tabella, facendo un bit ANDper bit sull'indice del punto.

inserisci qui la descrizione dell'immagine

3 °: non ricordo ma sta diventando bello

Ma in quel momento avevo oltre 140 caratteri, quindi avevo bisogno di giocarci un po '.

inserisci qui la descrizione dell'immagine

4 °: scanline

Sto solo scherzando, questo non è voluto ma un po 'bello, penso.

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Continuando a ridurre le dimensioni dell'algoritmo, sono orgoglioso di presentare:

Edizione StarFox

inserisci qui la descrizione dell'immagine

Voronoi instagram

inserisci qui la descrizione dell'immagine

5 °: aumentare il numero di punti

Ora ho un pezzo di codice funzionante, quindi passiamo da 25 a 60 punti. inserisci qui la descrizione dell'immagine

È difficile da vedere da una sola immagine, ma i punti si trovano quasi tutti nello stesso yintervallo. Certo, non ho modificato l'operazione bit a bit, &42è molto meglio:

inserisci qui la descrizione dell'immagine

Ed eccoci, allo stesso punto della prima immagine di questo post. Spieghiamo ora il codice per quelli rari che sarebbero interessati.

Codice non modificato e spiegato

unsigned short red_fn(int i, int j)
{
    int t[64],          // table of 64 points's x coordinate
        k = 0,          // used for loops
        l,              // retains the index of the nearest point
        e,              // for intermediary results
        d = 2e7;        // d is the minimum distance to the (i,j) pixel encoutnered so far
        // it is initially set to 2e7=2'000'000 to be greater than the maximum distance 1024²

    srand(time(0));     // seed for random based on time of run
    // if the run overlaps two seconds, a split will be observed on the red diagram but that is
    // the better compromise I found

    while(k < 64)       // for every point
    {
        t[k] = rand() % DIM;        // assign it a random x coordinate in [0, 1023] range
        // this is done at each call unfortunately because static keyword and srand(...)
        // were mutually exclusive, lenght-wise

        if (
            (e=                         // assign the distance between pixel (i,j) and point of index k
                _sq(i - t[k])           // first part of the euclidian distance
                +
                _sq(j - t[42 & k++])    // second part, but this is the trick to have "" random "" y coordinates
                // instead of having another table to generate and look at, this uses the x coordinate of another point
                // 42 is 101010 in binary, which is a better pattern to apply a & on; it doesn't use all the table
                // I could have used 42^k to have a bijection k <-> 42^k but this creates a very visible pattern splitting the image at the diagonal
                // this also post-increments k for the while loop
            ) < d                       // chekcs if the distance we just calculated is lower than the minimal one we knew
        )
        // {                            // if that is the case
            d=e,                        // update the minimal distance
            l=k;                        // retain the index of the point for this distance
            // the comma ',' here is a trick to have multiple expressions in a single statement
            // and therefore avoiding the curly braces for the if
        // }
    }

    return t[l];        // finally, return the x coordinate of the nearest point
    // wait, what ? well, the different areas around points need to have a
    // "" random "" color too, and this does the trick without adding any variables
}

// The general idea is the same so I will only comment the differences from green_fn
unsigned short green_fn(int i, int j)
{
    static int t[64];       // we don't need to bother a srand() call, so we can have these points
    // static and generate their coordinates only once without adding too much characters
    // in C++, objects with static storage are initialized to 0
    // the table is therefore filled with 60 zeros
    // see http://stackoverflow.com/a/201116/1119972

    int k = 0, l, e, d = 2e7;

    while(k<64)
    {
        if( !t[k] )                 // this checks if the value at index k is equal to 0 or not
        // the negation of 0 will cast to true, and any other number to false
            t[k] = rand() % DIM;    // assign it a random x coordinate

        // the following is identical to red_fn
        if((e=_sq(i-t[k])+_sq(j-t[42&k++]))<d)
            d=e,l=k;
    }

    return t[l];
}

Grazie per aver letto finora.


1
Adoro i diagrammi di Voronoi. +1 per adattarlo a 3 tweet!
Martin Ender,

1
Questo è uno dei miei favoriti. Le varianti della linea di scansione sono esteticamente gradevoli.
Fraxtil,

1
Adoro come hai spiegato il codice
Andrea

Fare un tonneau con l'aereo!
Starson Hochschild,

la seconda foto in quarta: scanlines è bellissima.
Khaled.K,

57

Il frattale di Lyapunov

Frattale di Lyapunov

La stringa utilizzata per generare questo era AABAB e lo spazio dei parametri era [2,4] x [2,4]. ( spiegazione della stringa e dello spazio dei parametri qui )

Con uno spazio di codice limitato, ho pensato che questa colorazione fosse piuttosto bella.

    //RED
    float r,s=0,x=.5;for(int k=0;k++<50;)r=k%5==2||k%5==4?(2.*j)/DIM+2:(2.*i)/DIM+2,x*=r*(1-x),s+=log(fabs(r-r*2*x));return abs(s);
    //GREEN
    float r,s=0,x=.5;for(int k=0;k++<50;)r=k%5==2||k%5==4?(2.*j)/DIM+2:(2.*i)/DIM+2,x*=r*(1-x),s+=log(fabs(r-r*2*x));return s>0?s:0;
    //BLUE
    float r,s=0,x=.5;for(int k=0;k++<50;)r=k%5==2||k%5==4?(2.*j)/DIM+2:(2.*i)/DIM+2,x*=r*(1-x),s+=log(fabs(r-r*2*x));return abs(s*x);

Ho anche fatto una variante del set Mandelbrot. Usa una mappa simile alla mappa del set di Mandelbrot. Di 'M (x, y) è la mappa di Mandelbrot. Quindi M (sin (x), cos (y)) è la mappa che uso, e invece di controllare i valori di escape utilizzo x, y poiché sono sempre delimitati.

//RED
float x=0,y=0;for(int k=0;k++<15;){float t=_sq(sin(x))-_sq(cos(y))+(i-512.)/512;y=2*sin(x)*cos(y)+(j-512.0)/512;x=t;}return 2.5*(x*x+y*y);
//GREEN
float x=0,y=0;for(int k=0;k++<15;){float t=_sq(sin(x))-_sq(cos(y))+(i-512.)/512;y=2*sin(x)*cos(y)+(j-512.0)/512;x=t;}return 15*fabs(x);
//BLUE
float x=0,y=0;for(int k=0;k++<15;){float t=_sq(sin(x))-_sq(cos(y))+(i-512.)/512;y=2*sin(x)*cos(y)+(j-512.0)/512;x=t;}return 15*fabs(y);

inserisci qui la descrizione dell'immagine

MODIFICARE

Dopo molto dolore, ho finalmente iniziato a creare una gif della seconda immagine che si trasformava. Ecco qui:

Tempo di festa


11
Bel look psichedelico per il secondo.
Internet è fatto di Catz il

4
Questi sono pazzi ! +1
cjfaure,

10
Il frattale spaventoso fa paura Tob ༎ ຶ ෴ ༎ ຶ ༽
Tobia

1
Merda santa quel secondo è spaventoso. Amaximg quanto puoi ottenere dal semplice z = z ^ 2 + c.
tomsmeding

4
Se Edward Munch fosse solito dipingere i frattali, questo sarebbe stato l' aspetto di The Scream .
Internet è fatto di Catz il

55

Perché unicorni.

Perché unicorni

Non sono riuscito a far funzionare la versione OP con i unsigned shortvalori di colore fino a 1023, quindi fino a quando non viene risolto, ecco una versione che utilizza chare un valore di colore massimo di 255.

char red_fn(int i,int j){
    return (char)(_sq(cos(atan2(j-512,i-512)/2))*255);
}
char green_fn(int i,int j){
    return (char)(_sq(cos(atan2(j-512,i-512)/2-2*acos(-1)/3))*255);
}
char blue_fn(int i,int j){
    return (char)(_sq(cos(atan2(j-512,i-512)/2+2*acos(-1)/3))*255);
}

Mi piacerebbe vedere i canali di colore singolarmente. Quello dovrebbe essere bello.
applaude il

52

Logistic Hills

inserisci qui la descrizione dell'immagine

Le funzioni

unsigned char RD(int i,int j){    
    #define A float a=0,b,k,r,x
    #define B int e,o
    #define C(x) x>255?255:x
    #define R return
    #define D DIM
    R BL(i,j)*(D-i)/D;
}
unsigned char GR(int i,int j){      
    #define E DM1
    #define F static float
    #define G for(
    #define H r=a*1.6/D+2.4;x=1.0001*b/D
    R BL(i,j)*(D-j/2)/D;
}
unsigned char BL(int i,int j){
    F c[D][D];if(i+j<1){A;B;G;a<D;a+=0.1){G b=0;b<D;b++){H;G k=0;k<D;k++){x=r*x*(1-x);if(k>D/2){e=a;o=(E*x);c[e][o]+=0.01;}}}}}R C(c[j][i])*i/D;
}

Ungolfed

Tutte le #define devono adattarsi a BL con 140 caratteri. Ecco la versione non modificata dell'algoritmo blu, leggermente modificata:

for(double a=0;a<DIM;a+=0.1){       // Incrementing a by 1 will miss points
    for(int b=0;b<DIM;b++){         // 1024 here is arbitrary, but convenient
        double r = a*(1.6/DIM)+2.4; // This is the r in the logistic bifurcation diagram (x axis)
        double x = 1.0001*b/DIM;    // This is x in the logistic bifurcation diagram (y axis). The 1.0001 is because nice fractions can lead to pathological behavior.
        for(int k=0;k<DIM;k++){
            x = r*x*(1-x);          // Apply the logistic map to x
            // We do this DIM/2 times without recording anything, just to get x out of unstable values
            if(k>DIM/2){
                if(c[(int)a][(int)(DM1*x)]<255){
                    c[(int)a][(int)(DM1*x)]+=0.01; // x makes a mark in c[][]
                } // In the golfed code, I just always add 0.01 here, and clip c to 255
            }
        }            
    }    
}

Laddove i valori di x cadono più spesso per un dato r (valore j), la trama diventa più chiara (solitamente raffigurata come più scura).


3
Oh, stavo pensando a come farlo ieri. +1 per capirlo. In realtà la tavolozza è davvero bella com'è! :)
Martin Ender il

2
Ho rubato i trucchi sporchi da te e dai githubphagocyte, anche se mi assumo la responsabilità delle brutte #define. Soprattutto "#define G for (".
Eric Tressler il

1
sembra più un visualizzatore di parentesi di torneo
Kevin L

3
Non nella foto in alto: il vincitore muore
Eric Tressler il

1
Posso ottenere una stampa in formato poster di questo? Con 3 tweet sbiaditi in background. :-)
Andrew Cheong

50

Diffusione Limited Aggregation

Sono sempre stato affascinato dalla diffusione limitata aggregazione e dal numero di diversi modi in cui appare nel mondo reale.

Ho trovato difficile scrivere questo in soli 140 caratteri per funzione, quindi ho dovuto rendere il codice orribile (o bello, se ti piacciono cose come ++d%=4e for(n=1;n;n++)). Le tre funzioni di colore si chiamano a vicenda e definiscono le macro che possono essere utilizzate a vicenda, quindi non si legge bene, ma ogni funzione ha poco meno di 140 caratteri.

unsigned char RD(int i,int j){
#define D DIM
#define M m[(x+D+(d==0)-(d==2))%D][(y+D+(d==1)-(d==3))%D]
#define R rand()%D
#define B m[x][y]
return(i+j)?256-(BL(i,j))/2:0;}

unsigned char GR(int i,int j){
#define A static int m[D][D],e,x,y,d,c[4],f,n;if(i+j<1){for(d=D*D;d;d--){m[d%D][d/D]=d%6?0:rand()%2000?1:255;}for(n=1
return RD(i,j);}

unsigned char BL(int i,int j){A;n;n++){x=R;y=R;if(B==1){f=1;for(d=0;d<4;d++){c[d]=M;f=f<c[d]?c[d]:f;}if(f>2){B=f-1;}else{++e%=4;d=e;if(!c[e]){B=0;M=1;}}}}}return m[i][j];}

diffusione aggregazione limitata

Per visualizzare come le particelle si aggregano gradualmente, ho prodotto istantanee a intervalli regolari. Ogni frame è stato prodotto sostituendo 1 in for(n=1;n;n++)con 0, -1 << 29, -2 << 29, -3 << 29, 4 << 29, 3 << 29, 2 << 29, 1 << 29, 1. Ciò lo manteneva appena al di sotto del limite di 140 caratteri per ogni corsa.

aggregazione animata

Puoi vedere che gli aggregati che si avvicinano l'uno all'altro si privano a vicenda delle particelle e crescono più lentamente.


Modificando leggermente il codice, puoi vedere le particelle rimanenti che non si sono ancora attaccate agli aggregati. Ciò mostra le regioni più dense in cui la crescita avverrà più rapidamente e le regioni molto sparse tra gli aggregati in cui non può verificarsi più crescita a causa dell'esaurimento di tutte le particelle.

unsigned char RD(int i,int j){
#define D DIM
#define M m[(x+D+(d==0)-(d==2))%D][(y+D+(d==1)-(d==3))%D]
#define R rand()%D
#define B m[x][y]
return(i+j)?256-BL(i,j):0;}

unsigned char GR(int i,int j){
#define A static int m[D][D],e,x,y,d,c[4],f,n;if(i+j<1){for(d=D*D;d;d--){m[d%D][d/D]=d%6?0:rand()%2000?1:255;}for(n=1
return RD(i,j);}

unsigned char BL(int i,int j){A;n;n++){x=R;y=R;if(B==1){f=1;for(d=0;d<4;d++){c[d]=M;f=f<c[d]?c[d]:f;}if(f>2){B=f-1;}else{++e%=4;d=e;if(!c[e]){B=0;M=1;}}}}}return m[i][j];}

DLA con particelle visibili

Questo può essere animato come prima:

aggregazione animata con particelle


3
Molto interessante, +1.
Internet è fatto di Catz il

50

Spirale (140 esattamente)

prodotto finale

Sono 140 caratteri esattamente se non includi le intestazioni e le parentesi delle funzioni. È tutta la complessità a spirale che potrei inserire nel limite del personaggio.

unsigned char RD(int i,int j){
    return DIM-BL(2*i,2*j);
}
unsigned char GR(int i,int j){
    return BL(j,i)+128;
}
unsigned char BL(int i,int j){
    i-=512;j-=512;int d=sqrt(i*i+j*j);return d+atan2(j,i)*82+sin(_cr(d*d))*32+sin(atan2(j,i)*10)*64;
}

A poco a poco ho costruito una semplice spirale, aggiungendo modelli ai bordi della spirale e sperimentando come si potevano combinare spirali diverse per sembrare cool. Ecco una versione non golfata con commenti che spiegano cosa fa ogni pezzo. La confusione con i parametri può produrre alcuni risultati interessanti.

unsigned char RD(int i,int j){
    // *2 expand the spiral
    // DIM- reverse the gradient
    return DIM - BL(2*i, 2*j);
}
unsigned char GR(int i,int j){
    // notice swapped parameters
    // 128 changes phase of the spiral
    return BL(j,i)+128;
}
unsigned char BL(int i,int j){
    // center it
    i -= DIM / 2;
    j -= DIM / 2;

    double theta = atan2(j,i); //angle that point is from center
    double prc = theta / 3.14f / 2.0f; // percent around the circle

    int dist = sqrt(i*i + j*j); // distance from center

    // EDIT: if you change this to something like "prc * n * 256" where n
    //   is an integer, the spirals will line up for any arbitrarily sized
    //   DIM value, or if you make separate DIMX and DIMY values!
    int makeSpiral = prc * DIM / 2;

    // makes pattern on edge of the spiral
    int waves = sin(_cr(dist * dist)) * 32 + sin(theta * 10) * 64;

    return dist + makeSpiral + waves;
}

Scompigli con i parametri:

Qui, le spirali sono allineate ma hanno diversi motivi di bordo. Invece dei bordi a blocchi nell'esempio principale, questo ha bordi interamente composti da onde sin.

bordi

Qui, il gradiente è stato rimosso:

nessun gradiente

Un'animazione ( che per qualche motivo non sembra essere in loop dopo che l'ho caricata, mi dispiace. Inoltre, ho dovuto ridurla. Basta aprirla in una nuova scheda se hai perso l'animazione ):

animazione

Ed ecco l' album imgur con tutte le immagini al suo interno. Mi piacerebbe vedere se qualcuno riesce a trovare altri fantastici schemi a spirale. Inoltre, devo dire, questa è di gran lunga una delle sfide più interessanti che abbia mai visto qui. Godere!

EDIT: Ecco alcuni sfondi fatti da queste spirali con parametri alterati.

Inoltre, combinando i miei schemi di bordi a spirale con alcuni dei frattali che ho visto qui attraverso l'uso di xor / e / o operazioni, ecco una spirale finale:

spirale frattale


2
Sono fantastici! Se ti guardi intorno alle altre risposte potresti essere in grado di trovare idee per giocare a golf ancora di più se volessi più spazio. Alcune delle risposte usano #define in una funzione per definire una macro utilizzabile da tutti e 3, in modo da poter scaricare la maggior parte del calcolo in altre funzioni di colore. Martin Büttner mi ha fatto conoscere questo trucco.
trichoplax,

Grazie! Nel mio caso, per quanto posso trovare, il mio codice manca del tipo di schemi logici duplicati che trarrebbero vantaggio dalla definizione di libbra. Tuttavia, se ne vedi, ti sarei grato se me li identificassi, soprattutto visto che non uso C / C ++ ampiamente da anni.
xleviator,

Trovare sezioni duplicate sarebbe davvero di aiuto ancora di più, ma anche senza alcuna duplicazione puoi semplicemente spostare il codice da BL a RD o GN definendolo come macro in RD o GN e quindi utilizzandolo in BL. Ciò dovrebbe darti il ​​doppio dello spazio per il codice aggiuntivo.
trichoplax,

Ah! Vedo. Non mi ero nemmeno reso conto che ogni corpo di funzione aveva il limite di 140 caratteri. Suppongo che la prossima volta dovrei leggere il messaggio più attentamente. Grazie per averlo sottolineato!
xleviator,

1
Come discusso nella chat , la GIF non in loop dovrebbe essere facilmente risolvibile. Penso che valga la pena fare perché il breve pezzo di animazione che attualmente mostra sembra fantastico.
trichoplax,

47

Omaggio a un classico

V1 : ispirata da "Be happy" di DreamWarrior, questa semplice presentazione incorpora una piccola immagine pixel art in ogni canale di colore. Non ho nemmeno dovuto golf il codice!
V2 : ora con un codice considerevolmente più breve e uno spesso bordo nero che isola solo la "schermata di gioco".
V3 : astronave, proiettile, alieni danneggiati e bordo blu, oh mio! Cercare di puntare a questo , all'incirca.

// RED
#define g(I,S,W,M)j/128%8==I&W>>(j/32%4*16+i/64)%M&S[abs(i/4%16-8)-(I%2&i%64<32)]>>j/4%8&1
return g(1,"_\xB6\\\x98\0\0\0",255L<<36,64)?j:0;

// GREEN
#define S g(6,"\xFF\xFE\xF8\xF8\xF8\xF8\xF0\x0",1L<<22,64)|i/4==104&j/24==30
return g(2,"<\xBC\xB6}\30p\0\0",4080,32)|S?j:0;

// BLUE
return g(3,"_7\xB6\xFE\x5E\34\0",0x70000000FD0,64)|S|abs(i/4-128)==80&abs(j/4-128)<96|abs(j/4-128)==96&abs(i/4-128)<80?j:0;

Invasori spaziali


Mi è capitato di imbattermi in una modifica di Umber Ferrule il cui avatar mi ha ispirato ad aggiungere un'altra voce basata su pixel art. Poiché l'idea centrale del codice è in gran parte simile a quella di Space Invaders, la sto aggiungendo a questa voce, sebbene i due abbiano sicuramente avuto diversi punti di sfida. Per questo, ottenere il rosa giusto (a spese del bianco) e il fatto che sia uno sprite piuttosto grande ha dimostrato belle sfide. Le fughe esadecimali ( \xFFecc.) Nel canale rosso rappresentano i caratteri corrispondenti nel file di origine (ovvero, il canale rosso nel file di origine contiene dati binari), mentre le fughe ottali sono letterali (cioè presenti nel file di origine).

// RED
#define g(S)(S[i/29%18*2+j/29/8%2]>>j/29%8&1)*DM1*(abs(i-512)<247&abs(j-464)<232)
return g("\xF3\xF2\xF2\x10\xF4\0\xF2\x10\xE1\xE0\x81\0\x80\0\x80\0\0\0\0\0@\0! \x03d8,=\x2C\x99\x84\xC3\x82\xE1\xE3");

// GREEN
return g(";\376z\34\377\374\372\30k\360\3\200\0\0\0\0\0\0\200\0\300\0\341 \373d\307\354\303\374e\374;\376;\377")? DM1 : BL(i,j)? DM1/2 : 0;

// BLUE
return g("\363\360\362\20\364\0\362\20\341\340\200\0\200\0\200\0\0\0\0\0\0\0\0\0\0\08\0<\0\230\0\300\0\341\340") / 2;

Bub (Bubble Bobble)


3
Amo questo. Tanto spazio anche per aggiungere funzionalità extra ...
trichoplax

1
Sì, ci sono molti trucchi da tirare per ridurre le dimensioni. Potrei provare a estenderlo domani.
FireFly

Questo è incredibilmente breve ora. Potresti adattare uno di questi bit pattern alla trama nella tua risposta raycasting ...?
trichoplax,

@ MartinBüttner oops, hai ragione. L'ho risolto e ho fatto un altro aggiornamento delle funzioni.
FireFly,

Bene, mi piace come hai scattato la grafica 8x8 pixel e "ridimensionata" al volo. Tuttavia, ho dovuto apportare alcune modifiche e non riesco ancora a ottenere esattamente la tua immagine. Ho cambiato 1L e 255L in 1LL e 255LL. Da quando lo ha reso migliore, suppongo che probabilmente stai compilando in modalità 64 bit e ci sono alcuni problemi di larghezza di bit che rendono il resto della mia immagine sbagliato. Ma, comunque, bel lavoro!
DreamWarrior l'

44

Pittura di azione

Volevo provare a ricreare qualcosa di simile al lavoro di Jackson Pollock : gocciolare e versare la vernice su una tela orizzontale. Anche se i risultati mi sono piaciuti, il codice era troppo lungo per pubblicare questa domanda e i miei migliori sforzi lo hanno ancora ridotto a circa 600 byte. Quindi il codice pubblicato qui (che ha funzioni di 139 byte, 140 byte e 140 byte rispettivamente) è stato prodotto con un enorme aiuto da parte di alcuni dei geni della chat . Enorme grazie a:

per una implacabile sessione di golf di gruppo.

unsigned char RD(int i,int j){
#define E(q)return i+j?T-((T-BL(i,j))*q):T;
#define T 255
#define R .1*(rand()%11)
#define M(v)(v>0&v<DIM)*int(v)
#define J [j]*250;
E(21)}

unsigned char GR(int i,int j){
#define S DIM][DIM],n=1e3,r,a,s,c,x,y,d=.1,e,f;for(;i+j<1&&n--;x=R*DM1,y=R*DM1,s=R*R*R*R,a=R*7,r=s*T)for(c=R;r>1;x+=s*cos(a),y+=s*sin
E(21)}

unsigned char BL(int i,int j){static float m[S(a),d=rand()%39?d:-d,a+=d*R,s*=1+R/99,r*=.998)for(e=-r;e++<r;)for(f=-r;f++<r;)m[M(x+e)*(e*e+f*f<r)][M(y+f)]=c;return T-m[i]J}

action painting 21, 21

La macro E (q) viene utilizzata nelle funzioni RD e GR. La modifica del valore dell'argomento cambia il modo in cui cambiano i componenti rosso e verde dei colori. La macro J termina con un numero che viene utilizzato per determinare quanto cambia il componente blu, che a sua volta influisce sui componenti rosso e verde perché sono calcolati da esso. Ho incluso alcune immagini con gli argomenti rosso e verde di E variati per mostrare la varietà di combinazioni di colori possibili. Passa il mouse sopra le immagini per i valori rosso e verde se desideri eseguirli da solo.

action painting 14, 14

action painting 63, 49

action painting 56, 42

action painting 0, 49

Tutte queste immagini possono essere visualizzate a grandezza naturale se scaricate. La dimensione del file è ridotta in quanto il colore piatto si adatta all'algoritmo di compressione PNG, quindi non è richiesta alcuna compressione con perdita per il caricamento sul sito.

Se desideri vedere immagini di varie fasi del processo di golf mentre proviamo diverse cose, puoi guardare nella chat di action painting .


7
Ho seguito questa domanda e tutte le risposte per un paio di settimane, e devo dire che questa è la prima che mi ha fatto davvero cadere la mascella. Santissima meraviglia. Voglio dire, tutte le risposte qui sono fantastiche, ma questa è una cosa che non mi sarei mai aspettato fosse possibile.
Todd Lehman,

1
@ToddLehman grazie! Questo certamente non è qualcosa di cui sarei capace da solo - lo so perché ci ho provato ...
trichoplax

2
ECCEZIONALE! Uno dei migliori in questa domanda e per me l'unico (forse tranne il vincitore) che sembra disegnato dall'uomo :)
Cyriel,

1
@cyriel grazie mille. Potresti dire che questo è stato disegnato da 5 umani ...
trichoplax,

43

Ho pensato che avrei giocato con i parametri di questo codice ... Tutto il merito va a @Manuel Kasten. Sono così fighi che non ho resistito alla pubblicazione. Caldo freddo

/* RED */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+(j)*9e-9-.645411;a=c-d+(i)*9e-9+.356888;}
return 1000*pow((n)/800,.5);
/* GREEN */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+(j)*9e-9-.645411;a=c-d+(i)*9e-9+.356888;}
return 8000*pow((n)/800,.5);
/* BLUE */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+(j)*9e-9-.645411;a=c-d+(i)*9e-9+.356888;}
return 8000*pow((n)/800,.5);

BubbleGumRupture http://i57.tinypic.com/3150eqa.png

/* RED */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+(j)*9e-9-.645411;a=c-d+(i)*9e-9+.356888;}
return 8000*pow((n)/800,.5);
/* GREEN */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+(j)*9e-9-.645411;a=c-d+(i)*9e-9+.356888;}
return 40*pow((n)/800,.5);
/* BLUE */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+(j)*9e-9-.645411;a=c-d+(i)*9e-9+.356888;}
return 10*pow((n)/800,.5);

SeussZoom http://i59.tinypic.com/am3ypi.png

/* RED */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+j*8e-8-.645411;a=c-d+i*8e-8+.356888;}
return 2000*pow((n)/800,.5);
/* GREEN */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+j*8e-8-.645411;a=c-d+i*8e-8+.356888;}
return 1000*pow((n)/800,.5);
/* BLUE */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+j*8e-8-.645411;a=c-d+i*8e-8+.356888;}
return 4000*pow((n)/800,.5);

SeussEternalForest http://i61.tinypic.com/35akv91.png

/* RED */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;}
return 2000*pow((n)/800,.5);
/* GREEN */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;}
return 1000*pow((n)/800,.5);
/* BLUE */
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;}
return 4000*pow((n)/800,.5);

3
A me sembra il dottor Seuss. Molto bello!
DLosc,

3
Haha, in realtà ho chiamato i due file inferiori Seuss1 e Sueuss2
Kyle McCormick

42

Modifica: questa è ora una risposta valida, grazie alle dichiarazioni in avanti di GRe BL.

Divertirsi con la sequenza Q di Hofstadter! Se stiamo usando la distanza radiale da un certo punto come input e output come colore inverso, otteniamo qualcosa che sembra vinile colorato.

inserisci qui la descrizione dell'immagine

La sequenza è molto simile alla sequenza di Fibonacci, ma invece di tornare indietro di 1 e 2 passi nella sequenza, prendi i due valori precedenti per determinare quanto andare indietro prima di prendere la somma. Cresce approssimativamente lineare, ma ogni tanto c'è uno scoppio di caos (a intervalli crescenti) che poi si deposita nuovamente in una sequenza quasi lineare prima del successivo scoppio:

inserisci qui la descrizione dell'immagine

Puoi vedere queste increspature nell'immagine dopo regioni che sembrano molto "piatte" a colori.

Ovviamente, usare solo un colore è noioso.

inserisci qui la descrizione dell'immagine

Ora per il codice. Ho bisogno della funzione ricorsiva per calcolare la sequenza. Per farlo uso RDogni volta che jè negativo. Sfortunatamente, ciò non lascia abbastanza caratteri per calcolare il valore del canale rosso stesso, quindi RDa sua volta chiama GRcon un offset per produrre il canale rosso.

unsigned short RD(int i,int j){
    static int h[1000];return j<0?h[i]?h[i]:h[i]=i<2?1:RD(i-RD(i-1,j),j)+RD(i-RD(i-2,j),j):GR(i+256,j+512);
}
unsigned short GR(int i,int j){
    return DIM-4*RD(sqrt((i-512)*(i-512)+(j-768)*(j-768))/2.9,-1);
}
unsigned short BL(int i,int j){
    return DIM-4*RD(sqrt((i-768)*(i-768)+(j-256)*(j-256))/2.9,-1);
}

Ovviamente, questo è praticamente l'uso più semplice possibile della sequenza e ci sono un sacco di caratteri rimasti. Sentiti libero di prenderlo in prestito e fare altre cose folli con esso!

Ecco un'altra versione in cui il confine e i colori sono determinati dalla sequenza Q. In questo caso, c'era abbastanza spazio in RDmodo che non avessi nemmeno bisogno della dichiarazione anticipata:

unsigned short RD(int i,int j){
    static int h[1024];return j<0?h[i]?h[i]:h[i]=i<2?1:RD(i-RD(i-1,j),j)+RD(i-RD(i-2,j),j):RD(2*RD(i,-1)-i+512>1023-j?i:1023-i,-1)/0.6;
}
unsigned short GR(int i,int j){
    return RD(i, j);
}
unsigned short BL(int i,int j){
    return RD(i, j);
}

inserisci qui la descrizione dell'immagine


1
Quella seconda immagine grigia è incredibile!
tomsmeding

Puoi compattarlo abbastanza per usare le funzioni r / g / b stesse ricorsivamente, con coordinate non valide per le chiamate ricorsive?
Sparr

Ho adorato l'immagine a più colori. Bella risposta!
Alex

41

Questo calcola la trasformazione di Joukowsky di un insieme di cerchi concentrici centrati su un punto leggermente sfalsato rispetto all'origine. Ho leggermente modificato le intensità nel canale blu per dare un po 'di variazione di colore.

unsigned short RD(int i,int j){
    double r=i/256.-2,s=j/256.-2,q=r*r+s*s,n=hypot(r+(.866-r/2)/q,s+(r*.866+s/2)/q),
    d=.5/log(n);if(d<0||d>1)d=1;return d*(sin(n*10)*511+512);
}
unsigned short GR(int i,int j){
    return 0;
}
unsigned short BL(int i,int j){
    double r=i/256.-2,s=j/256.-2,q=r*r+s*s;return RD(i,j)*sqrt(q/40);
}

inserisci qui la descrizione dell'immagine


39

Objective-C

Riscritto il codice C ++ in Objective-C perché non sono riuscito a compilarlo ... Ha dato gli stessi risultati di altre risposte quando è in esecuzione sul mio iPad, quindi va bene.

Ecco la mia presentazione:

Triangoli a bizzeffe

Il codice dietro è abbastanza semplice:

unsigned short red_fn(int i,int j)
{
    return j^j-i^i;
}
unsigned short green_fn(int i,int j)
{
    return (i-DIM)^2+(j-DIM)^2;
}
unsigned short blue_fn(int i,int j)
{
    return i^i-j^j;
}

È possibile ingrandire i quadrati moltiplicando ie jper 0.5, 0.25ecc. Prima che vengano elaborati.


Sei sicuro che sia lo stesso codice che hai usato? Il ^ sembra strano, perché (i ^ i) è sempre 0 (lo XOR), e il ^ 2 sembra più un quadrato che un bit XOR.
Manuel Ferreria,

1
@ManuelFerreria Con XOR, il codice viene effettivamente compilato in questo modo: x^(x-y)^y(anche questo mi ha gettato via per la prima volta). Se hai le funzionalità iOS, ecco il mio codice: gist.github.com/Jugale/28df46f87037d81d2a8f
Max Chuquimia,

38

Sierpinski Paint Splash

Volevo giocare di più con i colori, quindi ho continuato a cambiare l'altra mia risposta (quella swirly) e alla fine ho finito con questo.

Sierpinski Paint Splash

unsigned short RD(int i,int j){
    return(sqrt(_sq(abs(73.-i))+_sq(abs(609.-j)))+1.)/abs(sin((sqrt(_sq(abs(860.-i))+_sq(abs(162.-j))))/115.)+2)/(115^i&j);
}
unsigned short GR(int i,int j){
    return(sqrt(_sq(abs(160.-i))+_sq(abs(60.-j)))+1.)/abs(sin((sqrt(_sq(abs(73.-i))+_sq(abs(609.-j))))/115.)+2)/(115^i&j);
}
unsigned short BL(int i,int j){
    return(sqrt(_sq(abs(600.-i))+_sq(abs(259.-j)))+1.)/abs(sin((sqrt(_sq(abs(250.-i))+_sq(abs(20.-j))))/115.)+2)/(115^i&j);
}

Adesso è il mio avatar. : P


4
Buon lavoro. signore, buon lavoro.
EaterOfCode

37

Mi sento in dovere di presentare questa voce che chiamerò "comportamento indefinito", che illustrerà cosa fa il tuo compilatore con funzioni che dovrebbero restituire un valore ma non:

unsigned short red_fn(int i,int j){}
unsigned short green_fn(int i,int j){}
unsigned short blue_fn(int i,int j){}

Tutti i pixel neri:

tutti i pixel neri

Pixel pseudo-casuali:

pixel pseudo-casuali

E, naturalmente, una miriade di altri possibili risultati a seconda del compilatore, del computer, del gestore della memoria, ecc.


3
Che hai preso?
tomsmeding

3
Ho ottenuto il nero solido e il colore solido che sono cambiati tra le diverse esecuzioni del programma, con diversi compilatori.
Sparr

8
Il mio compilatore mi sbaglia e mi urla per non aver restituito un valore.
Pharap,

3
@Pharap non è una brutta cosa :)
Sparr

Dubito che avresti mai avuto una tale casualità come suggerisce la tua seconda foto. Un valore costante, l'indice del loop ecc. Sono molto più probabili (qualunque cosa sia memorizzata all'interno di EAX quando viene chiamata la funzione).
esempio

37

Groovy

groovy.png

Solo qualche trigonometria e strani trucchi macro.

RD:

#define I (i-512)
#define J (j-512)
#define A (sin((i+j)/64.)*cos((i-j)/64.))
return atan2(I*cos A-J*sin A,I*sin A+J*cos A)/M_PI*1024+1024;

GR:

#undef A
#define A (M_PI/3+sin((i+j)/64.)*cos((i-j)/64.))
return atan2(I*cos A-J*sin A,I*sin A+J*cos A)/M_PI*1024+1024;

BL:

#undef A
#define A (2*M_PI/3+sin((i+j)/64.)*cos((i-j)/64.))
return atan2(I*cos A-J*sin A,I*sin A+J*cos A)/M_PI*1024+1024;

EDIT: se M_PInon è consentito perché presente solo su sistemi compatibili con POSIX, può essere sostituito con il valore letterale 3.14.


1
Ho dei personaggi di riserva, acos(-1)è un buon sostituto per M_PI.
Martin Ender,

33

Non sono bravo in matematica. Sono sempre stato povero studente in classe di matematica. Così ne ho fatto uno semplice.

mathpic1.png

Ho usato il codice Javascript dell'utente1455003 modificato . E questo è il mio codice completo .

function red(x, y) {
    return (x + y) & y;
}

function green(x, y) {
    return (255 + x - y) & x;
}

function blue(x, y) {
    // looks like blue channel is useless
    return Math.pow(x, y) & y;
}

È molto breve, quindi tutte e tre le funzioni si inseriscono in un tweet.


mathpic2.png

function red(x, y) {
    return Math.cos(x & y) << 16;
}

function green(x, y) {
    return red(DIM - x, DIM - y);
}

function blue(x, y) {
    return Math.tan(x ^ y) << 8;
}

Altre funzioni molto brevi. Ho trovato questo modello di sierpinski (e qualche modello tangente) mentre scherzavo con varie funzioni matematiche. Questo è il codice completo


i&jRende solo il triangolo Sierpinski in realtà. È fantastico .
cjfaure,

Quest'ultimo è degno di nota per il profilo.
mbomb007,

32

JavaScript

var can = document.createElement('canvas');
can.width=1024;
can.height=1024;
can.style.position='fixed';
can.style.left='0px';
can.style.top='0px';
can.onclick=function(){
  document.body.removeChild(can);
};

document.body.appendChild(can);

var ctx = can.getContext('2d');
var imageData = ctx.getImageData(0,0,1024,1024);
var data = imageData.data;
var x = 0, y = 0;
for (var i = 0, len = data.length; i < len;) {
    data[i++] = red(x, y) >> 2;
    data[i++] = green(x, y) >> 2;
    data[i++] = blue(x, y) >> 2;
    data[i++] = 255;
    if (++x === 1024) x=0, y++;
}
ctx.putImageData(imageData,0,0);

function red(x,y){
if(x>600||y>560) return 1024
x+=35,y+=41
return y%124<20&&x%108<20?1024:(y+62)%124<20&&(x+54)%108<20?1024:0
}

function green(x,y){
if(x>600||y>560) return y%160<80?0:1024
x+=35,y+=41
return y%124<20&&x%108<20?1024:(y+62)%124<20&&(x+54)%108<20?1024:0
}

function blue(x,y) {
return ((x>600||y>560)&&y%160<80)?0:1024;
}

Stati Uniti d'America

Un'altra versione. i corpi funzione sono tweetabili.

function red(x,y){
c=x*y%1024
if(x>600||y>560) return c
x+=35,y+=41
return y%124<20&&x%108<20?c:(y+62)%124<20&&(x+54)%108<20?c:0
}

function green(x,y){
c=x*y%1024
if(x>600||y>560) return y%160<80?0:c
x+=35,y+=41
return y%124<20&&x%108<20?c:(y+62)%124<20&&(x+54)%108<20?c:0
}

function blue(x,y) {
return ((x>600||y>560)&&y%160<80)?0:x*y%1024;
}

inserisci qui la descrizione dell'immagine

Funzione di rendering dell'immagine rivista. draw (rgbFunctions, setCloseEvent);

function draw(F,e){
    var D=document
    var c,id,d,x,y,i,L,s=1024,b=D.getElementsByTagName('body')[0]
    c=D.createElement('canvas').getContext('2d')
    if(e)c.canvas.onclick=function(){b.removeChild(c.canvas)}
    b.appendChild(c.canvas)
    c.canvas.width=c.canvas.height=s
    G=c.getImageData(0,0,s,s)
    d=G.data
    x=y=i=0;
    for (L=d.length;i<L;){
        d[i++]=F.r(x,y)>>2
        d[i++]=F.g(x,y)>>2
        d[i++]=F.b(x,y)>>2
        d[i++]=255;
        if(++x===s)x=0,y++
    }
    c.putImageData(G,0,0)
}

Viola

var purple = {
    r: function(i,j) {
        if (j < 512) j=1024-j
        return (i % j) | i
    },
    g: function(i,j){
        if (j < 512) j = 1024 -j
        return (1024-i ^ (i %j)) % j
    },
    b: function(i,j){
        if (j < 512) j = 1024 -j
        return 1024-i | i+j %512
    }
};

draw(purple,true);

inserisci qui la descrizione dell'immagine


CHEATER! CHEATER! ; D (è una risposta valida, troppo intelligente: P Bella!)
tomsmeding

1
Hahah .. sì, lo so, quindi ho presentato uno che è più nello spirito della domanda. In realtà ho provato a creare modelli e ho pensato che mi chiedessi se potessi davvero disegnare qualcosa.
Wolfhammer,

Puoi rendere le immagini a colori poco profonde un po 'più ricche aggiungendo un po' di rumore di pellicola nei bit inferiori applicando un "| Math.random () * 256" alla fine di esse. Rende le tonalità più scure più perturbate casualmente senza alterare le alte luci. (e aumenta il numero in base alla soglia di oscurità)
Kent Fredric,

rgb randomness @ [10.728.728] i.imgur.com/ms4Cuzo.png
Kent Fredric

31

Pittore planetario

//red
static int r[DIM];int p=rand()%9-4;r[i]=i&r[i]?(r[i]+r[i-1])/2:i?r[i-1]:512;r[i]+=r[i]+p>0?p:0;return r[i]?r[i]<DIM?r[i]:DM1:0;
//green
static int r[DIM];int p=rand()%7-3;r[i]=i&r[i]?(r[i]+r[i-1])/2:i?r[i-1]:512;r[i]+=r[i]+p>0?p:0;return r[i]?r[i]<DIM?r[i]:DM1:0;
//blue
static int r[DIM];int p=rand()%15-7;r[i]=i&r[i]?(r[i]+r[i-1])/2:i?r[i-1]:512;r[i]+=r[i]+p>0?p:0;return r[i]?r[i]<DIM?r[i]:DM1:0;

Ispirato alla voce ovviamente fantastica di Martin , questa è una versione diversa. Invece di eseguire il seeding casuale di una porzione dei pixel, inizio con l'angolo in alto a sinistra come RGB (512.512.512) e da lì faccio delle passeggiate casuali su ciascun colore. Il risultato sembra qualcosa di un telescopio (imo).

Ogni pixel prende la media dei pixel sopra / a sinistra e aggiunge un po 'di casuale. Puoi giocare con la variabilità cambiando la pvariabile, ma penso che quello che sto usando sia un buon equilibrio (principalmente perché mi piace il blu, quindi più volatilità della sfocatura dà buoni risultati).

C'è una leggera distorsione negativa dalla divisione di interi durante la media. Penso che funzioni, e dia un piacevole effetto oscurante all'angolo in basso.

Naturalmente, per ottenere più di un singolo risultato, dovrai aggiungere una srand()linea alla tua funzione principale.

bande


2
Se l'immagine fosse un po 'più grande, sembrerebbe raggi di luce. o:
cjfaure il

1
@cjfaure se visualizzi l'immagine a schermo intero (scarica / fai clic con il pulsante destro del mouse e visualizza l'immagine / qualunque cosa funzioni sul tuo sistema), sarà ancora più bella con i dettagli extra.
trichoplax,

trasformalo in un cerchio circondato dal nero, e questo lo renderà un pianeta!
Khaled.K,

1
Ho tentato di avvolgere questo attorno a una sfera nel frullatore e ho reso un'animazione. Vedi qui: gfycat.com/SameAnotherDinosaur
starbeamrainbowlabs

30

Onde riflesse

unsigned char RD(int i,int j){
#define A static double w=8000,l,k,r,d,p,q,a,b,x,y;x=i;y=j;for(a=8;a+9;a--){for(b=8;b+9;b--){l=i-a*DIM-(int(a)%2?227:796);
return 0;}

unsigned char GR(int i,int j){
#define B k=j-b*DIM-(int(b)%2?417:606);r=sqrt(l*l+k*k);d=16*cos((r-w)/7)*exp(-_sq(r-w)/120);p=d*l/r;q=d*k/r;x-=p;y-=q;}}
return 0;}

unsigned char BL(int i,int j){AB
return (int(x/64)+int(y/64))%2*255;}

Un modello di scacchiera di base distorto in base alla posizione di un'onda che si espande da un punto come una pietra caduta in uno stagno (molto lontano dall'essere fisicamente accurato!). La variabile wè il numero di pixel da quel punto in cui l'onda si è spostata. Se wè abbastanza grande, l'onda si riflette dai lati dell'immagine.

w = 225

onde con w = 225

w = 360

ondeggia con w = 360

w = 5390

ondeggia con w = 5390

Ecco una GIF che mostra una successione di immagini mentre l'onda si espande. Ho fornito un numero di dimensioni diverse, ognuna delle quali mostra tutti i frame consentiti dal limite di dimensioni del file di 500 KB.

onde grande GIF

piccole onde GIF onde medie GIF


Se riesco a trovare un modo per adattarlo, idealmente mi piacerebbe modellare l'interferenza delle onde in modo che le onde sembrino più realistiche quando si incrociano. Sono contento del riflesso però.

Nota che non ho davvero modellato il riflesso dell'onda in 3 lotti di 140 byte. Non c'è davvero nessuna riflessione in corso, sembra solo che sia così. Ho nascosto la spiegazione nel caso qualcuno voglia indovinare prima:

La prima onda riflessa è identica a un'onda proveniente dall'altro lato del bordo dell'immagine, alla stessa distanza dal punto originale. Quindi il codice calcola la posizione corretta per i 4 punti richiesti per dare l'effetto di riflessione da ciascuno dei 4 bordi. Ulteriori livelli di onda riflessa sono tutti identici a un'onda che ha origine in una tessera più lontana, se immagini l'immagine come una tessera su un piano. Il codice dà l'illusione di 8 livelli di riflessione mostrando 189 cerchi separati in espansione, ciascuno posizionato nel punto corretto in una griglia 17 per 17, in modo che passino attraverso il quadrato centrale della griglia (cioè il quadrato dell'immagine) in i tempi giusti per dare l'impressione dell'attuale livello di riflessione richiesto. Questo è semplice (e breve!) Da codificare, ma funziona abbastanza lentamente ...


3
Adoro le GIF e la spiegazione.
DLosc,

Neato! Ma amico, voci come queste mi fanno pensare che ho bisogno di un computer più veloce (o più pazienza, lol). O il tuo computer è molto più veloce o non voglio pensare a quanto tempo hai impiegato per generare tutti quei frame GIF.
DreamWarrior il

3
@DreamWarrior Non sono io ad essere paziente. È il mio laptop a cui non dispiace correre durante la notte mentre dormo ...
trichoplax,

2
Vedo Pacman nella seconda immagine.
AL
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.