首页
学习
活动
专区
圈层
工具
发布

画雪花
EN

Code Golf用户
提问于 2014-12-18 19:58:36
回答 2查看 5K关注 0票数 18

乔住在巴哈马。现在是冬天。他的孩子们对没有下雪感到失望。乔需要给他的孩子做雪。幸运的是,他有一台3D打印机。他计划用它制造雪花。不幸的是,他不知道雪花会是什么样子。事实上,他从来没有见过雪花!让我们帮助他创建一个程序,自动生成一个二维图像的雪花为他。

输入

图像的直径(以像素为单位),图像的百分比,实际上是雪花。

输出

具有规定直径的雪花的图像。它可以保存到文件中或显示给用户。

Specifications

创建一个具有30度角的楔形。在楔形点创建一个带有初始种子的布朗树。将图像中心周围的楔形体反射12次,以生成图像的其余部分。雪花是白色的。背景颜色为黑色。

评分

由于有不同的方法产生布朗树,得分是10 *的数目上升-高尔夫得分。

高尔夫得分被定义为程序中具有下列奖金的字节数:

-20%可以任意指定雪花的对称性。

-50%可以指定雪花的形状。(借能指明楔形体两侧长度的比例。)

最高分获胜。

下面是楔形的形状与比例约为2的图片:

记分牌:

马丁·布特纳: 10 * 14 - 409 = -269

尼米: 10 *1-733* .5 = -356.5

优化器: 10 *5- 648 = -598

胜利者是马丁-269分!

EN

回答 2

Code Golf用户

回答已采纳

发布于 2014-12-26 01:02:40

Mathematica,409字节

代码语言:javascript
复制
{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]

未高尔夫球:

代码语言:javascript
复制
{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个粒子):

票数 16
EN

Code Golf用户

发布于 2014-12-23 22:32:36

处理2- 575字符

接收文件f,其第一行是图像大小,第二行是片半径。每放置一个新的点,它就绕中心旋转12次。这创造了一个非常类似的效果旋转楔形,但不是完全相同的。

代码语言:javascript
复制
  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(); 

您可以获得处理这里

票数 0
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/42506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档