Rastgele bir kar tanesi taklit edelim


10

Ben gördüm bu soruyu üzerinde https://mathematica.stackexchange.com/ ve oldukça serin düşünüyorum. Diğer programlama dilleri ile kar tanesi yapalım.

Bu orijinal sorudan bir alıntıdır:

Bu sezon ... Ve Mathematica Stack Exchange'de ilk sorumu sormanın zamanı geldi. İşte size Graphics (ve P-Chem?) Guruları için bir tatil görevi.

(Rastgele) bir kar tanesi oluşturmak için en iyi kodunuz nedir? Rastgele, gerçek kar taneleri tarafından gösterilen çeşitliliği taklit edecek farklı şekillerle kastediyorum. İşte bir fikre sahip olmak için bir bağlantı: http://www.its.caltech.edu/~atomic/snowcrystals/ , daha spesifik olarak farklı kar taneleri türleri: http://www.its.caltech.edu/~atomic /snowcrystals/class/class.htm . Burada tek bir kar tanesi (muhtemelen şeklini ayarlamak için farklı parametrelerle) üretmeye çalışıyoruz, daha gerçekçi, daha iyi. Yarı saydamlık ve renkler eklemek için üç boyutlu kaplamalar da kabul edilir. Fantezinizi serbest bırakın, normal fraktalların ötesine geçin!

Kurallar:

  • Rasgele tek bir kar tanesi oluşturun.
  • Pul altı kat radyal simetri olmalıdır.
  • Gerçekçi olması gerekmez. (Ama tercih et)
  • *, ⚹, ❅, ❄, ❆ gibi tek karakterli cevaplara izin verilmez.
  • En upvotes kazanır!

3
Tek karakter çıkışlarına daha iyi izin vermeyin '*⚹❅❄❆'[Math.floor(Math.random()*5)].
manatwork

1
@ nitro2k01: ilanın ilk cümlesinde tam mathematica.SE sitesine başvurduğunu anlıyorsunuz , değil mi?
Kyle Kanos

Ayy üzgünüm. Dürüst olmak gerekirse kuralları atladım.
nitro2k01

Yanıtlar:


14

Bash ve ImageMagick

#!/bin/bash

third=()
x=90
y=90
while (( x>10 )); do
  (( dx=RANDOM%10 ))
  while :; do (( dy=RANDOM%21-10 )); (( y-dy<95 )) && (( y-dy>(x-dx)/2 )) && break; done
  third+=(
    -draw "line $x,$y $(( x-dx )),$(( y-dy ))"
    -draw "line $x,$(( 200-y )) $(( x-dx )),$(( 200-y+dy ))"
    -draw "line $(( 200-x )),$y $(( 200-x+dx )),$(( y-dy ))"
    -draw "line $(( 200-x )),$(( 200-y )) $(( 200-x+dx )),$(( 200-y+dy ))"
  )
  (( x-=dx ))
  (( y-=dy ))
done

third+=(
  -draw "line 90,90 90,110"
  -draw "line $x,$y 15,100"
  -draw "line $x,$(( 200-y )) 15,100"
  -draw "line 110,90 110,110"
  -draw "line $(( 200-x )),$y 185,100"
  -draw "line $(( 200-x )),$(( 200-y )) 185,100"
  -draw 'color 20,100 filltoborder'
  -draw 'color 180,100 filltoborder'
)

convert \
  -size '200x200' \
  xc:skyblue \
  -background skyblue \
  -stroke 'white' \
  -strokewidth 1 \
  -fill 'white' \
  -bordercolor 'white' \
  -fuzz 10% \
  "${third[@]}" \
  -rotate 120 \
  -crop '200x200' \
  "${third[@]}" \
  -rotate 120 \
  -crop '200x200' \
  "${third[@]}" \
  -draw 'ellipse 100,100 15,15 0,360' \
  x:

Örnek çalışma:

bash-4.1$ for i in {1..30}; do ./showflake.sh "showflake-$i.png"; done

bash-4.1$ montage showflake-*.png x:

kar tanesi montajı


5

JavaScript

Burada bulunan keman

Burada bulunan daha süslü Fiddle

Golf değil, uzun bir atışla değil. Ayrıca Perlin Gürültü işlevi ve tohumlanmış Rastgele (her ikisi de Fiddle'a dahil, Perlin için gerekli tohumlanmış rastgele) gereklidir. Fiddle ayrıca sık kullanılanları takip etmek için mevcut tohumu görüntüler;)

function DoFlake(canvas){
    var width = canvas.width;
    var height = canvas.height;

    var ctx = canvas.getContext('2d');
    var thing = document.createElement('canvas'); thing.width = 128; thing.height = 32;
    var thingctx = thing.getContext('2d');
    var noise = new ImprovedPerlin((new Date()).getTime());

    var wDiv = 1/64;
    var y = 7/32;
    var z = 2/11;

    for(var x = 0; x < 128; x++){
        var h = 32 - (x * 32 / 128);
        h += 16 * noise.Noise(4 * x * wDiv, y, z);
        h += 8 * noise.Noise(8 * x * wDiv, y, z);
        h += 4 * noise.Noise(16 * x * wDiv, y, z);
        h += 2 * noise.Noise(32 * x * wDiv, y, z);
        h += 1 * noise.Noise(64 * x * wDiv, y, z);

        thingctx.fillRect(x, 0, 1, h);
    }

    ctx.translate(128,128);
    var angle = Math.PI / 3;
    for(var i = 0; i < 6; i++){
        ctx.rotate(angle);
        ctx.drawImage(thing, 0, 0);
        ctx.scale(1, -1)
        ctx.drawImage(thing, 0, 0);
        ctx.scale(1, -1);
    }
}

0

ZXSpectrum Basic, 21

6 katlı simetriyi yapamam, ama her türlü rastlantısallığı elde edebiliyorum

ZX Spectrum: Emulator Burada

Anahtar kelimelerin ZX Spektrumunda tek bir karakter olduğunu unutmayın

OVER 1
PLOT 40,40
DRAW 40,40,RND*5000

Bu komutları öykünücüye girmek için:

TAB ,1 ENTER
q 40,40 ENTER
w 40,40, TAB tCTRL+ B5000ENTER

(Sadece spektrum klavyesini sevmiyorsunuz)


Bu çalışmıyor. "B Tamsayı aralık dışında, 0: 1" çıktısı verir veya garip bir çörek şekli oluşturur.
Lars Ebert

spektrum koduyla ilgili kötü olan şey, grafiklerin bazen minimum ekran alanını aşmasıdır. Farklı desen ve şekiller elde etmek için çekilişteki 3. sayıyı değiştirin
SeanC
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.