ลองจำลองเกล็ดหิมะแบบสุ่ม


10

ฉันเห็นคำถามนี้ในhttps://mathematica.stackexchange.com/และฉันคิดว่ามันค่อนข้างเท่ห์ มาทำเกล็ดหิมะกันด้วยภาษาโปรแกรมอื่น ๆ

นี่คือคำพูดจากคำถามเดิม:

เป็นฤดูกาล ... และมันเป็นเวลาที่ฉันตั้งคำถามแรกของฉันใน Mathematica Stack Exchange ดังนั้นนี่คือภารกิจในวันหยุดสำหรับคุณด้านกราฟิก (และ P-Chem?)

อะไรคือรหัสที่ดีที่สุดสำหรับการสร้างเกล็ดหิมะแบบสุ่ม? โดยการสุ่มผมหมายถึงรูปร่างที่แตกต่างซึ่งจะเลียนแบบความหลากหลายที่แสดงโดยเกล็ดหิมะจริง นี่คือลิงค์สำหรับมีแนวคิด: http://www.its.caltech.edu/~atomic/snowcrystals/โดยเฉพาะอย่างยิ่งที่นี่เป็นเกล็ดหิมะประเภทต่างๆ: http://www.its.caltech.edu/~atomic /snowcrystals/class/class.htm ที่นี่เรากำลังพยายามสร้างเกล็ดหิมะเพียงอันเดียว (อาจมีพารามิเตอร์ที่แตกต่างกันเพื่อปรับรูปร่างของมัน) ยิ่งสมจริงยิ่งดี ภาพสามมิติสำหรับการเพิ่มความโปร่งแสงและสีก็ยินดีต้อนรับเช่นกัน ปลดปล่อยจินตนาการของคุณไปไกลกว่าเศษส่วนปกติ!

กฎ:

  • สร้างเกล็ดหิมะเดี่ยวแบบสุ่ม
  • เกล็ดควรเป็นสมมาตรรัศมีหกเท่า
  • มันไม่จำเป็นต้องเป็นจริง (แต่ชอบมากกว่า)
  • ไม่อนุญาตให้ใช้อักขระเดี่ยวเช่น *, ⚹, ❅, ❄, ❆
  • ผู้ชนะมากที่สุดชนะ!

3
'*⚹❅❄❆'[Math.floor(Math.random()*5)]ดีกว่าไม่อนุญาตเอาท์พุทตัวเดียวเช่น
จัดการ

1
@ nitro2k01: คุณรู้ว่าเขาอ้างถึงเว็บไซต์ mathematica.SE ที่แน่นอนในประโยคแรกของการโพสต์ใช่ไหม?
Kyle Kanos

อ๊ะขอโทษ ฉันข้ามไปอย่างถูกต้องกับกฎ
nitro2k01

คำตอบ:


14

Bash และ 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:

วิ่งตัวอย่าง:

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

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

ตัดต่อเกล็ดหิมะ


5

จาวาสคริ

ซอตั้งอยู่ที่นี่

ซอแฟนซีเพิ่มเติมตั้งอยู่ที่นี่

มันไม่ใช่การตีกอล์ฟไม่ใช่เป็นการยิงยาว จำเป็นต้องมีฟังก์ชัน Perlin Noise และ Seeded Random (ทั้งสองรวมอยู่ใน Fiddle, Random seed ที่จำเป็นสำหรับ Perlin) ซอยังแสดงเมล็ดปัจจุบันสำหรับการติดตามรายการโปรด;)

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 พื้นฐาน 21

ฉันไม่สามารถทำสมมาตรทั้ง 6 เท่าได้ แต่ฉันสามารถสุ่มได้ทุกประเภท

ใช้ ZX Spectrum: Emulator ที่นี่

โปรดจำไว้ว่าคำหลักเป็นอักขระเดียวใน ZX Spectrum

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

ในการป้อนคำสั่งเหล่านี้บนอีมูเลเตอร์:

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

(คุณไม่เพียงรักแป้นพิมพ์คลื่นความถี่)


สิ่งนี้ใช้ไม่ได้ มันสามารถแสดงผล "B Integer นอกขอบเขต, 0: 1" หรือแสดงรูปโดนัทแปลก ๆ
Lars Ebert

สิ่งที่ไม่ดีเกี่ยวกับรหัสคลื่นความถี่คือบางครั้งพล็อตอาจมีพื้นที่หน้าจอน้อยเกินไป เปลี่ยนหมายเลขที่ 3 ในการจับเพื่อให้ได้รูปแบบและรูปร่างที่แตกต่างกัน
SeanC
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.