Processing绘制星空-2-绘制流星

工具:processing3.5
静态星星的绘制原理参考上篇

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

前言

就这个项目而言不要再求源代码到邮箱了,认真看看博文吧,我有将项目完整代码都贴在文章末尾,可是还是有很多人直接要项目源码,问的人多了有些不开心,我不想断言你这样直接要代码的用途,但是希望看官尊重文章内容,不做伸手党,谢谢~

最终效果

请调到电脑最大亮度观看


局部:

最后的效果这里放上了动图,但是实际上的效果与这里有所不同,比如星星的颜色并不是白色,总之实际效果比动图美很多,如果你也能在电脑上跑一下源程序就能体会到。
截图如下:


参考示例汇总

参考示例来自《代码本色》的第1章,也就是向量的应用。(不感兴趣这些示例可以跳过这一块)

示例一
本示例主要展示了给物体添加速度以及简单运动模糊的实现。本项目参考其实现流星的运动和流星的运动模糊。

// The Nature of Code
// Daniel Shiffman
// http://natureofcode.com// Example 1-2: Bouncing Ball, with PVector!
PVector position;
PVector velocity;void setup() {size(200,200);background(255);position = new PVector(100,100);velocity = new PVector(2.5,5);
}void draw() {noStroke();fill(255,20);rect(0,0,width,height);// Add the current speed to the position.position.add(velocity);if ((position.x > width) || (position.x < 0)) {velocity.x = velocity.x * -1;}if ((position.y > height) || (position.y < 0)) {velocity.y = velocity.y * -1;}// Display circle at x positionstroke(0);fill(175);ellipse(position.x,position.y,16,16);
}

运行效果:

示例二

本示例主要参考向量的更新,也就是从一边屏幕消失,从另一边屏幕中出现。在本程序中不断对物体的位置进行更新、判断,当物体的位置超出了画布范围,就将物体的挪动到画布的另一边,具体就是初始化坐标为0,或者为画布长宽。

绘制流星时也用到这个思想。

// The Nature of Code
// Daniel Shiffman
// http://natureofcode.comMover mover;void setup() {size(640,360);mover = new Mover();
}void draw() {background(255);mover.update();mover.checkEdges();mover.display();
}
// The Nature of Code
// Daniel Shiffman
// http://natureofcode.comclass Mover {PVector position;PVector velocity;Mover() {position = new PVector(random(width), random(height));velocity = new PVector(random(-2, 2), random(-2, 2));}void update() {position.add(velocity);}void display() {stroke(0);strokeWeight(2);fill(127);ellipse(position.x, position.y, 48, 48);}void checkEdges() {if (position.x > width) {position.x = 0;} else if (position.x < 0) {position.x = width;}if (position.y > height) {position.y = 0;} else if (position.y < 0) {position.y = height;}}
}

运行效果:
注:黄色圆圈为录屏软件所自带,并不是程序运行的效果。

绘制流星

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

class Stars
{int starsNum;//静态星星的数量int maxX;//星星的分布范围int maxY;Stars(int num,int maxX,int maxY){meteorNum=num;starsNum=5000;//初始化星空,随机生成星星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)处画点}}
}

