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 相关文章推荐
求解开jscript.encode代码的asp函数
Feb 28 Javascript
javascript中最常用的继承模式 组合继承
Aug 12 Javascript
javascript 事件绑定问题
Jan 01 Javascript
jquery为页面增加快捷键示例
Jan 31 Javascript
jQuery使用attr()方法同时设置多个属性值用法实例
Mar 26 Javascript
鼠标经过子元素触发mouseout,mouseover事件的解决方案
Jul 26 Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
Aug 24 Javascript
基于jQuery的ajax方法封装
Jul 14 Javascript
BootstrapValidator实现注册校验和登录错误提示效果
Mar 10 Javascript
Vue中使用vux的配置详解
May 05 Javascript
vue+elementUI(el-upload)图片压缩,默认同比例压缩操作
Aug 10 Javascript
React冒泡和阻止冒泡的应用详解
Aug 18 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基于反射机制实现插件的可插拔设计详解
2016/11/10 PHP
PHP输出多个元素的排列或组合的方法
2017/03/14 PHP
PHP PDO数据库操作预处理与注意事项
2019/03/16 PHP
php简单检测404页面的方法示例
2019/08/23 PHP
阿里对象存储OSS在laravel框架中的使用方法
2019/10/13 PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
2020/04/22 PHP
toggle()隐藏问题的解决方法
2014/02/17 Javascript
javascript设计模式之解释器模式详解
2014/06/05 Javascript
2014 HTML5/CSS3热门动画特效TOP10
2014/12/07 Javascript
js实现无限级树形导航列表效果代码
2015/09/23 Javascript
JavaScript代码实现禁止右键、禁选择、禁粘贴、禁shift、禁ctrl、禁alt
2015/11/17 Javascript
常常会用到的截取字符串substr()、substring()、slice()方法详解
2015/12/16 Javascript
JavaScript入门系列之知识点总结
2016/03/24 Javascript
Bootstrap零基础学习第一课之模板
2016/07/18 Javascript
BootStrap整体框架之基础布局组件
2016/12/15 Javascript
JavaScript和jQuery制作光棒效果
2017/02/24 Javascript
详解Vue中watch对象内属性的方法
2019/02/01 Javascript
layui的表单提交以及验证和修改弹框的实例
2019/09/09 Javascript
详解JavaScript编程中的window与window.screen对象
2015/10/26 Python
解决Ubuntu pip 安装 mysql-python包出错的问题
2018/06/11 Python
python统计中文字符数量的两种方法
2019/01/31 Python
pybind11和numpy进行交互的方法
2019/07/04 Python
python 操作mysql数据中fetchone()和fetchall()方式
2020/05/15 Python
python实现启动一个外部程序,并且不阻塞当前进程
2020/12/05 Python
美国诺德斯特龙百货官网:Nordstrom
2016/08/23 全球购物
德国最大的拼图在线商店:Puzzle.de
2016/12/17 全球购物
Monnier Freres中文官网:法国领先的奢侈品配饰在线零售商
2017/11/01 全球购物
某公司的.net工程师面试题笔试题
2013/11/22 面试题
学习新党章思想汇报
2014/01/09 职场文书
委托协议书范本
2014/04/22 职场文书
机电专业毕业生求职信
2014/07/01 职场文书
2014全年工作总结
2014/11/27 职场文书
送达通知书
2015/04/25 职场文书
Windows10下安装MySQL8
2021/04/06 MySQL
Pytorch DataLoader shuffle验证方式
2021/06/02 Python
mybatis 解决从列名到属性名的自动映射失败问题
2021/06/30 Java/Android