Tweetable Matematik Sanatı [kapalı]


330

Tamsayılı matematik, bir ızgara üzerine yerleştirildiğinde şaşırtıcı desenler üretebilir. En temel fonksiyonlar bile şaşırtıcı derecede ayrıntılı tasarımlar üretebilir!

Senin meydan

1024x1024 görüntü için kırmızı, yeşil ve mavi değerler için 3 Tweetable (140 karakter veya daha az karakter) işlev gövdesi yaz.

İşlevlerin girişi iki tamsayı olacak (i ​​verilen piksel için sütun numarası) ve j (verilen piksel için satır numarası) ve çıktı verilen sayıyı temsil eden dahil olmak üzere 0 ile 1023 arasında işaretsiz bir kısa olacaktır. pikseldeki renk (i, j).

Örneğin, aşağıdaki üç işlev aşağıdaki resmi üretir:

/* 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);

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

Desen-2

Kurallar

  • Bu C ++ kodu göz önüne alındığında , işlevlerin yerine. Birkaç makro sağladım ve kütüphaneyi dahil ettim, sen de complex.h'yi ekleyebilirsiniz. Bu kütüphanelerdeki ve / veya makrolarımdaki herhangi bir işlevi kullanabilirsiniz. Lütfen bunun dışında herhangi bir dış kaynak kullanmayın.
  • Bu sürüm sizin için çalışmıyorsa, şunları derlediğinizden emin olun:

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

    Bu işe yaramazsa, lütfen imzasız kısa şort yerine imzasız karakterleri kullanarak alternatif sürümü kullanın.

Michaelangelo, temizlenmiş 24 bit veya 48 bit renk çıktı sürümü sağlamıştır .

  • Kendi sürümünüzü başka bir dilde uygulayabilirsiniz, ancak sağlanan C ++ sürümüyle aynı şekilde davranması gerekir ve yalnızca C ++ 'ın yerleşiklerinden, kitaplığından veya sağlanan makrolardan gelen işlevler adil hale getirmek için kullanılabilir.
  • Yalnızca üç işlev gövdesini yayınla - lütfen koduma yazı eklemeyin
  • Lütfen daha küçük bir sürüm veya görüntünün gömülü bir kopyasını ekleyin. Bir ppm biçiminde yapılırlar ve stackexchange'te düzgün görüntüleme için diğerine dönüştürülmesi gerekebilir.
  • İşlev gövdeleri (imza dahil değil) 140 karakter veya daha kısa olmalıdır.
  • Bu bir popülerlik yarışması - çoğu oy kazandı

3
Kuralların niteliği diğer dilleri hariç tuttuğu için C ++ etiketi eklendi. Belirli bir set gerektirmek için iyi bir nedenleri olmadığı sürece, genellikle dil-agnostik zorlukları tercih ederiz.
algoritmshark

4
Bunu çok geniş arayan seçmenlere, lütfen önce buna bir cevap yazmayı deneyin. Şaşırtıcı derecede kısıtlayıcı ...
trichoplax

8
Bu, şimdiye kadar gördüğüm en sevdiğim şey.
David Conrad

4
Bu sorunun eski okul demo sahnesi gibi göründüğünü seviyorum.
mskfisher

23
Bu tür bir soru kod golfe katılmayı teşvik eder . Genel olarak iyi bir golf sorusuna cevap vermekte zorlanıyorum çünkü iyi olmadığından emin değilim. Bu tür bir soruyla bayt limiti basit bir cevabı denememi, yol boyunca golf tekniklerini öğrenmemi ve daha karmaşık cevaplar vermemi sağlıyor. Bu, düz golf sorularına cevap veren bir basamak taşı gibidir. Daha fazla insan getirmenin anahtarı olabileceğini düşünüyorum.
trichoplax

Yanıtlar:


120

Mandelbrot 3 x 133 karakter

Aklıma ilk gelen şey "Mandelbrot!" Oldu.

Evet, zaten bir mandelbrot teslimi olduğunu biliyorum. 140 karakterin altında elde edebileceğimi onayladıktan sonra, bu çözümden aldığım püf noktaları ve optimizasyonları benimkine aldım (teşekkürler Martin ve Todd). Bu ilginç bir konum ve yakınlaştırmanın yanı sıra hoş bir renk teması seçmek için alan bıraktı:

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

Toplam 132 karakter

Tüm 3 kanal için 140'a düşürmeye çalıştım. Kenarlarda biraz renk gürültüsü var ve yer ilki kadar ilginç değil, ama: 132 karakter

mandelbrot azaltılmış

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
Bu renkler muhteşem!
Martin Ender

Bunu seviyorum, şimdiye kadarki en iyi görünen görüntü!
Roy van Rijn,

4
Bu şimdi duvar kağıdım.
Cipher

209

Masa örtüleri

Düz

Ekose / şemsiye desenini sınırsız masa örtüsü gibi bir perspektife koymaya başladım:

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

düz masa örtüsü

dalgalanma

Sonra bir dalgalanma tanıttım (kesinlikle doğru bir perspektif değil, fakat 140 karakterde):

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

sakinleştirmek masa örtüsü

Renk

Daha sonra, daha geniş ölçeklerde ayrıntı vermek ve resmi daha renkli hale getirmek için renklerin bir kısmını daha ince ayarlamıştım ...

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

renkli masa örtüsü

Hareket halinde

Kodu biraz daha fazla azaltmak, düzgün bir animasyon için yeterince yakın çerçeveler için yeterli olan 2 ondalık basamaklı bir dalga fazı P tanımlamaya izin verir. Deniz hastalığının indüklenmesini önlemek için bu aşamadaki genliği düşürdüm ve tüm resmi, görüntünün üstünden dışa doğru bastırmak için 151 piksel daha (1 ekstra karakter pahasına) kaydırdım. Hareketli takma adlandırma büyüleyicidir.

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

Animasyonlu masa örtüsü


15
Bu efsanevi. (Y) Devam et. : P
Mohammad Areeb Siddiqui,

Fakat tam olarak hareket nasıl uygulanır? Orijinal çerçevede çerçeve değiştiren bir mantık yok, değil mi?
esteewhy

2
@esteewhy sadece hareketsiz görüntüler üretilebilir. GIF, her biri sonraki değer değiştirilerek üretilen bir dizi durağan kareyi gösterir #define P. Ek karakterlere izin vermek için golf oynamak gerekliydi #define P 6.03.
trichoplax

4
DUR! En iyi cevabı gerçekten oylamak ister misiniz? Bazı vardır uzakta sonraki iki sayfalar arasında aşağı kaydırma eğer daha ilginç olanları.
trichoplax,

1
Cevapları "en eski" ye göre sıralamanızı öneririm ve ardından yeni cevaplar geldiğinde yeni yaklaşımların nasıl geliştiğini görebilirsiniz.
trichoplax

192

Rastgele ressam

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

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

İşte rastgelelik tabanlı bir giriş. Piksellerin yaklaşık% 0.1'i için rastgele bir renk seçer, diğerleri için ise rastgele bir bitişik pikselle aynı rengi kullanır. Her rengin bunu bağımsız olarak yaptığını unutmayın, bu yüzden bu sadece rastgele yeşil, mavi ve kırmızı bir resmin kaplamasıdır. Farklı çalışmalarda farklı sonuçlar elde srand(time(NULL))etmek için mainişleve eklemeniz gerekir .

Şimdi bazı varyasyonlar için.

Pikselleri atlayarak biraz daha bulanık hale getirebiliriz.

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

Ve sonra renkleri taşırken, taşmaların ani değişikliklerle sonuçlanmasını sağlarız, bu da fırça darbeleri gibi görünmesini sağlar

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

Çözmem gereken şeyler:

  • Bazı nedenlerden dolayı, srandbu fonksiyonların içine segfault yapmadan giremiyorum.
  • Eğer rastgele yürüyüşleri üç rengin tamamında aynı yapabilirsem, biraz daha düzenli görünebilirdi.

Ayrıca rastgele yürüyüş izotropik yapabilirsiniz,

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

sana vermek için

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

Daha rastgele resimler

Bununla biraz daha oynadım ve başka bazı rastgele resimler oluşturdum. Bunların hepsi bu zorluğun sınırlamaları dahilinde mümkün değil, bu yüzden onları buraya dahil etmek istemiyorum. Ama onları bu imgur galerisinde ve onları nasıl ürettiğimin bazı açıklamalarını görebilirsiniz.

Tüm bu olasılıkları bir çerçevede geliştirmek ve GitHub'a koymak için can atıyorum. (Böyle bir şey zaten mevcut değil, ama yine de eğlenceli!)


12
Bunları seviyorum. Piksel verilerine erişmeden bitişik pikselleri dikkate almanın mümkün olacağını fark etmemiştim - sorunsuz çalışma!
trichoplax

1
Kuralların, görüntüdeki her rengin bir pikselini koyacağı bu eski yarışmayı bana çok hatırlatıyor.
internets teh

2
Vaov! Bu resimler kesinlikle çok güzel!
raptortech97

1
Güzel galeri, radyal olanlar temiz.
internets teh

2
Reptar'ı görüyorum : yazıdaki son görüntü (izotropik olan), sağ üst kadran.
Tim Pederick

162

Bazı girdap sivri şeyler

Evet, tam olarak ne adlandıracağını biliyordum.

Bazı girdap sivri şeyler

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: Artık kullanmaz pow. EDIT 2: @PhiNotPi, abs kullanmam gerekmediğine işaret etti.

Farklı bir resim elde etmek için referans noktalarını kolayca değiştirebilirsiniz:

Bazı daha girdap sivri şeyler

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, resimlerimin içinde Batman olduğunu belirtti.

yarasa Adam


1
@JayKominek Bilmiyorum, o zamanlar etrafta değildim o zaman d:
cjfaure


1
@cjfaure oh vay! teşekkür ederim! açıklamanın son hali şurada görünüyor: web.archive.org/web/20031205062033/http://www.blorf.com/~mrad/… ve kod sourceforge'a taşındı. hatta geçen yıl güncellendi! sourceforge.net/projects/libswirlies
Jay Kominek

1
Favorilerimden biri!
Calvin'in Hobileri,

1
Bu güzel - ama ben onu yeniden üretemiyorum! Alabileceğim en yakın PPM'nin yanlış üretildiği (MSB yerine LSB) ve hatta o zaman bile farklı renkteki alfa harmanlanmış çemberlere benziyor.
DreamWarrior

123

Tabii ki, bir Mandelbrot teslimi olmalı.

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

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

Şimdi renk şemasını iyileştirmeye çalışıyorum. Hesaplamayı makro olarak tanımlarsam ve red_fndiğer ikisinde bu makroyu kullanırsam, hile yapmak yeşil ve mavi renklerde süslü renk seçimi için daha fazla karaktere sahip miyim?

Düzenleme: Kalan bu baytların iyi renk şemaları ile gelmesi gerçekten zor. İşte başka bir versiyon:

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

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

Ve githubphagocte'nin önerisine ve Todd Lehman'ın iyileştirmelerine göre, daha küçük bölümleri kolayca seçebiliriz:

Örneğin

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

verir

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


12
@tomsmeding İtiraf etmeliyim ki, Mandelbrot setini ilk kez uyguladım.
Martin Ender

2
Tam Mandelbrot setinde olduğu gibi ikonik olduğu gibi (+1, bu arada!), Parametreleri ayarlamak ve derinlemesine yakınlaştırmanın çarpıcı biçimde bükülmüş ayrıntılarından bazılarını içeren bir cevap göndermek için kendinize yetecek kadar yer bırakmışsınız gibi görünüyor.
trichoplax

1
@githubphagocyte Bunun hakkında zaten düşündüm, ancak düzgün parametreleri bulana kadar her seferinde yeniden derleyip yeniden çalıştırmak ve dönüştürmek için sıkıntı yaşamadım;). Belki sonra yaparsın. İlk önce tamamen farklı bir işlevi denemeliyim. ;)
Martin Ender

2
@githubphagocyte nihayet bunu eklemeye başladı. Önerin için teşekkürler!
Martin Ender

2
Thanks @Todd, son resmi bununla güncelleştirdim. 25600 yineleme kullandım, yeterince uzun. ;)
Martin Ender

110

Julia setleri

Bir Mandelbrot varsa, bir de Julia seti olmalı.

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

Parametreleri ve işlevleri ayarlayarak saatler harcayabilirsiniz, bu yüzden bu sadece iyi görünen hızlı bir seçimdir.

Martin'in katılımından ilham almıştır.

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

RNG ister misiniz?

Tamam, Sparr'un yorumu bu küçük Julias'ın parametrelerini randomize etmek için beni yoluna koydu. İlk önce bunun sonucu olarak bit düzeyinde hacklemeye çalıştım, time(0)ancak C ++ onaltılık kayan noktalı litre taşlarına izin vermiyor bu yüzden bu bir çıkmazdı (en azından sınırlı bilgim ile). Bunu elde etmek için bazı ağır dökümler kullanabilirdim, ama bu 140 bayta sığmayacaktı.

Zaten fazla yerim kalmamıştı, bu yüzden kırmızı Julia'yı makrolarımı koymak ve daha geleneksel bir RNG'ye ( timetohum ve gerçek rand(), woohoo!) Koymak için bırakmak zorunda kaldım .

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

Hata, bir şey eksik. Açıkçası, bu parametrelerin statik olması gerekir, aksi halde tuhaf sonuçlar elde edersiniz (ama komik, belki ilginç bir şey bulursam biraz sonra araştırırım).

İşte buradayız, sadece yeşil ve mavi kanallarla:

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

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

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

Şimdi boşluğu doldurmak için basit bir kırmızı desen ekleyelim. Gerçekten yaratıcı değil, ama grafik programcısı değilim ... henüz :-)

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

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

Ve son olarak rasgele parametreli yeni kod:

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

Şimdi hala yer kalıyor ...


Eğer parametreleri srand her koşmak rastgele kullanmak odamız var (zaman (0) ve Rand () veya sadece zaman (0)??
Sparr

2
Bu sonuncusu duvarıma gidiyor.
cjfaure

@Sparr, öneriniz ile güncellendi. Biraz eğlendim :-).
internets teh

4
En çok neye benzediğini söyleyemem: cevabınız veya kullanıcı adınız
William Barbosa

107

Bu ilginç çünkü i, j parametrelerini hiç kullanmıyor. Bunun yerine, statik bir değişkendeki durumu hatırlar.

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

renkli


Bu kodun sonuçlarını farklı platformlarda / derleyicilerde görmek ilginç olurdu. RAND_MAX'ın değeri geniş çeşitlilik gösterir ve tamamen farklı görüntüler verebilir ...
trichoplax

5
Fazla değişmemeli. (çift) rand () / RAND_MAX her zaman [0.0, 1.0] aralığında olmalıdır.
Manuel Kasten

2
Bu benim favorilerimden biri!
Calvin'in Hobileri,

2
Bu sadece ilginç değil - çok güzel!
Martin Thoma

104

görüntü

/* 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
Bu gerçekten çok güzel, +1.
Milo,

3
Bu benim favorim. Profesyonelce üretilmiş bir grafik tasarım parçası gibi görünüyor. : D
cjfaure

4
Bir mikroişlemci gofreti gibi görünüyor. macrophotographer.net/images/ss_rvsi_5.jpg
s0rce



82

Buddhabrot (+ Antibuddhabrot)

Düzenleme: Şimdi uygun bir Buddhabrot!

Düzenleme: Bayt sınırı içindeki renk yoğunluğunu sınırlamayı başardım, bu nedenle taşma nedeniyle artık yanlış siyah pikseller yok.

Gerçekten dörtten sonra durmak istedim ... ama ...

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

Bu, yükleme sırasında biraz sıkıştırılır (ve gömüldükten sonra küçülür), böylece tüm ayrıntılara hayran kalacaksanız, kırpılmış ilginç 512x512 (sıkıştırılmamış ve tam boyutunda görüntülenir):

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

Fikir için githubphagocte teşekkürler. Bu, üç renk fonksiyonunun da oldukça karmaşık bir şekilde kötüye kullanılmasını gerektiriyordu:

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

Daha iyi bir renk düzeni için kalan bazı baytlar var, ancak şimdiye kadar gri tonlamalı görüntüyü döken hiçbir şey bulamadım.

Verilen kod, 4096x4096 başlangıç ​​noktası kullanır ve yörüngelerin kaçışını ya da gitmemesini belirlemek için her birine 500.000'e kadar yineleme yapar. Bu benim makinede 6 ila 7 saat sürdü. İki dakika süren 2k x 2k ızgara ve 10k yineleme ile iyi sonuçlar elde edebilirsiniz ve 1k yineleme ile sadece 1k x 1k ızgaralar bile oldukça güzel görünüyor (3 saniye sürüyor). Bu parametrelerle dolaşmak istiyorsanız, değiştirilmesi gereken birkaç yer var:

  • Mandelbrot yineleme derinliğini değiştirmek her iki örneği ayarlamak için 5e5de BLsizin yineleme sayımına.
  • Izgara çözünürlüğünü değiştirmek için, dördünü değiştirmek 4096içinde RDistediğiniz çözünürlük ve 1024.in GRdoğru ölçeklendirme korumak için aynı faktörle.
  • Muhtemelen , her pikselin yalnızca mutlak ziyaret sayısını içerdiğinden, return c[i][j]girişi de ölçeklendirmeniz gerekecektir GR. Maksimum renk çoğunlukla yineleme sayısından bağımsız görünüyor ve toplam başlangıç ​​noktası sayısıyla doğrusal olarak ölçekleniyor. Yani 1k x 1k ızgara kullanmak istiyorsanız, isteyebilirsiniz return c[i][j]*16;veya benzer, ancak bu faktör bazen biraz kulağa ihtiyaç duyar.

Buddhabrot'a aşina olmayanlar için (birkaç gün önce kendim gibi), Mandelbrot hesaplamasına dayanıyor, ancak her pikselin yoğunluğu, bu pikselin kaçan yörüngelerin yinelemelerinde ne sıklıkta ziyaret edildiğidir. Kaçmayan yörüngeler sırasında ziyaretleri sayıyorsak, bu bir Antibuddhabrot. Her renk kanalı için farklı bir özyineleme derinliği kullandığınız Nebulabrot adı verilen daha sofistike bir sürüm var. Ama bunu başkasına bırakacağım. Daha fazla bilgi için, her zaman olduğu gibi, Wikipedia .

Başlangıçta, kaçan ve kaçmayan yörüngeler arasında ayrım yapmadım. Bu, bir Budhabrot ve Antibuddhabrot (githubphagosit tarafından belirtildiği gibi) birliği olan bir komplo oluşturdu.

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

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

Bu biraz soluk bir fotoğrafa benziyor ... Bunu sevdim.


8
Bunu bir şapka haline getireceğim.
cjfaure

6
Bunu gerçekten 3 lot 140 bayta indirdiğiniz için çok şaşırdım. Yeni buddabrot görüntüsü çok güzel.
trichoplax

4
Bu gerçekten etkileyici.
copumpkin

İlki gerçekten sanatsal. Bana denizanasını hatırlatıyor. +1
Igby Largeman,

1
Bu benim en sevdiğim gönderim. İyi iş!
Thomallen

76

Sierpinski Pentagon

Rastgele seçilmiş bir tepe noktasına yarıya kadar noktalar çizerek Sierpinski Üçgenine yaklaşmanın kaos oyunu yöntemini görmüş olabilirsiniz . Burada aynı yaklaşımı 5 köşe kullanarak da uyguladım. Yerleştirebileceğim en kısa kod, 5 köşeyi kodlamakta zorlanıyordu ve hepsini 140 karaktere sığdırmanın hiçbir yolu yoktu. Bu yüzden kırmızı bileşeni basit bir zemine atadım ve diğer iki işlevi de 140'ın altına getirmek için bir makro tanımlamak için kırmızı işlevdeki boş alanı kullandım. Yani her şey beşgen içinde kırmızı bir bileşen olmamak pahasına geçerlidir.

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

Martin Büttner'e , soruda, bir işlevde bir makro tanımlamak, sonra bir diğerinde kullanmak ve ayrıca ana işlevi raster sıralamasıyla sınırlandırmak yerine, rastgele bir sıradaki pikselleri doldurmak için hatıra kullanmaya ilişkin yorumunda belirtilen fikir için teşekkür ederiz. .

Pentagon

Görüntü 500KB'nin üzerinde olduğundan, yığın değişimi ile otomatik olarak jpg'ye dönüştürülür. Bu, daha ince ayrıntıların bazılarını bulanıklaştırır, bu yüzden orijinal görünümünü göstermek için sadece sağ üst çeyreği png olarak ekledim:

sağ üst


73

Nota

Sierpinski müziği. : D Sohbetteki adamlar müzik kutuları için delinmiş kağıda benziyor diyor.

Nota

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

Bunun nasıl çalıştığıyla ilgili bazı detaylar ... aslında, sadece dalgalı Sierpinski üçgenlerinin oluşturduğu bir yakınlaştırma. Müzik notaları görünümü (ve aynı zamanda blokaj), tamsayı kesmenin bir sonucudur. Kırmızı işlevi değiştirirseniz,

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

kısaltma kaldırıldı ve tam çözünürlükte render elde edildi:

Bloksuz notalar

Yani evet, bu ilginç.



1
@squeamishossifrage Ne izledim ben sadece ...?
cjfaure

Chris Cunningham'ın videolar :-) vardır biraz tuhaf, değil mi?
pembemsi ossifrage

14
ikincisi sayfayı
kaydırdığımda

5
Siteyi aşağı kaydırırken, sonuncusu gerçekten hareket ediyor gibiydi. Güzel optik illüzyon.
Kyle Kanos

61

Rastgele Voronoi diyagramı üreteci kimse var mı?

Tamam, bu bana zor zamanlar verdi. Bence, sonuçların bazıları kadar gösterişsiz olmasa da, oldukça hoş . Rastgele olan anlaşma bu. Belki bazı ara görüntüler daha iyi görünür, ancak gerçekten voronoi diyagramlarıyla tam çalışan bir algoritmaya sahip olmak istedim.

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

Düzenle:

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

Bu, son algoritmanın bir örneğidir. Görüntü, temel olarak, her bir renk bileşeni için (kırmızı, yeşil, mavi) bir tane olan üç voronoi şemasının süperpozisyonudur.

kod

ungolfed, sonunda yorum yaptı

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

Bana çok çaba sarf etti, bu yüzden sonuçları farklı aşamalarda paylaşmak gibi hissediyorum ve gösterilecek hoş (yanlış) olanlar da var.

İlk adım: bazı noktaların rastgele x=y

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

Orijinal png upload ( >2MB) için çok ağır olduğu için onu jpeg'ye dönüştürdüm , bahse girerim ki 50'den fazla gri tonu var!

İkincisi: daha iyi bir y koordinatınız olsun

yEksen için rastgele oluşturulmuş bir başka koordinat tablosuna sahip olamadım , bu yüzden " rastgele " olanları mümkün olduğunca az karakterle elde etmek için basit bir yola ihtiyacım vardı . xTablodaki başka bir noktanın koordinatını kullanmaya gittim AND, noktanın endeksini bit yönünde yaparak .

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

3: Hatırlamıyorum ama güzelleşiyor

Ama şu anda 140 karakterin üzerindeydim, bu yüzden biraz golf oynaması gerekiyordu.

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

4.: tarama çizgileri

Şaka yapıyorum, bu istenmiyor ama biraz havalı.

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

Algoritmanın boyutunu küçültmek için hala çalışıyorum, sunmaktan gurur duyuyorum:

StarFox baskısı

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

Voronoi instagram

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

5: puan sayısını arttırın

Şimdi çalışan bir kod parçam var, hadi 25 ila 60 puan arasında gidelim. görüntü tanımını buraya girin

Tek bir görüntüden görmek zor, ancak noktaların neredeyse hepsi aynı yaralıkta. Tabii ki, bitsel işlemi değiştirmedim &42, çok daha iyi:

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

Ve işte biz, bu yazının ilk imgesi ile aynı noktadayız. Şimdi ilgilenecek ender kodların kodunu açıklayalım.

Ungolfed ve kodu açıkladı

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

Şimdiye kadar okuduğunuz için teşekkürler.


1
Voronoi diyagramlarını seviyorum. 3 tweet'e sığdırmak için +1!
Martin Ender

1
Bu benim kişisel favorilerimden biri. Tarama çizgisi çeşitleri çok estetiktir.
Fraxtil

1
Kodu nasıl açıkladığına
Andrea

Uçağın ekseni üzerinde tam bir devir yapması!
Starson Hochschild

dördüncü ikinci resim: scanlines güzeldir.
Khaled.K,

57

Lyapunov Fraktal

Lyapunov Fraktal

Bunu üretmek için kullanılan dize AABAB ve parametre alanı [2,4] x [2,4] idi. ( burada dize ve parametre alanı açıklaması )

Sınırlı kod alanı ile bu rengin çok güzel olduğunu düşündüm.

    //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);

Ayrıca Mandelbrot setinde bir değişiklik yaptım. Mandelbrot set haritasına benzer bir harita kullanır. M (x, y) 'nin Mandelbrot haritası olduğunu söyleyin. Sonra M (sin (x), cos (y)) kullandığım harita ve kaçan değerleri kontrol etmek yerine, her zaman sınırlandırıldığından x ve y'yi kullanıyorum.

//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);

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

DÜZENLE

Çok acı çektikten sonra nihayet ikinci görüntü morphing bir gif oluşturmak için var. İşte burada:

Parti zamanı


11
İkincisi için güzel psychedelic görünüm.
internets teh

4
Bunlar delilik ! +1
cjfaure

10
Korkutucu fraktal korkutucu ༼ ༎ ຶ ෴ ༎ ຶ ༽
Tobia

1
Lanet olası o ikinci korkutucu. Amaximg, basit z = z ^ 2 + c'den ne kadar kazanabileceğinizi gösterir.
14'te

4
Edward Munch fraktalları boyayacak olsaydı, bu Çığlık'a benziyordu.
internets teh

55

Çünkü tek boynuzlu atlar.

Çünkü tek boynuzlu atlar

OP'lerin versiyonunu ve 1023'e unsigned shortkadar renk değerlerini çalıştıramadım, bu yüzden sabit olana kadar, işte 255'in charmaksimum renk değeri kullanan bir sürüm .

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

Renk kanallarını ayrı ayrı görmek istiyorum. Bu güzel olurdu.
alkış

52

Lojistik Tepeler

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

Fonksiyonlar

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

#Definlerin tamamı BL'ye 140 karakterin altında sığacak. İşte mavi algoritmanın ungolfed versiyonu, biraz değiştirilmiş:

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

X değerlerinin belirli bir r (j değeri) için en sık düşmesi durumunda, arsa daha açık hale gelir (genellikle daha koyu olarak gösterilir).


3
Aww, dün bunu nasıl yapacağımı düşünüyordum. Anlamak için +1. Aslında paletin olduğu gibi gerçekten güzel bir şey! :)
Martin Ender

2
Pis hileleri sizden ve githubphagocte'den çaldım, çirkin #defines için sorumluluk aldım. Özellikle "#define G (" için.
Eric Tressler

1
bir turnuva parantezi grafikerine daha çok benziyor
Kevin L

3
Resimde
görülmemiş

1
Poster boyutunda bir baskı alabilir miyim? Arka planda 3 soluk tweets ile. :-)
Andrew Cheong

50

Difüzyon Sınırlı Toplama

Her zaman difüzyon sınırlı toplanmasından ve gerçek dünyada göründüğü farklı yollardan etkilenmiştim .

Ben kod korkunç vermek zorunda olduğum bu yüzden zor (ya da güzel eğer gibi şeyler gibi işlev başına sadece 140 karaktere bu yazma buldum ++d%=4ve for(n=1;n;n++)). Üç renk işlevi birbirlerini çağırır ve birbirlerinin kullanması için makroları tanımlar, bu nedenle iyi okumaz, ancak her işlev 140 karakterin altındadır.

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

difüzyon sınırlı toplama

Parçacıkların aşamalı olarak nasıl toplandığını görselleştirmek için, düzenli aralıklarla anlık görüntüler ürettim. Her kare 1'i for(n=1;n;n++)0, -1 << 29, -2 << 29, -3 << 29, 4 << 29, 3 << 29, 2 << 29, 1 << 29 ile değiştirerek üretildi. 1. Bu, her çalışma için 140 karakter sınırının hemen altında tuttu.

animasyonlu toplama

Birbirine yakınlaşan agregaların birbirlerini parçacıklardan mahrum bıraktıklarını ve daha yavaş büyüdüklerini görebilirsiniz.


Kodda küçük bir değişiklik yaparak, henüz agregaya eklenmemiş kalan parçacıkları görebilirsiniz. Bu, büyümenin daha hızlı olacağı daha yoğun bölgeleri ve kullanılan tüm partiküller nedeniyle daha fazla büyümenin bulunmadığı agregalar arasındaki çok seyrek bölgeleri gösterir.

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

Görünür parçacıkları ile DLA

Bu, daha önce olduğu gibi canlandırılabilir:

parçacıklarla animasyonlu toplama


3
Çok ilginç, +1.
internets teh

50

Spiral (tam olarak 140)

son ürün

İşlev başlıkları ve parantez eklemiyorsanız, bu tam olarak 140 karakterdir. Karakter sınırına sığabileceğim kadar spiral karmaşıklık.

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

Yavaş yavaş basit bir spiral üzerine kurguladım, spiral kenarlarına desenler ekledim ve farklı spirallerin serin görünmek için nasıl birleştirilebileceğini denedim. İşte her bir parçanın ne yaptığını açıklayan yorumlarla dolu bir versiyon. Parametrelerle uğraşmak bazı ilginç sonuçlar doğurabilir.

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

Parametrelerle uğraşmak:

Burada, spiraller sıralanır ancak farklı kenar desenlerine sahiptir. Ana örnekteki bloklu kenarlar yerine, bu tamamen sin dalgalarından oluşan kenarlara sahiptir.

kenarları

Burada, degrade kaldırıldı:

gradyan yok

Bir animasyon ( nedense yükledikten sonra döngüde görünmüyor, üzgünüm. Ayrıca, daraltmak zorunda kaldım. Animasyonu kaçırdıysanız, yeni bir sekmede açın ):

animasyon

Ve işte tüm resimlerin bulunduğu imgur albümü . Başka bir havalı spiral kalıp bulabilecek birini görmek isterim. Ayrıca, şunu söylemeliyim ki, bu şimdiye dek gördüğüm en harika zorluklardan biri. Keyfini çıkarın!

EDIT: İşte bu spirallerden değiştirilmiş parametrelerle yapılmış bazı arka planlar .

Ayrıca, spiral kenar kalıplarımı burada xor / ve / veya işlemlerin kullanımı sırasında gördüğüm bazı fraktallarla birleştirerek, işte son bir spiral:

fraktal sarmal


2
Bunlar muhteşem! Diğer cevapların etrafına bakarsanız, daha fazla yer açmak isteseniz, daha da golf oynamak için fikirler bulabilirsiniz. Yanıtların bir kısmı, her birinin kullanabileceği bir makro tanımlamak için #define komutunu kullanır, böylece hesaplamanın büyük kısmını diğer renk fonksiyonlarına aktarabilirsiniz. Martin Büttner beni bu numara ile tanıştırdı.
trichoplax

Teşekkür ederim! Benim durumumda bulabildiğim kadarıyla kodumda, pound tanımlarından faydalanacak bir tür yinelenen mantık düzeni yoktur. Bununla birlikte, herhangi birisini görürseniz, bunları bana tanımlarsanız çok sevinirim, özellikle de C / C ++ 'ı yıllardır yoğun şekilde kullanmadığımı görmek.
xleviator,

Yinelenen bölümleri bulmak gerçekten daha da yardımcı olacaktır, ancak herhangi bir yineleme olmadan bile, kodu RD veya GN'de bir makro olarak tanımlayıp ardından BL'de kullanarak basitçe BL'den RD'ye veya GN'ye taşıyabilirsiniz. Bu size ekstra kod için iki kat daha fazla yer vermelidir.
trichoplax

Ah! Anlıyorum. Her fonksiyon gövdesinin kendisinin 140 karakter sınırına sahip olduğunu bile bilmiyordum. Sanırım bir dahaki sefere istemi daha dikkatli okumalıyım. Bunu gösterdiğin için teşekkürler!
xleviator

1
Sohbette tartışıldığı gibi döngüsel olmayan GIF'iniz kolayca sabitlenebilir olmalıdır. Bence şu anda gösterdiği animasyonun kısa bir kısmı harika görünüyor.
trichoplax

47

Klasik bir haraç

V1 : DreamWarrior'ın "Mutlu olun" dan ilham alan bu basit sunum, her renk kanalına küçük bir piksel resmi görüntüsünü yerleştiriyor. Şifreyi bile oynamak zorunda değildim!
V2 : şimdi oldukça kısa kod ve sadece "oyun ekranını" izole eden kalın siyah kenarlıklı.
V3 : uzay gemisi, kurşun, hasarlı uzaylılar ve mavi sınır, ah benim! Kaba, bu amaç için çalışıyorum .

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

Uzay istilacıları


Avatarı başka bir piksel-sanat tabanlı giriş eklemek için bana ilham veren Umber Ferrule tarafından yapılan bir düzenleme üzerine yanıldım . Kodun ana fikri, Space Invaders'ınkine büyük ölçüde benzer olduğu için, ikisinin kesinlikle farklı zorlu noktaları olmasına rağmen, bu girişe ekliyorum. Bunun için, pembenin doğrusunu almak (pahasına) ve oldukça büyük bir sprite olması güzel zorluklar olduğunu kanıtladı. \xFFKırmızı kanaldaki onaltılık çıkışlar ( vb) kaynak dosyadaki karşılık gelen karakterlerini temsil eder (yani, kaynak dosyadaki kırmızı kanal ikili veri içerir), sekizlik çıkışlar ise değişmezdir (yani kaynak dosyada bulunur).

// 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 (Kabarcık Bobble)


3
Bunu seviyorum. Ayrıca ekstra özellikler eklemek için oda bol ...
trichoplax

1
Evet, boyutunu küçültmek için bir sürü püf noktası var. Yarın genişletmeye devam edebilirim.
FireFly

Bu şimdi inanılmaz derecede kısa. Bu bit kalıplardan birini, raycasting cevabınızdaki dokuya sığdırabilir misiniz ...?
trichoplax

@ MartinBüttner oops, haklısın. Düzelttim ve fonksiyonlarda yeni bir güncelleme yaptım.
FireFly

Güzel, 8x8 piksel sanatını nasıl çektiğini ve anında "yeniden boyutlandırmayı" sevdim. Ancak, birkaç değişiklik yapmak zorunda kaldım ve hala tam olarak resminizi alamıyorum. 1L ve 255L'yi 1LL ve 255LL olarak değiştirdim. Bu daha iyi olduğundan, muhtemelen 64bit modunda derlediğinizi ve görüntümün geri kalanının yanlış çıkmasına neden olan bazı genişlik sorunları olduğunu varsayıyorum. Ama yine de iyi iş!
DreamWarrior

44

Aksiyon Boyama

Jackson Pollock'un eserine benzer bir şeyi yeniden yaratmayı denemek istedim - yatay bir tuval üzerine boya damlatıp dökerek. Sonuçları beğenmeme rağmen, kod bu soruya gönderilmek için çok uzun sürdü ve en iyi çabalarım hala yalnızca yaklaşık 600 bayta düşürüldü. Bu yüzden burada gönderilen kod (sırasıyla 139 bayt, 140 bayt ve 140 bayt işlevine sahip), sohbet halindeki bazı dehaların muazzam miktarda yardımı ile üretildi . Çok teşekkürler:

amansız bir grup golf seansı için.

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}

aksiyon boyama 21, 21

RD ve GR işlevlerinde E (q) makrosu kullanılır. Argümanın değerini değiştirmek, renklerin kırmızı ve yeşil bileşenlerinin değişme şeklini değiştirir. J makrosu, mavi bileşenin ne kadar değiştiğini belirlemek için kullanılan bir sayı ile sona erer, bu da kırmızı ve yeşil bileşenleri etkiler çünkü ondan hesaplanır. Olası renk kombinasyonlarının çeşitliliğini göstermesi için E'nin kırmızı ve yeşil argümanlarını içeren bazı görüntüler ekledim. Bunları kendiniz çalıştırmak istiyorsanız, kırmızı ve yeşil değerler için resimlerin üzerine gelin.

aksiyon boyama 14, 14

aksiyon boyama 63, 49

eylem boyama 56, 42

aksiyon boyama 0, 49

İndirirseniz, bu resimlerin tümü tam boyutta görüntülenebilir. Düz renk PNG sıkıştırma algoritmasına uyduğundan dosya boyutu küçük olduğundan siteye yüklenmek için kayıplı bir sıkıştırma gerekmez.

Farklı şeyleri denediğimiz gibi golf sürecindeki çeşitli aşamalardan görüntüleri görmek isterseniz, aksiyon boyama sohbetine bakabilirsiniz .


7
Birkaç haftadır bu soruyu ve tüm cevapları takip ediyorum ve şunu söylemeliyim ki, bu çenemi gerçekten düşüren ilk şey. HOLY AMAZINGNESS. Yani, bütün cevapları burada büyük - ama bu bir ben bir şeydir asla mümkün olması bekleniyor olurdu.
Todd Lehman,

1
@ToddLehman teşekkür ederim! Bu kesinlikle tek başıma yapabileceğim bir şey değil - biliyorum çünkü denedim ...
trichoplax

2
HARİKA! Bu sorudaki en iyilerden biri ve benim için insan tarafından
çizilene

1
@cyriel çok teşekkürler. Bunun 5 kişi tarafından çizildiğini söyleyebilirsiniz ...
trichoplax

43

Bu kodun parametreleriyle oynayacağımı düşündüm ... Tüm kredi @Manuel Kasten'e gidiyor. Bunlar göndermeye karşı koyamadığım kadar güzel. Sıcak soğuk

/* 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
Seuss bana benziyor. Çok havalı!
DLosc

3
Haha, aslında Seuss1 ve Sueuss2 iki dosya adını verdim
Kyle McCormick

42

Düzenleme: Bu artık geçerli bir cevaptır, ileri açıklamalarına sayesinde GRve BL.

Hofstadter'ın Q dizisiyle eğlenmek! Eğer radyal mesafeyi giriş, çıkış, ters renk olarak bir noktadan kullanıyorsak, renkli vinil gibi görünen bir şey elde ederiz.

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

Dizi, Fibonacci dizisine çok benzer, ancak dizide 1 ve 2 adım geri gitmek yerine, toplamı almadan önce ne kadar geriye gidileceğini belirlemek için önceki iki değeri alırsınız . Kabaca doğrusal bir şekilde büyür, fakat her şimdi ve sonra bir sonraki patlamadan önce tekrar neredeyse doğrusal bir sıraya yerleşen bir kaos patlaması (artan aralıklarla) vardır:

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

Bu dalgalanmaları renkli olarak çok "düz" görünen bölgelerden sonra görüntüde görebilirsiniz.

Tabii ki, sadece bir renk kullanmak sıkıcı.

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

Şimdi kod için. Diziyi hesaplamak için özyinelemeli işleve ihtiyacım var. Bunu ne RDzaman jnegatif olursa kullanıyorum . Ne yazık ki, bu kırmızı kanal değerini kendisi hesaplamak için yeterli karakter bırakmaz, bu yüzden RDsırayla GRkırmızı kanalı üretmek için bir ofset çağırır .

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

Tabii ki, bu dizilimin mümkün olan en basit kullanımıdır ve geriye kalan birçok karakter var. Ödünç almak ve başka çılgın şeyler yapmaktan çekinmeyin!

Sınırın ve renklerin Q-dizisi tarafından belirlendiği başka bir versiyon. Bu durumda, RDileriye dek bildirime bile ihtiyacım olmayacak kadar yer vardı:

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

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


1
Bu ikinci gri-ish görüntüsü çarpıcı!
tomsmeding

Bunu r / g / b işlevlerini özyinelemeli, özyinelemeli aramalar için geçersiz koordinatlarla kullanabilecek kadar yoğunlaştırabilir misiniz?
Sparr

Çok renkli görüntüyü sevdim. Güzel cevap!
Alex,

41

Bu Joukowsky'nin kökeni hafifçe dengeleyen bir noktaya merkezlenmiş bir dizi eşmerkezli dairenin dönüşümünü hesaplar . Biraz renk değişimi sağlamak için mavi kanaldaki yoğunlukları biraz değiştirdim.

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

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


39

Objective-C

Objective-C'deki C ++ kodunu yeniden yazdım çünkü onu derleyemedim ... iPad'imde çalışırken diğer cevaplarla aynı sonuçları verdi, bu yüzden hepsi iyi.

İşte benim gönderim:

Üçgenler Galore

Bunun arkasındaki kod oldukça basittir:

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

Sen çarparak meydanlarda yakınlaştırabilirsiniz ive jtarafından 0.5, 0.25onlar işlenmeden önce vb.


Kullandığın kodun aynı olduğundan emin misin? ^ Tür tuhaf, çünkü (i ^ i) her zaman 0'dır (XOR) ve ^ 2 bir XOR biti yerine kare gibi görünür.
Manuel Ferreria

1
@ManuelFerreria XOR ile kod aslında şöyle derlenmiştir: x^(x-y)^y(bu beni ilk kez attı). İOS
Max Chuquimia

38

Sierpinski Boya Sıçrama

Renklerle daha fazla oynamak istedim, böylece diğer cevabımı değiştirmeye devam ettim (girdap olanı) ve sonunda bununla sonuçlandım.

Sierpinski Boya Sıçrama

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

Artık benim avatarım. : P


4
Aferin. efendim, iyi iş.
EaterOfCode

37

Derleyicinizin bir değer döndürmesi gereken ancak yapmaması gereken fonksiyonlarla ne yaptığını gösterecek olan "tanımsız davranış" olarak adlandıracağımı bu girişi iletmek zorunda olduğumu hissediyorum.

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

Tüm siyah pikseller:

tüm siyah pikseller

Sözde rasgele pikseller:

sözde rasgele pikseller

Ve tabii ki, derleyicinize, bilgisayarınıza, hafıza yöneticinize, vb. Bağlı olarak başka olası sonuçların bir kısmı.


3
Hangisini aldın?
saat 21

3
Farklı derleyiciler ile programın farklı çalışmaları arasında değişen düz siyah ve düz renk aldım.
Sparr

8
Derleyicim hata yapıyor ve bana bir değer veremediğim için bağırıyor.
Pharap

3
@Pharap fena bir şey değil :)
Sparr

İkinci resminin önerdiği gibi güzel bir rastlantısallık kazanacağından şüpheliyim Sabit bir değer, döngünün indeksi vs. çok daha muhtemeldir (fonksiyon çağrıldığında EAX'in içinde ne depolanırsa).
örnek

37

harika

groovy.png

Sadece biraz trigonometri ve garip makro püf noktaları.

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: M_PIyalnızca POSIX uyumlu sistemlerde bulunması nedeniyle izin verilmiyorsa, değişmezle değiştirilebilir 3.14.


1
Yedek karakterleriniz var, acos(-1)bunun için iyi bir seçenek M_PI.
Martin Ender

33

Ben matematikte iyi değilim. Ben her zaman matematik dersinde fakir bir öğrenciydim. Bu yüzden basit bir tane yaptım.

mathpic1.png

Modifiye user1455003's Javascript kodunu kullandım . Ve bu benim tam kodum .

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

Çok kısa olduğundan üç fonksiyonun hepsi bir tweet'e uyar.


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

Başka bir çok kısa fonksiyonlar. Çeşitli matematik fonksiyonlarıyla uğraşırken bu sierpinski modelini (ve bazı teğet desenleri) buldum. Bu tam kod


Sadece i&jSierpinski üçgeni aslında işler. Hangisi harika .
cjfaure

Bu sonuncusu profil resmine layık.
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;
}

Amerika Birleşik Devletleri

Başka bir sürüm. fonksiyon gövdeleri titizdir.

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

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

Yenilenmiş görüntü oluşturma işlevi. çizmek (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)
}

Mor

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

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


DOLANDIRICI! DOLANDIRICI! ; D (geçerli bir cevap, çok zekice: P Nice one!)
17'de toplandı

1
Hahah .. evet biliyorum bu yüzden daha çok soruyu soran bir tane gönderdim. Aslında kalıp yapmaya çalıştım ve gerçekten bir şeyler çizip çizemeyeceğimi düşündüm.
wolfhammer

Sonlarına "| Math.random () * 256" uygulayarak, düşük bitlerde bazı film-tahıl gürültüsü ekleyerek sığ renkli görüntülerin biraz daha zengin görünmesini sağlayabilirsiniz. Vurguları değiştirmeden koyu gölgeleri daha rastgele rahatsız eder. (ve karanlık eşiğine bağlı olarak sayıyı arttırın)
Kent Fredric

rgb rasgeleliği @ [10,728,728] i.imgur.com/ms4Cuzo.png
Kent Fredric

31

Gezegen Ressamı

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

Martin'in kesinlikle muhteşem bir girişinden esinlenilmiş , bu farklı bir yaklaşım. Piksellerin bir kısmını rasgele imlemek yerine, sol üst köşeyle RGB (512,512,512) olarak başlıyorum ve oradan her rengin üzerine rastgele yürüyoruz. Sonuç teleskoptan gelen bir şeye benziyor (imo).

Her piksel, üstündeki / solundaki piksellerin ortalamasını alır ve biraz rasgele ekler. pDeğişkeni değiştirerek değişkenlikle oynayabilirsiniz , ancak kullandığım şeyin iyi bir denge olduğunu düşünüyorum (temel olarak maviyi sevdiğim için daha fazla bulanıklık dalgalanması iyi sonuçlar veriyor).

Ortalama alırken tamsayı bölmesinden kaynaklanan olumsuz bir önyargı var. Yine de işe yaradığını düşünüyorum ve alt köşeye güzel bir karartma etkisi veriyor.

Elbette, tek bir sonuçtan daha fazlasını elde srand()etmek için ana işlevinize bir satır eklemeniz gerekir .

bantları


2
Görüntü biraz daha büyük olsaydı, ışık ışınları gibi görünürdü. o:
cjfaure

1
Eğer görüntünün tam boyutunu görüyorsanız (indirme / sağ tıklama ve görüntüyü görüntüleme / sisteminizde ne işe yararsa), o zaman ekstra ayrıntı ile daha da güzel görünür.
trichoplax

siyahla çevrili bir daire yap, ve bu onu bir gezegen yapacaktır!
Khaled.K,

1
Bunu blender'deki bir kürenin etrafına sarmaya çalıştım ve bir animasyon yaptım. Burada ti görmek: gfycat.com/SameAnotherDinosaur
starbeamrainbowlabs

30

Yansıyan dalgalar

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

Bir su birikintisine bırakılan bir taş gibi bir noktadan genişleyen bir dalganın konumuna göre bozulmuş temel bir satranç tahtası deseni (fiziksel olarak doğru olmaktan çok uzak!). Değişken w, dalganın hareket ettiği noktadan piksel sayısıdır. Eğer wyeterince büyük, dalga görüntünün taraftan yansıtır.

w = 225

w = 225 olan dalgalar

w = 360

w = 360 olan dalgalar

w = 5390

w = 5390 olan dalgalar

Dalga genişledikçe görüntülerin arka arkaya görüntülenmesini gösteren bir GIF. Her biri 500KB dosya boyutu sınırının izin verdiği kadar kare gösteren farklı boyutlar verdim.

büyük GIF dalgalar

küçük GIF dalgalar dalgalar orta GIF


İçine sığacak bir yol bulabilirsem, ideal olarak dalgaların karıştığında daha gerçekçi görünmesi için dalga girişim modellenmesini istiyorum. Yine de yansımadan memnunum.

3 lotta 140 baytta dalga yansımasını modellemediğimi unutmayın. Gerçekleşen herhangi bir yansıma yok, sadece öyle gözüküyor. İlk önce tahmin etmek isteyen varsa diye açıklamayı gizledim:

Yansıtılan ilk dalga, görüntü kenarının diğer tarafından kaynaklanan, orijinal nokta ile aynı mesafedeki bir dalga ile aynıdır. Bu nedenle kod, 4 kenarın her birinden yansıma etkisini vermek için gereken 4 nokta için doğru konumu hesaplar. Yansıtılmış dalganın diğer seviyelerinin tümü, görüntünün bir düzlemde bir kiremit olarak düşünüldüğünde, uzaktaki bir döşemeden kaynaklanan bir dalgayla aynıdır. Kod, her biri 17 x 17'lik bir ızgarada doğru noktaya yerleştirilmiş 189 ayrı genişleme dairesi göstererek 8'deki yansıma yanılsamasını verir; böylece, kılavuzun merkez karesinden (yani görüntü karesi) geçer. Sadece gerekli güncel yansıma seviyesi izlenimini vermek için doğru zamanlar. Bu, kodlamak için basit (ve kısa!), Ama oldukça yavaş çalışır ...


3
GIF'leri ve açıklamayı seviyorum.
DLosc

Neato! Ama dostum, bunun gibi girişler beni daha hızlı bir bilgisayara (veya daha fazla sabrına ihtiyacım var) düşündürüyor. Bilgisayarınız çok daha hızlı ya da tüm bu GIF çerçevelerini oluşturmanın ne kadar sürdüğünü düşünmek istemiyorum.
DreamWarrior

3
@ DreamWarrior Bu hasta ben değilim. Bu benim dizüstü bilgisayarım gece uyumaya
aldırış etmem

2
İkinci resimde Pacman'ı görüyorum.
AL
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.