Processing绘制星空-1-随机生成静态星星

Processing绘制星空-1-随机生成静态星星

  • 最终效果
  • 参考示例汇总
  • 绘制星星
  • 总结与体会
  • 笔者的话

注:该篇博客只说明如何生成位置不变的星星,不包含下面效果图中的流星效果

最终效果

请调到电脑最大亮度观看
效果中强调随机:星星的位置随机、星星闪烁随机
在这里插入图片描述
局部图:
注:录屏中的蓝色圆圈是录屏软件自带的效果,与程序本身无关
在这里插入图片描述
最后的效果这里放上了动图,但是实际上的效果与这里有所不同,比如星星的颜色并不是白色,总之实际效果比动图美很多,如果你也能在电脑上跑一下源程序就能体会到。
截图如下:

在这里插入图片描述
参考示例

注:参考示例来自《代码本色》的第0章,也就是随机数的生成。(不感兴趣这些示例可以跳过这一块)

示例一
本示例主要展示了Processing如何使用Random产生随机数。以及用随机数作为运动轨迹。本项目参考其随机数生成。

//随机游走类,调用效果为随机在画布上画点
Class Walker{
  int x;
  int y;
  Walker()
  {
    x=width/2;
    y=height/2;
  }
  void display()
  {
    stroke(0);
    point(x,y);
  }
  void step()
  {
    if(choice==0)
    {
      x++;
    }else if(choice==1)
    {
      x--;
    }
    else if(choice==2)
    {
      y++;
    }else
    {
      y--;
    }
  }
}

示例二
本示例使用了Perlin噪声作为随机数产生的方法,同样是在画布随机画点,路线同直接用random产生的路线有很大区别。本项目参考其生成星星的位置。

Class Walker{
  int x;
  int y;
  Walker()
  {
   tx=0;
   ty=1000;
  }
  void display()
  {
    stroke(0);
    point(x,y);
  }
  void step()
  {
   x=map(noise(tx),0,1,0,width);
   y=map(noise(ty),0,1,0,height);
   
   tx+=0.01;
   ty+=0.01;
  }
}

绘制星星

1.绘制普通星星
绘制静态的星星是一件很简单的事情,用点来代表星星,只需要随机地在画布上画上规定数目的点即可。
为了使代码可复用性高,最好将星星封装成一个类。

class Stars
{
  int starsNum;//静态星星的数量
  int maxX;//星星的分布范围
  int maxY;
  
  Stars(int snum, int maxX,int maxY)
  {
     starsNum=snum;
     
   //初始化星空,随机生成星星
    int x,y;
    for (int i=0;i<starsNum;i++)
    {    
       x=int(random(maxX));//产生0-maxX范围内的整数
       y=int(random(maxY));
       point(x,y);//在(x,y)处画点
    }
  }
}

3.整理上述代码

  • 改进普通星星的随机生成方式,因为Random产生的随机位置分布是均匀的,而宇宙中的星星分布却是一片稀疏一片密集,所以参考示例,我们用Perlin噪声来构造伪随机数(有关Perlin噪声的介绍点击这里)模拟星星的分布。
   //初始化星空,随机生成星星
    int x,y;
    float xoff=0.0,yoff=10500.0;
    //给柏松噪声的参数,如果相等的话,
    //得到的坐标值会在一条直线上,所以初始值相差大一点
    for (int i=0;i<starsNum;i++)
    {    
    //柏松噪声noise根据参数得出的值在0,1之间,
    //我们需要通过map函数将0-1映射到0-画布大小
       x=int(map(noise(xoff),0,1,0,maxX+200));
       y=int(map(noise(yoff),0,1,0,maxY+0));
       point(x,y);
       //starsp[]数组保存普通星星的位置
       starsp[i]= new PVector(x, y);
       yoff+=30;
       xoff+=0.5;
    }
  • 给普通星星添加闪烁的效果,闪烁同样用到了随机数,这里的方法是随机产生一个0,50之间的整数,如果这个数大于48就将接下来画的那颗星星的颜色变成黑色的。
 //画普通星星
   for (int i=0;i<starsNum;i++)
   {
         //随机闪烁
        stroke(#888deb);
        int flag=int(random(50));
        if(flag>48)
        {
          stroke(#edccf7);
        }  
        point(starsp[i].x,starsp[i].y);
  }
  • 最后加上一些简单的细节,比如星星们的大小不同,但是以小的星星为主,流星的大小也是不一样的,这些基本上都是随机数的应用。

整个项目的完整代码在下一篇文章末尾

总结与体会

这里只是实现了位置不变的星星的生成,运行起来程序的效果还不错,星星也能一闪一闪的,但是为了视觉效果更加棒,加入流星的效果会更好。


笔者的话:
我个人还是非常喜欢这个画星空的小项目的,喜欢天空,也很喜欢星星
。(//▽//)。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值