Hãy mô phỏng một bông tuyết ngẫu nhiên


10

Tôi đã thấy câu hỏi này trên https://mathIALa.stackexchange.com/ và tôi nghĩ nó khá tuyệt. Hãy tạo ra bông tuyết với các ngôn ngữ lập trình khác.

Đây là một trích dẫn từ câu hỏi ban đầu:

'Đây là mùa giải ... Và đã đến lúc tôi đặt câu hỏi đầu tiên của mình trên Mathicala Stack Exchange. Vì vậy, đây là một nhiệm vụ kỳ nghỉ cho bạn gurus Đồ họa (và P-Chem?).

Mã tốt nhất của bạn để tạo ra một bông tuyết (ngẫu nhiên) là gì? Ngẫu nhiên, ý tôi là với những hình dạng khác nhau sẽ bắt chước sự đa dạng được thể hiện bởi những bông tuyết thực sự. Đây là một liên kết để có một ý tưởng: http://www.its.caltech.edu/~atomic/snowcstall/ , cụ thể hơn ở đây là các loại bông tuyết khác nhau: http://www.its.caltech.edu/~atomic /snowcstall/ class / class.htm . Ở đây chúng tôi đang cố gắng tạo ra một bông tuyết duy nhất (có thể với các thông số khác nhau để điều chỉnh hình dạng của nó), càng thực tế, càng tốt. Kết xuất ba chiều, để thêm độ trong mờ và màu sắc cũng được chào đón. Giải phóng trí tưởng tượng của bạn, vượt ra ngoài các fractals thông thường!

Quy tắc:

  • Tạo một bông tuyết đơn ngẫu nhiên.
  • Flake phải là đối xứng xuyên tâm sáu lần.
  • Nó không cần phải thực tế. (Nhưng thích hơn)
  • Câu trả lời ký tự đơn, như *, ⚹, ❅,, không được phép.
  • Hầu hết các chiến thắng đều thắng!

3
Không cho phép đầu ra ký tự đơn như thế nào '*⚹❅❄❆'[Math.floor(Math.random()*5)].
manatwork 30/12/13

1
@ nitro2k01: bạn nhận ra rằng anh ấy đã tham khảo trang web mathicala.SE chính xác đó trong câu đầu tiên của bài đăng, phải không?
Kyle Kanos

Ối xin lỗi. Tôi thành thật bỏ qua các quy tắc.
nitro2k01

Câu trả lời:


14

Bash và 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:

Chạy mẫu:

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

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

dựng phim bông tuyết


5

Javascript

Fiddle nằm ở đây

Fiddle lạ mắt hơn nằm ở đây

Nó không phải là golf, không phải là một cú sút xa. Cũng cần có chức năng Tiếng ồn Perlin và Ngẫu nhiên được gieo hạt (cả hai được bao gồm trong Fiddle, được chọn ngẫu nhiên cần thiết cho Perlin). Fiddle cũng hiển thị hạt giống hiện tại để theo dõi các mục yêu thích;)

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 cơ bản, 21

Chà, tôi không thể làm đối xứng 6 lần, nhưng tôi có thể có được tất cả các loại ngẫu nhiên

sử dụng ZX Spectrum: Trình giả lập tại đây

Hãy nhớ rằng các từ khóa là một ký tự đơn trong Phổ ZX

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

Để nhập các lệnh này trên trình giả lập:

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

(Không phải bạn chỉ thích bàn phím quang phổ)


Điều này không hoạt động. Nó xuất ra "B Integer ngoài phạm vi, 0: 1" hoặc hiển thị một số hình dạng bánh rán lạ.
Lars Ebert

điều tồi tệ về mã phổ là các ô đôi khi vượt quá lượng không gian màn hình tối thiểu. thay đổi số thứ 3 trong bản vẽ để có được các mẫu và hình dạng khác nhau
SeanC
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.