임의의 눈송이를 시뮬레이트합시다


10

https://mathematica.stackexchange.com/ 에서이 질문 을 보았고 꽤 멋지다고 생각합니다. 다른 프로그래밍 언어로 눈송이를 만들어 봅시다.

이것은 원래 질문에서 인용 한 것입니다.

'계절이 다가오고 ... 그리고 Mathematica Stack Exchange에 대한 첫 번째 질문을 할 때가되었습니다. 자, 여기 그래픽 (및 P-Chem?) 전문가를위한 휴가 퀘스트가 있습니다.

(임의의) 눈송이를 생성하기위한 가장 좋은 코드는 무엇입니까? 무작위로 나는 실제 눈송이가 보여주는 다양성을 모방 할 다른 모양을 의미합니다. 아이디어를 얻을 수있는 링크는 다음과 같습니다. http://www.its.caltech.edu/~atomic/snowcrystals/ 보다 구체적으로 다른 유형의 눈송이는 다음과 같습니다 . /snowcrystals/class/class.htm . 여기서 우리는 하나의 눈송이를 만들려고합니다 (모양을 조정하기 위해 다른 매개 변수가있을 수 있음).보다 사실적이며 더 좋습니다. 반투명 도와 색상을 추가하기위한 3 차원 렌더링도 환영합니다. 환상을 불러 일으키고 평범한 프랙탈을 뛰어 넘으십시오!

규칙 :

  • 임의의 단일 눈송이를 생성하십시오.
  • 플레이크는 6 중 방사 대칭이어야합니다.
  • 현실적 일 필요는 없습니다. (하지만 선호)
  • *, ⚹, ❅, ❄, ❆와 같은 단일 문자 답변은 허용되지 않습니다.
  • 대부분의 공감대가 승리합니다!

3
와 같은 단일 문자 출력을 허용하지 않는 것이 '*⚹❅❄❆'[Math.floor(Math.random()*5)]좋습니다.
manatwork

1
@ nitro2k01 : 글의 첫 문장에서 정확한 mathematica.SE 사이트를 참조했다는 것을 알고 있습니까?
Kyle Kanos

어머 미안합니다. 나는 정직하게 규칙을 건너 뛰었다.
nitro2k01

답변:


14

배쉬와 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 기능과 시드 랜덤 (Fiddle에 포함, Perlin에 필요한 시드 랜덤)도 필요합니다. Fiddle은 즐겨 찾기를 추적하기 위해 현재 시드도 표시합니다.)

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

ZX 스펙트럼 베이직, 21

6 겹 대칭을 할 수는 없지만 모든 종류의 임의성을 얻을 수 있습니다

ZX Spectrum : Emulator Here 사용

키워드는 ZX 스펙트럼에서 단일 문자입니다.

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 out of range, 0 : 1"을 출력하거나 이상한 도넛 모양을 렌더링합니다.
Lars Ebert

스펙트럼 코드의 나쁜 점은 플롯이 때때로 최소 화면 공간을 초과한다는 것입니다. 다른 패턴과 모양을 얻기 위해 무승부에서 세 번째 숫자를 변경
SeanC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.