javascript Canvas动态粒子连线


Posted in Javascript onJanuary 01, 2020

好久没写博客了,最近负责了公司年会的大屏签到、滚动抽奖、节目投票,整个项目做下来有惊也有喜。期间用到了Canvas制作动画,我这边就简单做了个动态粒子连线的例子与大家分享。

一、效果图

javascript Canvas动态粒子连线

二、思路如下:

1.绘制随机区域的粒子,记录每个粒子x轴、y轴坐标以及x轴与y轴每次移动的距离

2.通过定时函数使得粒子进行移动,移动后判断是否超过界限,超过则将该粒子删除并生成一个新的粒子

3.判断所有粒子之间的距离,对给定距离的粒子进行连线。

三、代码如下:

<!DOCTYPE html>
<html>
 <head>
 <meta charset="UTF-8">
 <title>Canvas动态粒子连线</title>
 </head>
 
 <body>
 <canvas id="myCanvas" style="border: 1px solid #ddd; display: block;margin: 20px auto;"></canvas>
 <script>
 var myCanvas = document.getElementById("myCanvas");
 myCanvas.width = "800";
 myCanvas.height = "800";
 var cxt = myCanvas.getContext("2d");
 cxt.fillStyle="#ddd";
 var points =new Array();
 //绘制60个粒子
 for(var i=0;i<60;i++)
 {
 drawlizi();
 }
 setInterval(movelizi,100);
 
 //绘制静态粒子
 function drawlizi(){
 var x = generate_random(3,797);
 var y = generate_random(3,797);
 var speedx = generate_random(-4,4);
 var speedy = generate_random(-4,4);
 //防止出现不移动的粒子
 while(speedx==0&&speedy==0)
 {
 speedx = generate_random(-4,4);
 speedy = generate_random(-4,4);
 }
 var point={
 x_index:x,
 y_index:y,
 x_speed:speedx,
 y_speed:speedy
 };
 points.push(point);
 cxt.beginPath();
 cxt.arc(x,y,3,0,360);
 cxt.closePath();
 cxt.fill();
 }
 
 //粒子移动
 function movelizi(){
 cxt.clearRect(0, 0,myCanvas.width,myCanvas.height);
 for(var i=0;i<points.length;i++)
 {
 points[i].x_index = points[i].x_index+points[i].x_speed;
 points[i].y_index = points[i].y_index+points[i].y_speed;
 cxt.beginPath();
 cxt.arc(points[i].x_index,points[i].y_index,3,0,360);
 cxt.closePath();
 cxt.fill();
 //判断超过界限删除并再生
 if((points[i].x_index<3||points[i].y_index<3)||(points[i].x_index>797||points[i].y_index<3)||(points[i].x_index<3||points[i].y_index>797)||(points[i].x_index>797||points[i].y_index>797)){
 points.splice(i,1);
 drawlizi();
 }
 }
 //相近的粒子进行连线
 for (var i=0;i<points.length;i++) {
 for (var j=0;j<points.length;j++) {
 if(i!=j)
 {
 var one_x = points[i].x_index;
 var one_y = points[i].y_index;
 var two_x = points[j].x_index;
 var two_y = points[j].y_index;
 // 根据两点间的距离公式,小于界限值便进行连线
 var jl = Math.sqrt(Math.pow(one_x-two_x,2)+Math.pow(one_y-two_y,2));
 if(jl<100)
 {
 cxt.strokeStyle="#ddd";
 cxt.moveTo(one_x,one_y);
 cxt.lineTo(two_x,two_y);
 cxt.stroke();
 }
 }
 }
 }
 }
 //生成两个数之间的随机数
 function generate_random(min,max){
 return Math.floor(Math.random()*(max-min)+min);
 } 
 </script>
 </body>
 
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS 实现导航栏悬停效果(续2)
Sep 24 Javascript
详解JavaScript的AngularJS框架中的表达式与指令
Mar 05 Javascript
BootStrap 智能表单实战系列(二)BootStrap支持的类型简介
Jun 13 Javascript
原生JS实现圣旨卷轴展开效果
Mar 06 Javascript
vue引入swiper插件的使用实例
Jul 19 Javascript
Bootstrap4如何定制自己的颜色和风格
Feb 26 Javascript
Vue中父子组件通讯之todolist组件功能开发
May 21 Javascript
webpack开发环境和生产环境的深入理解
Nov 08 Javascript
layui实现三级联动效果
Jul 26 Javascript
微信小程序 子级页面返回父级并把子级参数带回父级实现方法
Aug 22 Javascript
基于Vue sessionStorage实现保留搜索框搜索内容
Jun 01 Javascript
vue-路由精讲 二级路由和三级路由的作用
Aug 06 Javascript
小程序新版订阅消息模板消息
Dec 31 #Javascript
小程序实现长按保存图片的方法
Dec 31 #Javascript
使用webpack搭建vue环境的教程详解
Dec 31 #Javascript
Vue 实现显示/隐藏层的思路(加全局点击事件)
Dec 31 #Javascript
TypeScript之调用栈的实现
Dec 31 #Javascript
Vue通过配置WebSocket并实现群聊功能
Dec 31 #Javascript
Vue实现剪贴板复制功能
Dec 31 #Javascript
You might like
php自动加载机制的深入分析
2013/06/08 PHP
php通过记录IP来防止表单重复提交方法分析
2014/12/16 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
2017/05/05 PHP
实例分析PHP将字符串转换成数字的方法
2019/01/27 PHP
DLL+ ActiveX控件+WEB页面调用例子
2010/08/07 Javascript
Javascript实现动态菜单添加的实例代码
2013/07/05 Javascript
jquery分页插件jpaginate在IE中不兼容问题
2014/04/22 Javascript
angularjs的一些优化小技巧
2014/12/06 Javascript
jquery限定文本框只能输入数字(整数和小数)
2016/01/08 Javascript
JavaScript6 let 新语法优势介绍
2016/07/15 Javascript
jQuery中的deferred使用方法
2017/03/27 jQuery
js脚本编写简单刷票投票系统
2017/06/27 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
node实现定时发送邮件的示例代码
2017/08/26 Javascript
微信小程序实现搜索功能
2020/03/10 Javascript
Vue 根据条件判断van-tab的显示方式
2020/08/03 Javascript
JavaScript array常用方法代码实例详解
2020/09/02 Javascript
JS相册图片抖动放大展示效果的示例代码
2021/01/29 Javascript
Python使用MONGODB入门实例
2015/05/11 Python
python类装饰器用法实例
2015/06/04 Python
Python实现将json文件中向量写入Excel的方法
2018/03/26 Python
python修改list中所有元素类型的三种方法
2018/04/09 Python
Python面向对象程序设计之继承与多继承用法分析
2018/07/13 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
2020/09/22 Python
基于python实现查询ip地址来源
2020/06/02 Python
目前不被任何主流浏览器支持的CSS3属性汇总
2014/07/21 HTML / CSS
音乐专业应届生教师求职信
2013/11/04 职场文书
应届毕业生自我鉴定范文
2013/12/27 职场文书
创业计划书撰写原则
2014/01/25 职场文书
关于圣诞节的广播稿
2014/01/26 职场文书
最经典的大学生职业生涯规划范文
2014/03/05 职场文书
歌颂祖国的演讲稿
2014/05/04 职场文书
安全口号大全
2014/06/21 职场文书
我的梦想演讲稿500字
2014/08/21 职场文书
表彰大会新闻稿
2015/07/17 职场文书
小学毕业感言200字
2015/07/30 职场文书