乔住在巴哈马。现在是冬天。他的孩子们对没有下雪感到失望。乔需要给他的孩子做雪。幸运的是,他有一台3D打印机。他计划用它制造雪花。不幸的是,他不知道雪花会是什么样子。事实上,他从来没有见过雪花!让我们帮助他创建一个程序,自动生成一个二维图像的雪花为他。
图像的直径(以像素为单位),图像的百分比,实际上是雪花。
具有规定直径的雪花的图像。它可以保存到文件中或显示给用户。
创建一个具有30度角的楔形。在楔形点创建一个带有初始种子的布朗树。将图像中心周围的楔形体反射12次,以生成图像的其余部分。雪花是白色的。背景颜色为黑色。
由于有不同的方法产生布朗树,得分是10 *的数目上升-高尔夫得分。
高尔夫得分被定义为程序中具有下列奖金的字节数:
-20%可以任意指定雪花的对称性。
-50%可以指定雪花的形状。(借能指明楔形体两侧长度的比例。)
最高分获胜。
下面是楔形的形状与比例约为2的图片:

记分牌:
马丁·布特纳: 10 * 14 - 409 = -269
尼米: 10 *1-733* .5 = -356.5
优化器: 10 *5- 648 = -598
胜利者是马丁-269分!
发布于 2014-12-26 01:02:40
{n,p}=Input[];m=999;Clear@f;_~f~_=0;0~f~0=1;r=RandomInteger;For[i=0,i<m,++i,For[x=m;y=0,f[x+1,y]+f[x-1,y]+f[x,y+1]+f[x,y-1]<1,a=b=-m;While[x+a<0||y+b<0||(y+b)/(x+a)>Tan[Pi/6],a=-r@1;b=r@2-1];x+=a;y+=b];x~f~y=1];Graphics[{White,g=Point/@Join@@{c=Cases[Join@@Table[{i,j}-1,{i,m},{j,m}],{i_,j_}/;i~f~j>0],c.{{1,0},{0,-1}}},Array[Rotate[g,Pi#/3,{0,0}]&,6]},Background->Black,ImageSize->n*p,ImageMargins->n(1-p)/2]未高尔夫球:
{n,p}=Input[];
m = 999;
ClearAll@f;
_~f~_ = 0;
0~f~0 = 1;
r = RandomInteger;
For[i = 0, i < m, ++i,
For[x = m; y = 0,
f[x + 1, y] + f[x - 1, y] + f[x, y + 1] + f[x, y - 1] < 1,
a = b = -m;
While[x + a < 0 || y + b < 0 || (y + b)/(x + a) > Tan[Pi/6],
a = -r@1;
b = r@2 - 1
];
x += a;
y += b
];
x~f~y = 1
];
Graphics[
{White, g =
Point /@
Join @@ {c =
Cases[Join @@ Table[{i, j} - 1, {i, m}, {j, m}], {i_, j_} /;
i~f~j > 0], c.{{1, 0}, {0, -1}}},
Array[Rotate[g, Pi #/3, {0, 0}] &, 6]},
Background -> Black,
ImageSize -> n*p,
ImageMargins -> n (1 - p)/2
]这需要输入表单{n,p},其中n是以像素为单位的图像大小,p是被雪花覆盖的图像的百分比。
用给定的参数生成雪花需要大约半分钟的时间。您可以通过将m的值从999更改为99来加快速度,但是结果看起来有点稀疏。同样,你也可以通过使用更大的数字来提高质量,但是这需要很长的时间。
我正在形成一个整数格上的布朗树,在{999, 0}上放置新的粒子,然后随机地向左移动,向上或向下移动(而不是向右),直到它们碰到现有的粒子。我也把运动限制在0到30度之间的楔形上。最后,我在x轴上反射这个楔形,并用它的5个旋转来显示它.
以下是一些结果(点击更大的版本):







以下是布朗树生长的两个动画(每帧10个粒子):


发布于 2014-12-23 22:32:36
接收文件f,其第一行是图像大小,第二行是片半径。每放置一个新的点,它就绕中心旋转12次。这创造了一个非常类似的效果旋转楔形,但不是完全相同的。
int d,w,h,k,l,o,p,x,y;
String n[] = loadStrings("f.txt");
d=Integer.parseInt(n[0]);
h=Integer.parseInt(n[1]);
size(d,d);
w=d/2;
k=l=(int)random(d);
background(0);
loadPixels();
o=p=0;
pixels[w*w*2+w]=color(255);
while(true)
{
o=k+(int)random(-2,2);
p=l+(int)random(-2,2);
if(p*d+o>d*d-1 || p*d+o<0 || o<0 || o>d){
k=l=(int)random(d);
}
else
{
if(pixels[p*d+o]==color(255))
{
p=l-w;
o=k-w;
if(o*o+p*p>h*h){break;}
float s,c;
for(int j=0;j<12;j++)
{
s=sin(PI*j/6);
c=cos(PI*j/6);
x=(int)((o*c)-(p*s));
y=(int)(((p*c)+(o*s)));
pixels[(int)(d*y+x+w+(w*d))]=color(255);
}
k=l=(int)random(d);
}
else
{
k=o;
l=p;
}
}
}
updatePixels(); 

您可以获得处理这里
https://codegolf.stackexchange.com/questions/42506
复制相似问题