让我们模拟一个随机的雪花


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)]
manatwork 2013年

1
@ nitro2k01:您意识到他在发布的第一句话中引用了确切的 mathematica.SE网站,对吗?
凯尔·坎诺斯

哎呀,对不起。老实说,我没有遵守规则。
nitro2k01 2013年

Answers:


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

Java脚本

小提琴位于这里

更多花哨的小提琴位于这里

它不是打高尔夫球,不是远距离射击。还需要Perlin Noise函数和种子随机数(均包含在Fiddle中,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 Basic,21岁

好吧,我不能做6折对称,但是我可以得到各种各样的随机性

使用ZX Spectrum:此处为模拟器

请记住,关键字是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”,要么呈现一些奇怪的甜甜圈形状。
拉尔斯·艾伯特

频谱代码的坏处在于,绘图有时会超出最小的屏幕空间。更改抽奖中的第3个数字以获取不同的图案和形状
SeanC 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.