ランダムな雪片をシミュレートしましょう


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次元レンダリングも歓迎します。ファンタジーを解き放ち、通常のフラクタルを超えてください!

ルール:

  • ランダムな単一の雪片を生成します。
  • フレークは6重の放射状対称である必要があります。
  • 現実的である必要はありません。(しかし好む)
  • *、⚹、❅、❄、❆などの1文字の回答は許可されません。
  • ほとんどの賛成票が勝ちます!

3
のような単一の文字出力を禁止します'*⚹❅❄❆'[Math.floor(Math.random()*5)]
manatwork 2013

1
@ nitro2k01:投稿の最初の文で、その正確な mathematica.SEサイトを参照していることにお気づきでしょうか?
Kyle

おっと、ごめんなさい。私は正直にルールをスキップしました。
nitro2k01 2013

回答:


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

Javascript

ここにあるフィドル

ここにあるより豪華なフィドル

ゴルフではなく、ロングショットではありません。また、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

ZXSpectrum Basic、21

さて、私は6回対称性を行うことはできませんが、あらゆる種類のランダム性を得ることができます

ZXスペクトラムを使用した:エミュレータをここに

キーワードはZXスペクトラムの単一の文字であることに注意してください

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

エミュレータでこれらのコマンドを入力するには:

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

(スペクトラムキーボードが好きではないですか)


これは動作しません。「B Integer out of range、0:1」を出力するか、奇妙なドーナツの形をレンダリングします。
Lars Ebert 2014

スペクトルコードの悪い点は、プロットが画面の最小スペースを超える場合があることです。引き分けの3番目の数字を変更して、さまざまなパターンと形状を取得する
SeanC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.