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);
}
- 最后加上一些简单的细节,比如星星们的大小不同,但是以小的星星为主,流星的大小也是不一样的,这些基本上都是随机数的应用。
总结与体会
这里只是实现了位置不变的星星的生成,运行起来程序的效果还不错,星星也能一闪一闪的,但是为了视觉效果更加棒,加入流星的效果会更好。