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 相关文章推荐
基于jquery实现的鼠标滑过按钮改变背景图片
Jul 15 Javascript
深入理解JavaScript系列(15) 函数(Functions)
Apr 12 Javascript
js取模(求余数)隔行变色
May 15 Javascript
javascript实现俄罗斯方块游戏的思路和方法
Apr 27 Javascript
javascript中DOM复选框选择用法实例
May 14 Javascript
JavaScript判断浏览器及其版本信息
Jan 20 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
Jun 29 jQuery
浅析JS中什么是自定义react数据验证组件
Oct 19 Javascript
微信小程序实现复选框效果
Dec 28 Javascript
layui插件表单验证提交触发提交的例子
Sep 09 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
Dec 02 Javascript
Vue中强制组件重新渲染的正确方法
Jan 03 Vue.js
小程序新版订阅消息模板消息
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 URL编码解码函数代码
2009/03/10 PHP
PHP截取指定图片大小的方法
2014/12/10 PHP
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
2012/01/15 Javascript
浅谈关于JavaScript的语言特性分析
2013/04/11 Javascript
js实现页面转发功能示例代码
2013/08/05 Javascript
document.getElementById获取控件对象为空的解决方法
2013/11/20 Javascript
清除div下面的所有标签的方法
2014/02/17 Javascript
JS获取图片lowsrc属性的方法
2015/04/01 Javascript
JS返回iframe中frameBorder属性值的方法
2015/04/01 Javascript
js实现动态加载脚本的方法实例汇总
2015/11/02 Javascript
逐一介绍Jquery data()、Jquery stop()、jquery delay()函数(详)
2015/11/04 Javascript
window.location.hash知识汇总
2015/11/09 Javascript
jQuery操作基本控件方法实例分析
2015/12/31 Javascript
基于jQuery实现鼠标点击导航菜单水波动画效果附源码下载
2016/01/06 Javascript
javascript事件绑定学习要点
2016/03/09 Javascript
jQuery通过deferred对象管理ajax异步
2016/05/20 Javascript
JS中mouseup事件丢失的原因与解决办法
2017/06/14 Javascript
详解nuxt路由鉴权(express模板)
2018/11/21 Javascript
简单了解JavaScript中的执行上下文和堆栈
2019/06/24 Javascript
vue实现标签云效果的方法详解
2019/08/28 Javascript
vue监听dom大小改变案例
2020/07/29 Javascript
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
两个使用Python脚本操作文件的小示例分享
2015/08/27 Python
Python文件和流(实例讲解)
2017/09/12 Python
Python基于TCP实现会聊天的小机器人功能示例
2018/04/09 Python
Django中使用Whoosh进行全文检索的方法
2019/03/31 Python
python语言基本语句用法总结
2019/06/11 Python
Pytorch加载部分预训练模型的参数实例
2019/08/18 Python
纯CSS3实现扇形动画菜单(简化版)实例源码
2017/01/17 HTML / CSS
Html5原创俄罗斯方块(基于canvas)
2019/01/07 HTML / CSS
专科毕业生学习生活的自我评价
2013/10/26 职场文书
大学生的应聘自我评价
2013/12/13 职场文书
模特职业生涯规划范文
2014/02/26 职场文书
员工团队活动方案
2014/08/28 职场文书
python 网络编程要点总结
2021/06/18 Python
浅谈Redis 中的过期删除策略和内存淘汰机制
2022/04/03 Redis