2.绘制流星
流星=星星+速度+“尾巴”
分析:
流星的速度以及方向:
每次在draw函数绘制星星时将星星的坐标加上一个固定的值使得(x,y)变成(x+tx,y+ty),便可以使得星星运动起来。
代码如下,position数组存放流星的位置和方向(x,y),velocity数组就是控制方向和速度的向量(tx,ty)

     for (int i=0;i<meteorNum;i++){position[i].add(velocity[i]);//向量相加}

流星的拖尾:
星星走过的路线本来是全亮的,在画面上展示出来就是一条白色的直线,但是我们可以通过使得星星先走过的路线先变黑来形成拖尾的效果。在每一帧刷新的时候画上一个大小为画布尺寸的矩形,用有透明度的黑色填充矩形。效果可由下面一张图片来表示:
是不是看起来像一条向右边运动的流星?
代码如下,写在draw函数里面。

  fill(0,18);//颜色为黑色,透明度为18rect(0,0,width,height);

边界判断:
流星超出画布范围的时候应该把流星的位置初始化。
代码如下,position数组存放的是流星的位置。

void checkEdges()
{for (int i=0;i<meteorNum;i++){if (position[i].x > width) {position[i].x = 0;} else if (position[i].x < 0){position[i].x = width;}if (position[i].y > height){position[i].y = 0;} else if (position[i].y < 0) {position[i].y = height;}}
}
  • 最后加上一些简单的细节,比如星星们的大小不同,但是以小的星星为主,流星的大小也是不一样的,这些基本上都是随机数的应用。下面放上整个项目的完整代码:
    两个文件
    1.drawStars.pde
Stars myStars;void setup()
{size(1920,1080);//流星数量30颗,普通星星5000颗,画布大小1920*1080myStars=new Stars(30,5000,1920,1080);}void draw()
{fill(0,18);//颜色为黑色,透明度为18rect(0,0,width,height);myStars.update();myStars.checkEdges();myStars.display();}

2.Stars.pde

class Stars
{int starsNum;//静态星星的数量int maxX;//星星的分布范围int maxY;PVector []starsp;//星星的位置int meteorNum;//流星的数量PVector []position;//流星的位置PVector []velocity;//流星的速度Stars(int num1,int num2,int maxX,int maxY){meteorNum=num1;starsNum=num2;starsp=new PVector[starsNum];position=new PVector[meteorNum];//流星的位置velocity=new PVector[meteorNum];//控制流星的向量//初始化星空,随机生成星星int x,y;float xoff=0.0,yoff=10500.0;for (int i=0;i<starsNum;i++){    x=int(map(noise(xoff),0,1,0,maxX+200));y=int(map(noise(yoff),0,1,0,maxY+0));point(x,y);starsp[i]= new PVector(x, y);yoff+=30;xoff+=0.5;}//随机生成流星初始位置for (int i=0;i<meteorNum;i++){x=int(random(maxX));y=int(random(maxY));position[i]=new PVector(x,y);x=int(random(1.0,2.0));y=int(random(1.0,2.0));velocity[i]= new PVector(x, y);}}void display(){//画流星stroke(#edccf7);for (int i=0;i<meteorNum;i++){if (i>meteorNum/2){point(position[i].x, position[i].y);}else{float size=random(0.5);ellipse(position[i].x, position[i].y,size, size);    }}//画普通星星for (int i=0;i<starsNum;i++){if (i%20==0)//每隔20颗,画一个大小随机的星星{stroke(#edccf7);int flag=int(random(50));float size=random(1);if(flag>48){stroke(#edccf7);}ellipse(starsp[i].x,starsp[i].y,size, size);}else//画大小为一个点的星星{//随机闪烁stroke(#888deb);int flag=int(random(50));if(flag>48){stroke(#edccf7);}point(starsp[i].x,starsp[i].y);}}}void update(){for (int i=0;i<meteorNum;i++){position[i].add(velocity[i]);}}void checkEdges()
{  //检查边界for (int i=0;i<meteorNum;i++){if (position[i].x > width) {position[i].x = 0;} else if (position[i].x < 0){position[i].x = width;}if (position[i].y > height){position[i].y = 0;} else if (position[i].y < 0) {position[i].y = height;}}
}
}

总结与体会

画一个简单的星空并不难,而且通过画星空的方式将一些看似枯燥的数学原理变的生动了起来。在这个项目中我其实有试过给流星添加加速度,流星就会变的有点像雨滴,这也是很有意思的变化,也许以后可以拓展。


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

Processing绘制星空-2-绘制流星相关推荐

  1. 用python画星空-【Python】手把手教你绘制星空旅游线路图

    0 前言 5月是美国的毕业季,我家领导也即将毕业了,我们将在美国进行为期两周的毕业旅行.其实类似这样的航线图我以前也用PPT绘制过,给领导用于发朋友圈,虽然总体能表达出意思,但是效果不能让自己满意,见 ...

  2. 用python画星空的代码简单-【Python】手把手教你绘制星空旅游线路图

    0 前言 5月是美国的毕业季,我家领导也即将毕业了,我们将在美国进行为期两周的毕业旅行.其实类似这样的航线图我以前也用PPT绘制过,给领导用于发朋友圈,虽然总体能表达出意思,但是效果不能让自己满意,见 ...

  3. canvas绘制星空(起手篇)

    无图不欢,先上图 <!DOCTYPE html> <html><head><meta name="keywords" content=&q ...

  4. vue中使用three绘制星空效果

    文章目录 一.Three.js 是什么? 二.使用步骤 1.引入库 2.开始绘制星空 总结 关于使用three绘制星空效果的记录 一.Three.js 是什么? Three.js 是一款运行在浏览器中 ...

  5. python绘制星空(菜鸟级)

    设计知识点:使用turtle绘图库与random库产生一个范围随机数完成绘制. 编译环境:anaconda-spyder 比较通俗,就不搞注释了,懒得写,废话不多说,直接上代码: #绘制星空 impo ...

  6. html制作星空,HTML5绘制星空

    HTML5绘制一个很丑的星空 canvas{display: block;border:1px dotted skyblue;} HTML5绘制星空 var nimo={}; window.οnlοa ...

  7. html5 绘制图形,HTML5绘制几何图形

    绘制几何图形 var canvas = document.getElementById("myCanvas"); var ctx = canvas.getContext(" ...

  8. 【OpenGL】十一、OpenGL 绘制多个点 ( 绘制单个点 | 绘制多个点 )

    文章目录 一.绘制单个点 二.绘制多个点 三.相关资源 在上一篇博客 [OpenGL]十.OpenGL 绘制点 ( 初始化 OpenGL 矩阵 | 设置投影矩阵 | 设置模型视图矩阵 | 绘制点 | ...

  9. OPenGL实例化绘制、普通绘制说明

    OpenGL 实例化(Instancing)是一种只调用一次渲染函数就能绘制出不少物体的技术,能够实现将数据一次性而不是多次发送给 GPU ,告诉 OpenGL使用一个绘制函数,将这些数据绘制成多个物 ...

  10. python turtle绘制柱状图_python绘制图形(Turtle模块)

    用python的Turtle模块可以绘制很多精美的图形,下面简单介绍一下使用方法. 需要用到的工具有python,python 的安装这里就不再细说.自行搜索. from turtle import ...

最新文章

  1. [转]文件传输协议(FTP)操作(上传,下载,新建,删除,FTP间传送文件等)实现汇总1
  2. CentOS PPTP ×××
  3. 200米外遥测心跳确定身份,五角大楼全新黑科技,比人脸识别更准、伪装也没用...
  4. android自动创建桌面,Android应用启动后自动创建桌面快捷方式的实现方法
  5. IIC原理及简单流程
  6. Exchange2003配置垃圾邮件实时黑名单RBL
  7. CentOS 7.0变动
  8. 萌宠历险记html5游戏在线玩,《神武2》天外魔境现世 萌宠历险记首发
  9. php mysql while循环,PHP_MySQL教程-第二天while循环与数据库操作第2/2页
  10. 一位 女生在第一次应聘软件开发工作时成功被淘汰的例子
  11. Java SAO操作-使用lambda代替字符串
  12. mysql for 循环删除_Java增强for循环中删除元素抛异常问题
  13. “极速交易”正在证券业兴起
  14. DIY手动定制一个属于自己的软件安装管理器工具盘[一]
  15. 全国首个NB-IoT规模化商用 - BC95模块
  16. python re模块findall_python re模块findall()函数实例解析
  17. HTTP接口测试代码,HTTP GET/POST模拟请求测试工具
  18. JNI中创建新的线程回调java方法的技巧
  19. html上传后门,网站查后门软件 WebShellKiller
  20. word停止工作 怎么解决

热门文章

  1. Notepad++ 一键格式化php代码
  2. 推广TrustAI可信分析:通过提升数据质量来增强在ERNIE模型下性能
  3. 杭州异地身份证办理条件以及材料
  4. (已解决)vue数组添加数据后页面无法实时渲染
  5. QQ空间导出助手插件
  6. Blackberry上网问题解决方案
  7. Revealing the Invisible with Model and Data Shrinking for Composite-database Micro-expression Recogn
  8. 高拍仪拍照SDK开发(良田影像S300L|S500L)
  9. 手机RAM、ROM和储存卡的那些事
  10. CDN百科 | APP崩了和CDN有关系吗?