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 相关文章推荐
javascript得到当前页的来路即前一页地址的方法
Feb 18 Javascript
jquery取子节点及当前节点属性值的方法
Sep 09 Javascript
JavaScript使用DeviceOne开发实战(四)仿优酷视频应用
Dec 02 Javascript
原生js封装的一些jquery方法(详解)
Sep 20 Javascript
深入理解bootstrap框架之入门准备
Oct 09 Javascript
BootStrap Tooltip插件源码解析
Dec 27 Javascript
vue中使用sessionStorage记住密码功能
Jul 24 Javascript
js中getter和setter用法实例分析
Aug 14 Javascript
element-ui 设置菜单栏展开的方法
Aug 22 Javascript
微信小程序提取公用函数到util.js及使用方法示例
Jan 10 Javascript
vue配置nprogress实现页面顶部进度条
Sep 21 Javascript
jQuery实现穿梭框效果
Jan 19 jQuery
小程序新版订阅消息模板消息
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中uploaded_files函数使用方法详解
2011/03/09 PHP
php实现过滤UBB代码的类
2015/03/12 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
2018/09/26 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
2019/06/05 PHP
关于Laravel-admin的基础用法总结和自定义model详解
2019/10/08 PHP
javascript 鼠标拖动图标技术
2010/02/07 Javascript
jquery关于页面焦点的定位(文本框获取焦点时改变样式 )
2010/09/10 Javascript
jQuery EasyUI API 中文文档 - Form表单
2011/10/06 Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
jquery插件开发注意事项小结
2013/06/04 Javascript
Node.js中的process.nextTick使用实例
2015/06/25 Javascript
JS组件系列之Bootstrap table表格组件神器【终结篇】
2016/05/10 Javascript
动态加载js、css的实例代码
2016/05/26 Javascript
JS与Ajax Get和Post在使用上的区别实例详解
2016/06/08 Javascript
jQuery焦点图左右转换效果
2016/12/12 Javascript
Node.js静态服务器的实现方法
2018/02/28 Javascript
Vue2.0生命周期的理解
2018/08/20 Javascript
解决vue同一slot在组件中渲染多次的问题
2018/09/06 Javascript
vue的列表交错过渡实现代码示例
2019/05/05 Javascript
Vue.js自定义指令学习使用详解
2019/10/19 Javascript
微信小程序实现锚点功能
2019/11/20 Javascript
VUE子组件向父组件传值详解(含传多值及添加额外参数场景)
2020/09/01 Javascript
python模块之StringIO使用示例
2015/04/08 Python
研究Python的ORM框架中的SQLAlchemy库的映射关系
2015/04/25 Python
python实现逻辑回归的方法示例
2017/05/02 Python
Python实现在某个数组中查找一个值的算法示例
2018/06/27 Python
Canvas引入跨域的图片导致toDataURL()报错的问题的解决
2018/09/19 HTML / CSS
linux面试题参考答案(8)
2016/04/19 面试题
高级人员简历的自我评价分享
2013/11/03 职场文书
总会计师岗位职责
2014/02/19 职场文书
乡镇三项教育实施方案
2014/03/30 职场文书
验房委托书
2014/08/30 职场文书
科学育儿宣传标语
2014/10/08 职场文书
个人求职意向书
2015/05/11 职场文书
律政俏佳人观后感
2015/06/09 职场文书
javaScript Array api梳理
2021/03/31 Javascript