Mari kita simulasikan kepingan salju acak

10

Saya melihat pertanyaan ini di https://mathematica.stackexchange.com/ dan saya pikir itu sangat keren. Mari kita buat kepingan salju dengan bahasa pemrograman lain.

Ini adalah kutipan dari pertanyaan awal:

'Ini musimnya ... Dan sudah saatnya saya mengajukan pertanyaan pertama saya di Mathematica Stack Exchange. Jadi, inilah perjalanan liburan bagi Anda para guru Grafik (dan P-Chem?).

Apa kode terbaik Anda untuk menghasilkan kepingan salju (acak)? Secara acak saya maksudkan dengan bentuk yang berbeda yang akan meniru keragaman yang ditunjukkan oleh kepingan salju nyata. Berikut ini tautan untuk memiliki gagasan: http://www.its.caltech.edu/~atomic/snowcrystals/ , lebih khusus di sini adalah berbagai jenis kepingan salju: http://www.its.caltech.edu/~atomic /snowcrystals/class/class.htm . Di sini kita mencoba untuk menghasilkan kepingan salju tunggal (mungkin dengan parameter yang berbeda untuk menyesuaikan bentuknya), semakin realistis, semakin baik. Renderings tiga dimensi, untuk menambahkan transparansi dan warna juga diterima. Lepaskan fantasi Anda, melampaui fraktal yang biasa!

Aturan:

  • Hasilkan kepingan salju tunggal acak.
  • Serpihannya harus simetri radial enam kali lipat.
  • Tidak perlu realistis. (Tapi lebih suka)
  • Jawaban karakter tunggal, seperti *, ⚹, ❅, ❄, ❆ tidak diperbolehkan.
  • Sebagian besar kemenangan menang!
pt2121
sumber
3
Lebih baik larang keluaran karakter tunggal seperti '*⚹❅❄❆'[Math.floor(Math.random()*5)].
manatwork
1
@ nitro2k01: Anda sadar bahwa dia mereferensikan situs Mathematica.SE itu tepat di kalimat pertama posting, bukan?
Kyle Kanos
Ups, maaf. Jujur saya melewatkan hak untuk aturan.
nitro2k01

Jawaban:

14

Bash dan 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:

Contoh dijalankan:

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

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

montase kepingan salju

manatwork
sumber
5

Javascript

Biola terletak di sini

Fiddle lebih mewah terletak di sini

Ini bukan golf, bukan dengan pukulan panjang. Juga diperlukan fungsi Perlin Noise dan Seeded Random (keduanya termasuk dalam Fiddle, seeded random diperlukan untuk Perlin). Fiddle juga menampilkan seed saat ini untuk melacak favorit;)

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);
    }
}
XNargaHuntress
sumber
0

ZXSpectrum Basic, 21

Yah, aku tidak bisa melakukan simetri 6 kali lipat, tapi aku bisa mendapatkan segala macam keacakan

menggunakan ZX Spectrum: Emulator Here

Ingat bahwa kata kunci adalah karakter tunggal dalam ZX Spectrum

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

Untuk memasukkan perintah ini pada emulator:

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

(Jangan suka keyboard spektrum)

SeanC
sumber
Ini tidak bekerja. Entah itu menghasilkan "B Integer di luar jangkauan, 0: 1" atau membuat beberapa bentuk donat aneh.
Lars Ebert
hal buruk tentang kode spektrum adalah bahwa plot terkadang melebihi jumlah ruang layar minimal. ubah angka ke-3 dalam undian untuk mendapatkan pola dan bentuk yang berbeda
SeanC